API REST para gestión de invitados, invitaciones y mesas de boda, construida con Fastify, TypeScript, Prisma y PostgreSQL. Parte de la plataforma LOVEPOSTAL (lovepostal.studio).
- Node.js + Fastify 5 - Framework web rápido y ligero
- TypeScript - Tipado estático (strict mode)
- Prisma ORM - ORM moderno para PostgreSQL
- PostgreSQL - Base de datos
- TypeBox (@sinclair/typebox) - Validación de esquemas JSON
- Swagger/OpenAPI - Documentación automática de API
- Vitest - Framework de testing
- Pino - Logging estructurado
Arquitectura limpia con separación de responsabilidades. Cada módulo sigue el patrón: schema → repository → service → controller → routes.
src/
├── config/ # Configuración (env, swagger)
├── plugins/ # Plugins de Fastify (prisma, jwt, error-handler)
├── modules/
│ ├── auth/ # Módulo de autenticación
│ ├── invitations/ # Módulo de invitaciones
│ ├── guests/ # Módulo de invitados
│ ├── tables/ # Módulo de mesas
│ └── stats/ # Módulo de estadísticas
├── types/ # Definiciones de tipos TypeScript
├── app.ts # buildApp() — registra plugins y rutas
└── server.ts # Entrypoint — listen + graceful shutdown
- Node.js >= 18
- PostgreSQL
- npm
- Clonar el repositorio
- Instalar dependencias:
npm install- Crear archivo
.envbasado en.env.example:
cp .env.example .env-
Configurar la variable
DATABASE_URLen.envcon la conexión a PostgreSQL -
Generar el cliente de Prisma:
npm run prisma:generate- Ejecutar migraciones:
npm run prisma:migrate| Variable | Descripción | Ejemplo |
|---|---|---|
DATABASE_URL |
Connection string de PostgreSQL | postgresql://user:pass@localhost:5432/guests_db?schema=public |
NODE_ENV |
Entorno de ejecución | development / production |
PORT |
Puerto del servidor | 3000 |
HOST |
Host del servidor | 0.0.0.0 |
JWT_SECRET |
Secret para JWT | change-me-in-production |
ADMIN_EMAIL |
Email del admin para seed | admin@lovepostal.studio |
ADMIN_PASSWORD |
Password del admin para seed | (vacío = skip) |
Nota: Si el password contiene
#, usa comillas dobles:ADMIN_PASSWORD="Pass#123". Sin comillas,#trunca el valor.
npm run dev- Inicia el servidor en modo desarrollo con hot-reloadnpm run build- Compila el proyecto TypeScriptnpm start- Inicia el servidor en producciónnpm test- Ejecuta tests en modo watchnpm run test:run- Ejecuta tests una veznpm run test:ui- Ejecuta tests con UI visualnpm run prisma:generate- Genera el cliente de Prismanpm run prisma:migrate- Ejecuta migraciones de base de datosnpm run prisma:studio- Abre Prisma Studio para gestionar la BD
POST /api/v1/auth/register- Registrar nuevo usuarioPOST /api/v1/auth/login- Iniciar sesiónGET /api/v1/auth/me- Obtener perfil (requiere JWT)
POST /api/v1/invitations- Crear invitaciónPOST /api/v1/invitations/with-guests- Crear invitación con invitados (transacción atómica)GET /api/v1/invitations- Listar invitaciones (soporta paginación)GET /api/v1/invitations/:id- Obtener invitación por ID (incluye invitados y mesa)PUT /api/v1/invitations/:id- Actualizar invitaciónDELETE /api/v1/invitations/:id- Eliminar invitación
POST /api/v1/guests- Crear invitadoGET /api/v1/guests- Listar invitados (soporta paginación)GET /api/v1/guests?invitationId=<uuid>- Listar invitados por invitaciónGET /api/v1/guests/:id- Obtener invitado por IDPUT /api/v1/guests/:id- Actualizar invitadoDELETE /api/v1/guests/:id- Eliminar invitado
POST /api/v1/tables- Crear mesaGET /api/v1/tables- Listar mesas con estadísticas (soporta paginación)GET /api/v1/tables/:id- Obtener mesa por ID con invitaciones y guestsPUT /api/v1/tables/:id- Actualizar mesaDELETE /api/v1/tables/:id- Eliminar mesa (solo si no tiene invitaciones)
GET /api/v1/stats/dashboard- Estadísticas generales (totales, confirmados, pendientes, declinados, días hasta boda)GET /api/v1/stats/tables- Estadísticas de mesas (capacidad, ocupación, disponibilidad)
GET /health- Health check
- Unicidad por nombre en guests, invitations y tables
- Unicidad por operationId en guests e invitations
- Validación de capacidad de mesa antes de asignar invitaciones
- No eliminar mesas con invitaciones asignadas
- No reducir capacidad por debajo del número actual de guests
- Transacción atómica para crear invitación con guests
- onDelete: SetNull — al eliminar invitación, los guests quedan huérfanos (invitationId = null)
Una vez iniciado el servidor, la documentación interactiva de Swagger está disponible en:
- Desarrollo: http://localhost:3000/docs
- Producción: https://api.lovepostal.studio/docs
Framework: Vitest. Los tests unitarios usan mocks manuales de repositories.
# Ejecutar tests una vez
npm run test:run
# Ejecutar tests en modo watch
npm test
# Ejecutar tests con UI visual
npm run test:ui- Autenticación JWT con email/password
- Validación estricta de entrada/salida con TypeBox
- Documentación OpenAPI generada automáticamente
- Manejo de errores centralizado con mapeo de status codes
- Logs estructurados con Pino
- CORS y Helmet configurados
- Graceful shutdown
- Admin seed automático en deploy (idempotente)
- Arquitectura escalable y mantenible