Este proyecto es una API profesional para la gestión de productos y órdenes, construida con NestJS, MongoDB y una arquitectura basada en el Patrón Repositorio.
-
Framework: NestJS (Node.js) con TypeScript.
-
Base de Datos: MongoDB con Mongoose (Consultas de agregación avanzadas).
-
Patrón de Diseño: Repositorio (Repository Pattern) para desacoplamiento de datos.
-
Seguridad: Autenticación JWT y Hashing de contraseñas con Bcrypt.
-
Validación: Class-validator (DTOs) y Pipes de validación de archivos.
-
Infraestructura: Docker y Docker Compose.
-
src/auth: Registro, Login, JWT Strategy y Repository.
-
src/products: Gestión de productos, filtros y carga de imágenes.
-
src/orders: Pedidos, cálculos automáticos y agregaciones.
-
src/common: Validadores personalizados para archivos y utilidades.
-
src/database: Conexión global y configuración de Mongoose.
-
src/main.ts: Punto de entrada y configuración de Pipes globales.
- Docker y Docker Compose instalados.
- Crea un archivo
.enven la raíz del proyecto con los siguientes valores:
APP_PORT=3000
MONGO_PORT=27017
MONGO_URI=mongodb://localhost:27017/challenge_db
JWT_SECRET=Clave_Super_Secreta_2026Ejecuta el siguiente comando para levantar la infraestructura completa:
$ docker-compose up -d --buildLa API estará disponible en http://localhost:3000.
-
POST /auth/signup: Registro de nuevo usuario.
-
POST /auth/signin: Login de usuario.
-
POST /products: Crear un producto. Requiere Auth JWT y envío de imagen vía multipart/form-data.
-
GET /products: Lista de productos con soporte para paginación y filtros por name o sku.
-
GET /products/:id: Detalle técnico de un producto específico.
-
POST /orders: Crear una orden. Valida el total automáticamente consultando los precios actuales de los productos. Requiere Auth JWT.
-
PUT /orders/:id: Actualiza una orden. Valida el total automáticamente consultando los precios actuales de los productos. Requiere Auth JWT.
-
GET /orders/stats/total-last-month: Reporte de sumatoria total de ventas de los últimos 30 días.
-
GET /orders/stats/highest: Obtiene la orden con el monto de venta más elevado.
Se ha implementado un validador personalizado (CustomFileTypeValidator) que asegura:
-
Obligatoriedad: No se puede crear un producto sin imagen.
-
Formatos permitidos: Únicamente jpg, jpeg y png.
-
Tamaño máximo: 5MB por archivo.
Toda la interacción con la base de datos está centralizada en clases Repository. Esto permite:
-
Facilidad para realizar Testing Unitario mediante Mocks.
-
Independencia de la lógica de negocio respecto a la librería Mongoose.
-
Consultas de agregación optimizadas para reportes de ventas.