Skip to content

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.

Notifications You must be signed in to change notification settings

EliNiperd/EcommerceAPI

Repository files navigation

🛍️ EcommerceAPI - REST API Professional

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%.

GitHub .NET SQL Server License


📋 Tabla de Contenidos


📝 Descripción

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


✨ Características

Autenticación & Seguridad

  • 🔐 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

Arquitectura

  • 🏗️ 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

Testing

  • ✔️ 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

Observabilidad

  • 📊 Structured Logging con Serilog
  • 📝 Logs en archivo y consola
  • 🔍 Trazabilidad completa de operaciones
  • ⚠️ Manejo global de errores

Base de Datos

  • 🗄️ SQL Server 2022 en producción
  • 📈 Entity Framework Core 9 (ORM)
  • 🔄 Migraciones automáticas en deployment
  • 📋 Esquema normalizado con relaciones

🛠️ Tecnologías

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

🏗️ Arquitectura

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

Diagrama de Flujo

Cliente HTTP
    ↓
[Middleware de Auth JWT]
    ↓
[Controller Validation]
    ↓
[Authorization Check (Roles)]
    ↓
[Service Layer - Lógica]
    ↓
[Repository Layer]
    ↓
[Entity Framework]
    ↓
[SQL Server BD]

🚀 Instalación

Requisitos Previos

  • .NET 9.0 SDK Descargar
  • SQL Server (local o remoto)
  • Visual Studio 2022 (Community es gratis)
  • Git

Pasos

1. Clonar el repositorio

git clone https://github.com/EliNiperd/EcommerceAPI.git
cd EcommerceAPI

2. Restaurar dependencias

dotnet restore

3. Configurar connection string

En appsettings.json:

{
  "ConnectionStrings": {
    "DefaultConnection": "Server=localhost;Database=EcommerceDB;Trusted_Connection=true;TrustServerCertificate=true;"
  }
}

4. Crear base de datos (Migrations)

dotnet ef database update

5. Ejecutar la aplicación

dotnet run

Accede a: http://localhost:7079/swagger


💻 Uso

Ejecutar localmente

# Desarrollo con hot reload
dotnet watch run

# Producción
dotnet publish -c Release

Ejecutar tests

# 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=true

📡 Endpoints

🔐 Autenticación

Registro de usuario

POST /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"
}

Login

POST /api/auth/login
Content-Type: application/json

{
  "email": "juan@example.com",
  "password": "Password123!"
}

📦 Productos (requiere autenticación)

Obtener todos los productos

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" }
  }
]

Crear producto (Solo Admin)

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"
}

Obtener producto por ID

GET /api/productos/1
Authorization: Bearer {token}

Actualizar producto (Solo Admin)

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
}

Eliminar producto (Solo Admin)

DELETE /api/productos/1
Authorization: Bearer {token_admin}

Respuesta (204 No Content)


📂 Categorías

Obtener todas las categorías

GET /api/categorias

Crear categoría (Solo Admin)

POST /api/categorias
Authorization: Bearer {token_admin}
Content-Type: application/json

{
  "nombre": "Accesorios",
  "descripcion": "Accesorios para dispositivos"
}

🔐 Autenticación

JWT (JSON Web Tokens)

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

Uso del Token

  1. Obtener token (vía /api/auth/registro o /api/auth/login)
  2. Incluir en headers:
    Authorization: Bearer {token}
    
  3. Token expira en: 60 minutos (configurable)

Roles

  • Admin: Acceso completo (crear, editar, eliminar)
  • Usuario: Solo lectura y acciones básicas

✅ Testing

Cobertura

  • 18 Tests totales (100% pasando)
  • 9 Tests Unitarios (Servicios, lógica)
  • 9 Tests de Integración (BD, endpoints)

Ejecutar tests

# Todos
dotnet test

# Con output detallado
dotnet test --verbosity detailed

# Específico
dotnet test --filter "AuthServiceTests"

Estructura de tests

[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);
}

🚀 Deployment

Entornos

Entorno Ubicación Tecnología
Desarrollo Local .NET 9 + SQL Server
Producción Azure App Service .NET 9 + SQL Server en VPS

En Azure

  1. Build automático: Cada push a main
  2. Deployment: Azure App Service
  3. BD: SQL Server en Hostinger VPS
  4. Monitoreo: Application Insights

Migraciones automáticas

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.


📊 Rendimiento

  • Tiempo respuesta: < 100ms (promedio)
  • Uptime: 99.9%
  • Disponibilidad: 24/7

🔒 Seguridad

  • ✅ 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

📚 Documentación Adicional


📝 Licencia

Este proyecto está bajo la licencia MIT. Ver LICENSE para más detalles.


👤 Autor

Eli Rodriguez


🙏 Agradecimientos

Especial reconocimiento a:

  • Comunidad .NET por recursos y soporte
  • Microsoft por excelente documentación
  • Claude, Perplexity, WindSurf AI por guidance técnica

📞 Contacto & Soporte

¿Preguntas o sugerencias?


⭐ 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

About

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.

Resources

Contributing

Stars

Watchers

Forks

Releases

No releases published

Packages

No packages published

Languages