Esta aplicación, desarrollada con NestJS y Node.js, bajo el diseño de los principios SOLID y Clean Architecture y esta se encarga de:
- Sincronizar cada hora los datos de productos desde Contentful.
- Exponer una API REST pública para consultar productos (paginar y filtrar).
- Proveer un módulo privado de informes (protegido con JWT) que muestra:
- Porcentaje de productos eliminados.
- Porcentaje de productos activos según filtros (precio y rango de fechas).
- Reporte adicional (distribución por categoría).
- Backend: NestJS, Node.js
- Base de datos: PostgreSQL (accedida mediante TypeORM)
- Documentación de API: Swagger (accesible en
/api/docs) - Docker: Dockerfile y docker-compose
- Testing: Jest
- CI/CD: GitHub Actions
Configure las variables de entorno en el archivo .env:
Clonar el archivo .env.template y renombrarlo a
- Endpoints públicos:
GET http://localhost:3000/products
DELETE http://localhost:3000/products/:id
POST http://localhost:3000/auth/login
- Endpoints privados:
POST http://localhost:3000/products/sync
GET http://localhost:3000/reports/deleted-percentage
GET http://localhost:3000/reports/active-percentage
GET http://localhost:3000/reports/category-distribution
GET http://localhost:3000/reports/inventory-by-brand
- Ruta del Swagger (local):
http://localhost:3000/api/docs
- Para levantar el servicio de la aplicación y la base de datos (postgres) con docker usa el siguiente comando:
docker compose up -dPara reforzar la construccion o en el contexto de construccion:
docker compose up -d --buildEliminación del volumen creado (si se requiere):
docker-compose down -v- Para usar los endpoints privados se requiere genera el token JWT:
-
Para generar el Token JWT se tiene que ingresar la misma contraseña y nombre de usuario que está guardada en las variables de entorno (AUTH_USER y AUTH_PASSWORD) del archivo
.env. Y ejecutar el endpoint/auth/login -
NOTA: Solo por temas de ejemplo se hizo la implementación del login con credenciales harcodeado. En un contexto real se usaría una BD.
-
Copie el valor del token JWT e ingresalo en el campo "value" al hacer click en el botón Authorize del Swagger.
- Para forzar una actualización de la base de datos por primera vez se ejecuta el siguiente endpoint
POST http://localhost:3000/products/sync
-
Opciones: Para registrar al menos un registro en la base de datos:
-
Utiliza TablePlus u otra herramienta para ingresar a la base de datos de Postgres Una vez ingresado a la base de datos inserte el script SQL que se encuentra el archivo
db-init\seed.sql
Opciones: Otra opción de desplegar es ejecutando el entorno de desarrollo desde la raiz del proyecto:
npm run start:devdocker-compose run app npm run testnpm run testOpciones: Ejecución de las Pruebas Unitarias desde la raíz del proyecto de forma explícita
npx jest test/product.spec.ts
npx jest test/report.spec.ts
npx jest test/product.controller.spec.ts
npx jest test/report.controller.spec.tsdocker-compose run app npm run lint