Ir al contenido

Eventos y ciclo de vida

Un evento pasa por cuatro estados:

borrador ──publicar──▶ publicado ──iniciar──▶ en_curso ──cerrar──▶ cerrado
│ │
└──── delete ──────────┘ (solo en borrador)

Cada transición es un endpoint dedicado; PATCH nunca cambia el estado (solo configuración).

Ventana de terminal
curl -X POST http://localhost:5000/eventos/ \
-H 'content-type: application/json' -H "authorization: Bearer $TOKEN" \
-d '{
"nombre": "Posada Anual 2026",
"fechaEvento": "2026-12-18T20:00:00Z",
"minutosApartado": 15,
"cupoTotal": 400,
"permiteReservaGrupal": true,
"maxAcompanantes": 3
}'
  • fechaEvento debe ser futura (400 si no).
  • Si permiteReservaGrupal es false, maxAcompanantes debe ser 0.
Ventana de terminal
POST /eventos/{id}/publicar # borrador → publicado (abre registro)
POST /eventos/{id}/iniciar # publicado → en_curso (día del evento)
POST /eventos/{id}/cerrar # en_curso|publicado → cerrado

publicar exige el salón mínimo: al menos una zona y una silla; si falta, responde 409. Repetir una transición ya consumida también es 409. cerrar congela el ciclo de vida.

Mientras el evento no esté publicado o en_curso, la API rechaza reservas (409 … no admite reservas en estado 'borrador').

  • PATCH /eventos/{id}: nombre, fecha, minutos de apartado, cupo y reglas grupal. 404 si no existe, 400 si rompe la coherencia grupal.
  • DELETE /eventos/{id}: solo en borrador (cascada total: zonas, mesas, padrón, reservas…); en otros estados responde 409 (usa cerrar).
  • GET /eventos/{id}/resumen: foto operativa para dashboard (conteos de zonas, mesas, lugares, participantes y reservas por estado).

Las zonas agrupan mesas y colorearán el plano:

Ventana de terminal
curl -X POST http://localhost:5000/eventos/{id}/zonas \
-H 'content-type: application/json' -H "authorization: Bearer $TOKEN" \
-d '{"clave":"VIP","nombre":"Zona VIP","colorHex":"#A31F34"}'
  • La clave se normaliza a mayúsculas y es única por evento (409).
  • colorHex es un color de 6 dígitos (#A31F34).
  • PATCH /zonas/{id} corrige clave/nombre/color/orden; el evento asociado es inmutable.
  • DELETE /zonas/{id}: 409 mientras la zona tenga mesas (RESTRICT).
  • GET /zonas/{id} devuelve la ficha más conteo de mesas y sillas.

Dos formas de registrar versiones del plano:

Endpoint Cuándo
POST /eventos/{id}/mapas/upload Multipart con el archivo archivo.svg (máx. 5 MB)
POST /eventos/{id}/mapas Registro por JSON con versión explícita
Ventana de terminal
curl -X POST http://localhost:5000/eventos/{id}/mapas/upload \
-H "authorization: Bearer $TOKEN" \
-F archivo=@plano.svg -F activar=true
  • El archivo se guarda en disco con nombre propio (v<n>.svg), nunca con el nombre del cliente (sin traversal).
  • activar: true deja esta versión como activa y desactiva las demás en la misma transacción (solo una activa a la vez).
  • Versiones son inmutables: los cambios van en una versión nueva.
  • POST /mapas/{id}/activar cambia la activa; DELETE /mapas/{id} borra una versión (incluso la activa).
  • El SVG se sirve público en GET /assets/mapas/{eventoId}/{archivo}; nombres fuera del patrón generado responden 404.

GET /eventos/ pagina con limit/cursor y filtra por estado y búsqueda en nombre.

→ Salón: mesas y sillas