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).
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 }'fechaEventodebe ser futura (400si no).- Si
permiteReservaGrupalesfalse,maxAcompanantesdebe ser0.
Transiciones
Sección titulada «Transiciones»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 → cerradopublicar 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').
Configuración y borrado
Sección titulada «Configuración y borrado»PATCH /eventos/{id}: nombre, fecha, minutos de apartado, cupo y reglas grupal.404si no existe,400si rompe la coherencia grupal.DELETE /eventos/{id}: solo enborrador(cascada total: zonas, mesas, padrón, reservas…); en otros estados responde409(usacerrar).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:
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
clavese normaliza a mayúsculas y es única por evento (409). colorHexes un color de 6 dígitos (#A31F34).PATCH /zonas/{id}corrige clave/nombre/color/orden; el evento asociado es inmutable.DELETE /zonas/{id}:409mientras la zona tenga mesas (RESTRICT).GET /zonas/{id}devuelve la ficha más conteo de mesas y sillas.
Plano SVG del salón
Sección titulada «Plano SVG del salón»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 |
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: truedeja 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}/activarcambia 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 responden404.
Listado
Sección titulada «Listado»GET /eventos/ pagina con limit/cursor y filtra por estado y
búsqueda en nombre.