Una API REST robusta para la gestión de finanzas personales, desarrollada con .NET 8, que permite administrar ingresos y gastos con autenticación segura mediante JWT.
- ✅ Gestión de Ingresos: CRUD completo para registro de ingresos
- ✅ Gestión de Gastos: CRUD completo para registro de gastos
- ✅ Autenticación JWT: Sistema de autenticación seguro con tokens JWT
- ✅ Encriptación de Contraseñas: Uso de BCrypt para hash seguro de contraseñas
- ✅ Patrón Repository: Implementación del patrón Repository Genérico
- ✅ Clean Architecture: Separación clara de responsabilidades por capas
- ✅ AutoMapper: Mapeo automático entre entidades y DTOs
- ✅ Entity Framework Core: ORM para acceso a datos
- ✅ Documentación Swagger: API documentada y explorable
┌─────────────────────────────────────────────────┐
│ CONTROLLERS │
│ ┌─────────────┐ ┌─────────────┐ ┌──────────────┐│
│ │ Income │ │ Expense │ │ User ││
│ │ Controller │ │ Controller │ │ Controller ││
│ └─────────────┘ └─────────────┘ └──────────────┘│
└─────────────────┬───────────────────────────────┘
│
┌─────────────────▼───────────────────────────────┐
│ SERVICES │
│ ┌─────────────┐ ┌─────────────┐ ┌──────────────┐│
│ │ Income │ │ Expense │ │ User ││
│ │ Service │ │ Service │ │ Service ││
│ └─────────────┘ └─────────────┘ └──────────────┘│
└─────────────────┬───────────────────────────────┘
│
┌─────────────────▼───────────────────────────────┐
│ REPOSITORIES │
│ ┌─────────────────────────────────────────────┐│
│ │ Generic Repository ││
│ │ (IGenericRepository<T>) ││
│ └─────────────────────────────────────────────┘│
└─────────────────┬───────────────────────────────┘
│
┌─────────────────▼───────────────────────────────┐
│ DATA LAYER │
│ ┌─────────────────────────────────────────────┐│
│ │ FinanceDbContext ││
│ │ (Entity Framework) ││
│ └─────────────────────────────────────────────┘│
└─────────────────┬───────────────────────────────┘
│
┌─────────────────▼───────────────────────────────┐
│ DATABASE │
│ (SQL Server/SQLite) │
└─────────────────────────────────────────────────┘
finance-api/
│
├── 📁 Controllers/ # Controladores API REST
│ ├── IncomeController.cs
│ ├── ExpenseController.cs
│ └── UserController.cs
│
├── 📁 Services/ # Lógica de negocio
│ ├── 📁 UserServices/
│ │ └── UserService.cs # Autenticación JWT & BCrypt
│ ├── IIncomeService.cs
│ ├── IncomeService.cs
│ ├── IExpenseService.cs
│ └── ExpenseService.cs
│
├── 📁 Repositories/ # Acceso a datos
│ └── GenericRepository.cs
│
├── 📁 Interfaces/ # Contratos
│ └── IGenericRepository.cs
│
├── 📁 Models/ # Entidades del dominio
│ ├── Income.cs
│ ├── Expense.cs
│ └── User.cs
│
├── 📁 Dtos/ # Objetos de transferencia
│ ├── IncomeDto.cs
│ ├── ExpenseDto.cs
│ └── UserDto.cs
│
├── 📁 Data/ # Contexto de base de datos
│ └── FinanceDbContext.cs
│
├── 📁 Mappings/ # Configuración AutoMapper
│ └── MappingProfile.cs
│
├── Program.cs # Punto de entrada
├── finance-api.csproj # Configuración del proyecto
└── appsettings.json # Configuraciones
- .NET 8.0: Framework principal
- Entity Framework Core: ORM para acceso a datos
- AutoMapper: Mapeo objeto-objeto
- JWT (JSON Web Tokens): Autenticación y autorización
- BCrypt.Net: Hash seguro de contraseñas
- Swagger/OpenAPI: Documentación de la API
<PackageReference Include="Microsoft.EntityFrameworkCore" />
<PackageReference Include="Microsoft.EntityFrameworkCore.SqlServer" />
<PackageReference Include="AutoMapper" />
<PackageReference Include="AutoMapper.Extensions.Microsoft.DependencyInjection" />
<PackageReference Include="System.IdentityModel.Tokens.Jwt" />
<PackageReference Include="Microsoft.AspNetCore.Authentication.JwtBearer" />
<PackageReference Include="BCrypt.Net-Next" />
<PackageReference Include="Swashbuckle.AspNetCore" />Configura la cadena de conexión en appsettings.json:
{
"ConnectionStrings": {
"DefaultConnection": "Server=(localdb)\\mssqllocaldb;Database=FinanceApiDb;Trusted_Connection=true;"
},
"JwtSettings": {
"Secret": "tu-clave-secreta-super-segura-de-al-menos-32-caracteres",
"Issuer": "FinanceApi",
"Audience": "FinanceApiUsers",
"ExpiryInMinutes": 60
}
}# Crear migración inicial
dotnet ef migrations add InitialCreate
# Actualizar base de datos
dotnet ef database update- .NET 8.0 SDK
- SQL Server (o SQL Server LocalDB)
- Visual Studio 2022 o VS Code
-
Clonar el repositorio:
git clone https://github.com/mcarisc/FinanceApi.git cd FinanceApi/finance-api -
Restaurar dependencias:
dotnet restore
-
Configurar la base de datos:
- Actualiza la cadena de conexión en
appsettings.json - Ejecuta las migraciones:
dotnet ef database update
- Actualiza la cadena de conexión en
-
Ejecutar la aplicación:
dotnet run
La API estará disponible en:
- HTTP:
http://localhost:5000 - HTTPS:
https://localhost:5001 - Swagger UI:
https://localhost:5001/swagger
POST /api/auth/register # Registrar nuevo usuario
POST /api/auth/login # Iniciar sesión
GET /api/income # Obtener todos los ingresos
GET /api/income/{id} # Obtener ingreso por ID
POST /api/income # Crear nuevo ingreso
PUT /api/income/{id} # Actualizar ingreso
DELETE /api/income/{id} # Eliminar ingreso
GET /api/expense # Obtener todos los gastos
GET /api/expense/{id} # Obtener gasto por ID
POST /api/expense # Crear nuevo gasto
PUT /api/expense/{id} # Actualizar gasto
DELETE /api/expense/{id} # Eliminar gasto
La API utiliza JSON Web Tokens para la autenticación:
- Registro/Login: Los usuarios se registran o inician sesión para obtener un token JWT
- Hash de Contraseñas: Las contraseñas se hashean usando BCrypt antes de almacenarlas
- Autorización: Los endpoints protegidos requieren el token JWT en el header
Authorization
# Login
curl -X POST "https://localhost:5001/api/auth/login" \
-H "Content-Type: application/json" \
-d '{"email": "user@example.com", "password": "password123"}'
# Respuesta
{
"token": "eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9...",
"expiration": "2024-01-01T12:00:00Z"
}
# Usar token en requests protegidos
curl -X GET "https://localhost:5001/api/income" \
-H "Authorization: Bearer eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9..."public class Income
{
public int Id { get; set; }
public string Description { get; set; }
public decimal Amount { get; set; }
public DateTime Date { get; set; }
public string Category { get; set; }
public int UserId { get; set; }
}public class Expense
{
public int Id { get; set; }
public string Description { get; set; }
public decimal Amount { get; set; }
public DateTime Date { get; set; }
public string Category { get; set; }
public int UserId { get; set; }
}public class User
{
public int Id { get; set; }
public string Email { get; set; }
public string PasswordHash { get; set; }
public string FirstName { get; set; }
public string LastName { get; set; }
public DateTime CreatedAt { get; set; }
}- Navega a
https://localhost:5001/swagger - Regístrate o inicia sesión para obtener un token JWT
- Usa el botón "Authorize" en Swagger UI para configurar el token
- Prueba los diferentes endpoints
- Crear colección con los endpoints de la API
- Configurar variables de entorno para la URL base y token
- Automatizar autenticación usando scripts pre-request
- GenericRepository: Implementación genérica para operaciones CRUD
- IGenericRepository: Contrato para el repositorio
- Beneficios: Desacoplamiento, testabilidad, reutilización de código
- Separación de responsabilidades: Lógica de negocio en servicios
- Inyección de dependencias: Configurada en Program.cs
- Manejo de errores: Centralizado en la capa de servicios
- Transferencia de datos: Objetos específicos para la API
- AutoMapper: Mapeo automático entre entidades y DTOs
- Validación: Atributos de validación en DTOs
- Logging: Implementar logging con Serilog
- Caching: Redis para cache distribuido
- Validación: FluentValidation para reglas de negocio complejas
- Tests: Unit testing y integration testing
- Docker: Containerización de la aplicación
- CI/CD: Pipeline de integración continua
- Documentación: Documentación técnica extendida
- Monitoreo: Health checks y métricas
- Rate Limiting: Limitación de requests por IP
- Fork el proyecto
- Crea una rama para tu feature (
git checkout -b feature/nueva-funcionalidad) - Commit tus cambios (
git commit -m 'Agregar nueva funcionalidad') - Push a la rama (
git push origin feature/nueva-funcionalidad) - Abre un Pull Request
Este proyecto está bajo la Licencia MIT. Ver el archivo LICENSE para más detalles.
mcarisc - GitHub
⭐ ¡Si te gusta este proyecto, dale una estrella en GitHub!