Captura principal de la aplicación mostrando la interfaz de gestión de libros
-
Configurar variables de entorno (automático con valores por defecto):
# El archivo .env del backend se crea automáticamente con valores seguros # No requiere configuración manual
-
Levantar todo el stack con un solo comando:
docker compose up --build
-
Acceder a los servicios:
- 🌐 Frontend: http://localhost:8080
- 📚 Backend/API: http://localhost:3000/api
- 📖 Swagger Docs: http://localhost:3000/api/docs
- ❤️ Health Check: http://localhost:3000/api/health
-
Credenciales de prueba:
- Email:
admin@cmpc.local - Password:
admin1234
- Email:
-
Para apagar:
docker compose down
-
Para limpiar volúmenes (destructivo - elimina imágenes y datos):
docker compose down -v
- ✅ JWT con protección de rutas
- ✅ Middleware de autenticación
- ✅ CORS configurado
- ✅ Validación de datos con pipes
- ✅ CRUD completo (Create, Read, Update, Delete)
- ✅ Soft-delete con auditoría
- ✅ Filtros avanzados (título, autor, editorial, género, disponibilidad)
- ✅ Búsqueda con debounce (300ms)
- ✅ Paginación server-side
- ✅ Ordenamiento multi-campo
- ✅ Exportación CSV manteniendo filtros
- ✅ Subida de imágenes con Multer (almacenamiento local persistente)
- ✅ Visualización de imágenes en tabla, detalles y formularios
- ✅ React 18 + TypeScript + Vite
- ✅ UI responsive y moderna
- ✅ Tipado estricto
- ✅ Contexto de autenticación
- ✅ Manejo de estados con hooks
- ✅ Formularios con validación
- ✅ NestJS + TypeScript
- ✅ PostgreSQL + Sequelize ORM
- ✅ Interceptors de logging y transformación
- ✅ Filtros globales de excepciones
- ✅ Swagger/OpenAPI documentación
- ✅ Health checks
- ✅ Cobertura de tests: 91.61% (objetivo ≥80%)
- ✅ Tests unitarios con Jest
- ✅ Tests de integración
- ✅ Linting y formateo automático
- ✅ Docker Compose orquestación
- ✅ Multi-stage builds optimizados
- ✅ Health checks en todos los servicios
- ✅ Variables de entorno configuradas
- ✅ Nginx para servir frontend
- ✅ Single command deployment
- ✅ Volúmenes persistentes para imágenes y base de datos
Frontend: React 18 + TypeScript + Vite + CSS Modules
Backend: NestJS + TypeScript + PostgreSQL + Sequelize
Auth: JWT + bcrypt
Docs: Swagger/OpenAPI
DevOps: Docker + Docker Compose + Nginx
Testing: Jest + Supertest
Digitalizar procesos de inventario para una tienda de libros (CMPC-libros), con:
- CRUD de libros (título, autor, editorial, precio, disponibilidad, género, imagen)
- Autenticación JWT
- Filtros avanzados, orden multi-campo, paginación server-side, búsqueda con debounce
- Exportación CSV
- Soft-delete, logging/auditoría
- Tests (≥ 80% cobertura)
- Despliegue local con Docker
.
├─ cmpc-libros-frontend/ # React + Vite (Nginx)
├─ cmpc-libros-backend/ # NestJS + Sequelize
└─ docker-compose.yml # Orquestación local
- Docker 20+ y Docker Compose 2+
- Puertos libres:
3000(API),8080(Web),5432(DB)
PORT=3000
NODE_ENV=development
# JWT
JWT_SECRET=supersecretchangeme-pon-uno-largo
JWT_EXPIRES_IN=1d
# DB
DB_HOST=postgres
DB_PORT=5432
DB_NAME=cmpc_libros
DB_USER=cmpc
DB_PASS=cmpc_password
# Logging
LOG_LEVEL=debug
# CORS (coma-separado si hay múltiples orígenes)
CORS_ORIGINS=http://localhost:8080VITE_API_BASE_URL(por defectohttp://localhost:3000/api)
-
Crear
.envdel backend (puedes copiar desde.env.exampley ajustar valores):cp cmpc-libros-backend/.env.example cmpc-libros-backend/.env
-
Levantar todo el stack:
docker compose up --build
- DB:
postgres:16-alpine - migration: corre
pgcrypto, migrations y seeds una sola vez - backend: NestJS en
http://localhost:3000/api(Swagger:/api/docs) - frontend: SPA en
http://localhost:8080
Para apagar:
docker compose downPara limpiar volúmenes (destructivo):
docker compose down -v- Documentación Swagger:
http://localhost:3000/api/docs - Autorización: Bearer Token (JWT)
POST /api/auth/login– login JWTGET /api/auth/me– perfil usuario autenticadoGET /api/books– listado con filtros/orden/paginación (query params)GET /api/books/:id– detalle de libro específicoPOST /api/books– altaPATCH /api/books/:id– ediciónDELETE /api/books/:id– soft deletePOST /api/upload/book-image– subida de imagen (multipart/form-data)GET /api/books/export– CSV con filtrosGET /api/health– health check
- users(id UUID, email, passwordHash, role)
- books(id UUID, title, author, publisher, price, available, genre, imageUrl, deletedAt)
- audit_logs(id UUID, userId, action, entity, entityId, payload, createdAt)
Índices sugeridos
books(title),books(author),books(publisher),books(genre), compuestos por filtros frecuentes.
gen_random_uuid()requiere la extensión pgcrypto (migration incluida).
- NestJS modular (principios SOLID): módulos
auth,users,books,audit. - Sequelize + transactions para operaciones críticas.
- Interceptors: logging y transformación estándar
{ success, data }. - Filtros: manejo centralizado de errores.
- Soft delete:
deletedAt/paranoiden modelos.
- Ruteo protegido, contexto de auth.
- Búsqueda con debounce, filtros y orden en servidor.
- Subida de imagen por URL (
imageUrl) – extensible a S3 o storage local. - Tabla paginada; formulario con validaciones reactivas.
- Backend: unit tests (servicios/controladores/estrategias JWT) con Jest.
Meta ≥ 80% cobertura (algunos archivos originales estaban truncados y deben completarse).
- Usar variables seguras (secrets) y
NODE_ENV=production. - Pinned images / build reproducible.
- Ajustar
CORS_ORIGINSyVITE_API_BASE_URL. - Ejecutar migraciones en job CI/CD previo a
backend. - Logs a STDOUT (integrable con ELK/CloudWatch).
- Subida: Endpoint
/api/upload/book-imagecon Multer - Almacenamiento: Local con volumen Docker persistente
- Validación: Tipos (JPEG, PNG, WebP), tamaño máximo 5MB
- Visualización: Miniaturas en tabla, imagen completa en detalles y edición
- URLs: Servidas estáticamente desde
/uploads/books/
- Búsqueda: Texto libre en título, autor, editorial
- Filtros específicos: Género, editorial, autor, disponibilidad
- Funcionalidad: Todos los filtros funcionan correctamente
- UI: Select de disponibilidad con opciones "Todos", "Disponible", "No disponible"
- Base de datos: Volumen
pgdatapara PostgreSQL - Imágenes: Volumen
uploadspara archivos subidos - Beneficio: Los datos persisten entre reinicios de contenedores
- Crea
cmpc-libros-backend/.env(ver sección de variables). - Ejecuta:
docker compose up --build- Frontend: http://localhost:8080
- Backend/API: http://localhost:3000/api
- Swagger Docs: http://localhost:3000/api/docs
- Health: http://localhost:3000/api/health
Usuario seed (si seeder activo): admin@cmpc.local / admin1234