Una API REST moderna y escalable construida con .NET 9, Entity Framework Core y SQL Server. Implementa autenticación JWT, autorización basada en roles y arquitectura limpia con cobertura de tests 100%.
- Descripción
- Características
- Tecnologías
- Arquitectura
- Instalación
- Uso
- Endpoints
- Autenticación
- Testing
- Deployment
- Autor
EcommerceAPI es una API REST profesional desarrollada como portafolio técnico. Implementa patrones de diseño empresariales, seguridad robusta y buenas prácticas de desarrollo.
Proyecto en Producción: https://ecommerce-api-eli-ehbpgkeqchcccqbu.canadacentral-01.azurewebsites.net
Documentación Swagger: https://ecommerce-api-eli-ehbpgkeqchcccqbu.canadacentral-01.azurewebsites.net/swagger
- 🔐 JWT (JSON Web Tokens) para autenticación stateless
- 👥 Autorización basada en roles (Admin, Usuario)
- 🔑 Generación segura de tokens con expiración configurable
- 🛡️ Validación de contraseñas con hash seguro
- 🏗️ Patrón Repository para abstracción de datos
- 🎯 Dependency Injection (DI) contenedor integrado
- 📦 DTOs (Data Transfer Objects) para separación de capas
- 🔄 Async/Await para operaciones no bloqueantes
- ✅ Validaciones fluidas con FluentValidation
- ✔️ 18 Tests unitarios (100% pasando)
- 🔗 9 Tests de integración con BD
- 📊 Tests de autenticación, autorización y lógica de negocio
- 🏭 Fixtures y Data Builders para tests limpios
- 📊 Structured Logging con Serilog
- 📝 Logs en archivo y consola
- 🔍 Trazabilidad completa de operaciones
⚠️ Manejo global de errores
- 🗄️ SQL Server 2022 en producción
- 📈 Entity Framework Core 9 (ORM)
- 🔄 Migraciones automáticas en deployment
- 📋 Esquema normalizado con relaciones
| Categoría | Tecnología |
|---|---|
| Runtime | .NET 9.0 |
| Framework | ASP.NET Core 9 |
| BD | SQL Server 2022 |
| ORM | Entity Framework Core 9 |
| Auth | JWT (System.IdentityModel.Tokens.Jwt) |
| Logging | Serilog |
| Testing | xUnit, Moq |
| API Docs | Swagger/OpenAPI |
| Hosting | Azure App Service (Cloud) |
| VPS BD | Hostinger KV1 + Docker |
EcommerceAPI/
│
├── Controllers/ # Endpoints HTTP
│ ├── AuthController.cs # Registro y Login
│ ├── ProductosController.cs # CRUD Productos
│ └── CategoriasController.cs# Categorías
│
├── Services/ # Lógica de negocio
│ ├── AuthService.cs # Autenticación
│ ├── ProductoService.cs # Productos
│ └── JwtService.cs # Token JWT
│
├── Models/ # Entidades de dominio
│ ├── Usuario.cs
│ ├── Producto.cs
│ ├── Categoria.cs
│ └── AuditoriaObjeto.cs
│
├── DTOs/ # Transfer Objects
│ ├── UsuarioDTO.cs
│ ├── ProductoDTO.cs
│ └── LoginRequest.cs
│
├── Data/ # Acceso a datos
│ ├── EcommerceContext.cs # DbContext
│ └── Migrations/ # Historial BD
│
├── Repositories/ # Patrón Repository
│ ├── IProductoRepository.cs
│ └── ProductoRepository.cs
│
├── Middleware/ # Middlewares personalizados
│ └── ErrorHandlingMiddleware.cs
│
└── Configuration/ # Configuración
└── JwtSettings.cs
Tests/
├── Unit/ # Tests unitarios
├── Integration/ # Tests de integración
├── Fixtures/ # Configuración de tests
└── Helpers/ # Data Builders
Cliente HTTP
↓
[Middleware de Auth JWT]
↓
[Controller Validation]
↓
[Authorization Check (Roles)]
↓
[Service Layer - Lógica]
↓
[Repository Layer]
↓
[Entity Framework]
↓
[SQL Server BD]
- .NET 9.0 SDK Descargar
- SQL Server (local o remoto)
- Visual Studio 2022 (Community es gratis)
- Git
git clone https://github.com/EliNiperd/EcommerceAPI.git
cd EcommerceAPIdotnet restoreEn appsettings.json:
{
"ConnectionStrings": {
"DefaultConnection": "Server=localhost;Database=EcommerceDB;Trusted_Connection=true;TrustServerCertificate=true;"
}
}dotnet ef database updatedotnet runAccede a: http://localhost:7079/swagger
# Desarrollo con hot reload
dotnet watch run
# Producción
dotnet publish -c Release# Todos los tests
dotnet test
# Tests específicos
dotnet test --filter "UT_" # Solo unitarios
dotnet test --filter "IT_" # Solo integración
# Con cobertura
dotnet test /p:CollectCoverage=truePOST /api/auth/registro
Content-Type: application/json
{
"nombreUsuario": "Juan Perez",
"email": "juan@example.com",
"password": "Password123!",
"rol": "Usuario"
}Respuesta (200 OK):
{
"token": "eyJhbGciOiJIUzUxMiIsInR5cCI6IkpXVCJ9...",
"nombreUsuario": "Juan Perez",
"email": "juan@example.com",
"rol": "Usuario",
"expiracion": "2025-11-12T18:30:00Z"
}POST /api/auth/login
Content-Type: application/json
{
"email": "juan@example.com",
"password": "Password123!"
}GET /api/productos
Authorization: Bearer {token}Respuesta (200 OK):
[
{
"productoId": 1,
"nombre": "Laptop Dell XPS",
"descripcion": "Laptop de alta performance",
"precio": 1200.00,
"stock": 5,
"categoriaId": 1,
"categoria": { "nombre": "Electrónica" }
}
]POST /api/productos
Authorization: Bearer {token_admin}
Content-Type: application/json
{
"nombre": "iPhone 15",
"descripcion": "Smartphone flagship",
"precio": 999.99,
"stock": 10,
"categoriaId": 1
}Respuesta (201 Created):
{
"productoId": 18,
"nombre": "iPhone 15",
"descripcion": "Smartphone flagship",
"precio": 999.99,
"stock": 10,
"categoriaId": 1,
"fechaCreacion": "2025-11-12T17:30:00Z"
}GET /api/productos/1
Authorization: Bearer {token}PUT /api/productos/1
Authorization: Bearer {token_admin}
Content-Type: application/json
{
"nombre": "iPhone 15 Pro",
"descripcion": "Smartphone flagship con cámara mejorada",
"precio": 1099.99,
"stock": 15,
"categoriaId": 1
}DELETE /api/productos/1
Authorization: Bearer {token_admin}Respuesta (204 No Content)
GET /api/categoriasPOST /api/categorias
Authorization: Bearer {token_admin}
Content-Type: application/json
{
"nombre": "Accesorios",
"descripcion": "Accesorios para dispositivos"
}La API utiliza JWT para autenticación stateless. El token incluye:
- Header: Tipo de token y algoritmo
- Payload (Claims):
sub(UsuarioId)name(NombreUsuario)email(Email)role(Rol)exp(Expiración)
- Signature: Firmado con clave secreta
- Obtener token (vía
/api/auth/registroo/api/auth/login) - Incluir en headers:
Authorization: Bearer {token} - Token expira en: 60 minutos (configurable)
- Admin: Acceso completo (crear, editar, eliminar)
- Usuario: Solo lectura y acciones básicas
- 18 Tests totales (100% pasando)
- 9 Tests Unitarios (Servicios, lógica)
- 9 Tests de Integración (BD, endpoints)
# Todos
dotnet test
# Con output detallado
dotnet test --verbosity detailed
# Específico
dotnet test --filter "AuthServiceTests"[Fact]
public async Task RegistrarUsuario_ConDatosValidos_DebeCrearNuevoUsuario()
{
// Arrange
var nuevoUsuario = new UsuarioRegistroDTO { ... };
// Act
var resultado = await _authService.RegistrarUsuarioAsync(nuevoUsuario);
// Assert
Assert.NotNull(resultado.Token);
Assert.Equal("Admin", resultado.Rol);
}| Entorno | Ubicación | Tecnología |
|---|---|---|
| Desarrollo | Local | .NET 9 + SQL Server |
| Producción | Azure App Service | .NET 9 + SQL Server en VPS |
- Build automático: Cada push a main
- Deployment: Azure App Service
- BD: SQL Server en Hostinger VPS
- Monitoreo: Application Insights
En Program.cs:
using (var scope = app.Services.CreateScope())
{
var db = scope.ServiceProvider.GetRequiredService<EcommerceContext>();
db.Database.Migrate(); // Automático
}Cada deploy en Azure aplica migraciones pendientes.
- Tiempo respuesta: < 100ms (promedio)
- Uptime: 99.9%
- Disponibilidad: 24/7
- ✅ Contraseñas hasheadas (BCrypt)
- ✅ JWT con firma (HMAC-SHA512)
- ✅ HTTPS en producción
- ✅ CORS configurado
- ✅ Validación de entrada
- ✅ Error handling sin exponer detalles internos
- Swagger/OpenAPI: https://ecommerce-api-eli-ehbpgkeqchcccqbu.canadacentral-01.azurewebsites.net/swagger
- Entity Framework Docs: https://learn.microsoft.com/en-us/ef/core/
- .NET 9 Guide: https://learn.microsoft.com/en-us/dotnet/core/whats-new/dotnet-9
Este proyecto está bajo la licencia MIT. Ver LICENSE para más detalles.
Eli Rodriguez
- 🌐 Portafolio: https://eliconacento.com
- 💼 LinkedIn: [Tu perfil LinkedIn]
- 📧 Email: eli.rodriguez@gmail.com
- 🐙 GitHub: https://github.com/EliNiperd
Especial reconocimiento a:
- Comunidad .NET por recursos y soporte
- Microsoft por excelente documentación
- Claude, Perplexity, WindSurf AI por guidance técnica
¿Preguntas o sugerencias?
- 📧 Email: eli.rodriguez@gmail.com
- 🐙 Issues en GitHub: https://github.com/EliNiperd/EcommerceAPI/issues
- 💬 Discussions: https://github.com/EliNiperd/EcommerceAPI/discussions
⭐ Si este proyecto te fue útil, ¡dale una estrella en GitHub! ⭐
Made with ❤️ by Elí Rodríguez (eliconacento)
Última actualización: Noviembre 2025 Versión: 1.0.0 - Production Ready