API REST desarrollada en .NET 8 con Clean Architecture para gestionar usuarios y sus razas de gatos favoritas.
El proyecto sigue los principios de Clean Architecture con separación de responsabilidades en 4 capas:
cat-breeds-backend/
├── Domain/ # Capa de dominio (entidades y contratos)
│ ├── Entities/
│ │ └── User.cs # Entidad de dominio User
│ └── Interfaces/
│ └── IUserRepository.cs
│
├── Application/ # Capa de aplicación (casos de uso)
│ ├── DTOs/
│ │ ├── AuthResponse.cs
│ │ ├── LoginRequest.cs
│ │ └── RegisterRequest.cs
│ ├── Interfaces/
│ │ ├── IAuthService.cs
│ │ ├── IJwtService.cs
│ │ └── IPasswordService.cs
│ └── Services/
│ └── AuthService.cs # Lógica de negocio
│
├── Infrastructure/ # Capa de infraestructura (implementaciones)
│ ├── Configuration/
│ │ ├── JwtSettings.cs
│ │ └── MongoDbSettings.cs
│ ├── Persistence/
│ │ └── UserRepository.cs # Implementación MongoDB
│ ├── Security/
│ │ ├── JwtService.cs # Generación de tokens JWT
│ │ └── PasswordService.cs # Hash de contraseñas
│ └── DependencyInjection.cs
│
└── Api/ # Capa de presentación (API)
├── Controllers/
│ └── UsersController.cs
├── Program.cs
└── appsettings.json
- Domain: Sin dependencias (núcleo de la aplicación)
- Application: Depende de Domain
- Infrastructure: Depende de Domain y Application
- Api: Depende de Application e Infrastructure
- .NET 8: Framework principal
- MongoDB: Base de datos NoSQL
- JWT: Autenticación basada en tokens
- BCrypt: Hash seguro de contraseñas
- Swagger/OpenAPI: Documentación de API
MongoDB.Driver(3.5.2)BCrypt.Net-Next(4.0.3)Microsoft.AspNetCore.Authentication.JwtBearer(8.0.*)System.IdentityModel.Tokens.Jwt(8.0.*)
Asegúrate de tener MongoDB ejecutándose localmente o actualiza la cadena de conexión en appsettings.json:
"MongoDbSettings": {
"ConnectionString": "mongodb://localhost:27017",
"DatabaseName": "CatBreedsDb",
"UsersCollectionName": "users"
}Configura la clave secreta JWT en appsettings.json (cambia el secreto en producción):
"JwtSettings": {
"Secret": "YourSecretKeyHere-ChangeThisToASecureRandomString-MinimumLength32Characters",
"Issuer": "CatBreedsApi",
"Audience": "CatBreedsApp",
"ExpirationInMinutes": 1440
}Registra un nuevo usuario.
Request Body:
{
"email": "user@example.com",
"name": "John Doe",
"favoriteBreed": "Persian",
"avatar": "😺",
"password": "password123"
}Response:
{
"token": "eyJhbGciOiJIUzI1NiIs...",
"user": {
"id": "507f1f77bcf86cd799439011",
"email": "user@example.com",
"name": "John Doe",
"favoriteBreed": "Persian",
"avatar": "😺"
}
}Autentica un usuario existente.
Request Body:
{
"email": "user@example.com",
"password": "password123"
}Response:
{
"token": "eyJhbGciOiJIUzI1NiIs...",
"user": {
"id": "507f1f77bcf86cd799439011",
"email": "user@example.com",
"name": "John Doe",
"favoriteBreed": "Persian",
"avatar": "😺"
}
}dotnet build CatBreedsApi.slncd Api
dotnet runLa API estará disponible en:
- HTTPS:
https://localhost:7xxx - HTTP:
http://localhost:5xxx - Swagger UI:
https://localhost:7xxx/swagger
- Las contraseñas se almacenan hasheadas con BCrypt
- Autenticación JWT con firma HMAC-SHA256
- CORS configurado para permitir peticiones desde
http://localhost:4200(Angular) - Índice único en MongoDB para emails
{
id: string;
email: string;
name: string;
favoriteBreed: string;
avatar: string;
password: string; // Hasheado, no se devuelve en respuestas
}Para probar los endpoints puedes usar:
- Swagger UI (
/swagger) - Postman
- El archivo
Api.httpincluido en el proyecto
Este proyecto es parte de una prueba técnica.