Biblioteca Popular La Palabra está construida como un sistema full-stack desacoplado: un backend REST en Node.js/Express con Prisma ORM, y un frontend estático generado con Astro. Ambos servicios, junto con MySQL 8 y phpMyAdmin, se orquestan mediante Docker Compose, lo que permite levantar todo el entorno con un solo comando.Documentation Index
Fetch the complete documentation index at: https://mintlify.com/camiloivcode/biblioteca-la-palabra/llms.txt
Use this file to discover all available pages before exploring further.
Estructura del proyecto
El repositorio organiza el código en dos workspaces independientes (backend/ y frontend/) más una carpeta de documentación y los archivos de configuración de Docker en la raíz.
Patrón MVC + Servicios
El backend aplica una variante del patrón MVC que extrae toda la lógica de negocio a una capa de servicios independiente. Los controllers se limitan a orquestar la request/response, delegando el trabajo real a los servicios, que a su vez hablan con la base de datos a través de Prisma.AppError. El middleware centralizado error.middleware.js intercepta esta excepción antes de que llegue al cliente, formatea la respuesta de error y gestiona también los códigos de error nativos de Prisma (P2002 constraint única, P2025 registro no encontrado, P2003 clave foránea).
Flujo de una request
Cada petición HTTP atraviesa una cadena determinista de capas antes de producir una respuesta:Middlewares globales
La request pasa por
helmet (cabeceras de seguridad), cors (origen permitido configurado por FRONTEND_URL) y morgan (logging HTTP).Validación de ruta
El middleware
validate.middleware.js ejecuta las reglas de express-validator definidas para esa ruta. Si hay errores de validación, responde inmediatamente con 400.Middleware de autenticación
Si la ruta requiere auth,
auth.middleware.js verifica el JWT del encabezado Authorization: Bearer <token> y adjunta el usuario decodificado en req.user.Controller
El handler del controller recibe
(req, res, next), extrae los parámetros necesarios y llama al servicio correspondiente.Service + Prisma
El servicio aplica las reglas de negocio y ejecuta las queries mediante el cliente Prisma contra MySQL.
Manejo de errores
Si el servicio lanza un
AppError (o cualquier otro error), error.middleware.js lo captura, determina el statusCode adecuado y devuelve { success: false, message }.Formato de respuesta estándar
Todas las respuestas exitosas de la API siguen la misma estructura, emitida por la claseApiResponse:
meta solo está presente en respuestas paginadas (ApiResponse.paginated()). Las respuestas de creación omiten meta y retornan HTTP 201.
Los errores operacionales (reglas de negocio, validación, auth) y los errores de Prisma se devuelven siempre con este formato:
express-validator falla, el campo opcional errors puede acompañar al mensaje con el detalle de cada campo inválido.
Servicios Docker
El archivodocker-compose.yml en la raíz del repositorio define cuatro servicios que arrancan en el orden correcto: primero la base de datos, luego el backend (que ejecuta prisma db push + seed al iniciar) y finalmente el frontend.
| Servicio | Imagen / Dockerfile | Puerto expuesto |
|---|---|---|
db | MySQL 8.0 (imagen oficial) | 3307 |
backend | Node 20 Alpine (backend/Dockerfile) | 4000 |
frontend | Node 20 Alpine (frontend/Dockerfile) | 3000 |
phpmyadmin | phpMyAdmin (imagen oficial) | 8080 |