Ciclo de Vida del Evento
Documento tecnico que describe la maquina de estados completa de un evento en Nvito, desde su creacion en borrador hasta su cierre automatico o cancelacion manual. Incluye los actores, las transiciones, los servicios involucrados y los efectos colaterales de cada cambio de estado.
| Campo | Valor |
|---|---|
| Version | 1.0 |
| Fecha | Marzo 2026 |
| Estado | Publicado |
| Audiencia | Equipo de desarrollo, arquitectos |
1. Maquina de Estados
Cada evento en Nvito sigue un ciclo de vida estricto con 4 estados posibles. Las transiciones estan controladas por EventLifecycleService y EventSchedulerService, garantizando que ningun cambio de estado ocurra fuera de las reglas definidas.
1.1 Diagrama de Estados
1.2 Descripcion de Estados
| Estado | Descripcion | Quien puede estar | Duracion tipica |
|---|---|---|---|
| DRAFT | Evento recien creado. El organizador configura detalles, crea invitacion, agrega invitados. No tiene invitacion publicada. | Todos los eventos nuevos | Dias a semanas |
| ACTIVE | El evento tiene al menos una invitacion publicada. Los invitados pueden ver la invitacion y responder RSVP. | Eventos con invitacion PUBLISHED | Semanas a meses |
| COMPLETED | El evento termino. Se dispara automaticamente cuando endDate es menor o igual a now. Las invitaciones se cierran. | Eventos cuya fecha ya paso | Permanente |
| CANCELLED | El evento fue cancelado manualmente por el organizador. Las invitaciones se cierran y los workflows se pausan. | Eventos cancelados explicitamente | Permanente |
2. Transiciones Detalladas
2.1 DRAFT --> ACTIVE (Activacion automatica)
Esta transicion no es manual. Se dispara automaticamente cuando una invitacion del evento es publicada (estado PUBLISHED).
Servicio responsable: EventLifecycleService.activateEventOnPublish(eventId)
Flujo:
- El usuario aprueba la invitacion (POST
/invitations/:id/approve) ApprovalWorkflowServicecambia la invitacion aPUBLISHED- Se ejecuta
EventLifecycleService.activateEventOnPublish(eventId) - Si el evento esta en
DRAFT, transiciona aACTIVE - Si el evento ya esta en
ACTIVE(otra invitacion previa), no hace nada
Validaciones:
- El evento debe existir y pertenecer a la organizacion
- El evento debe estar en estado
DRAFT - Debe haber al menos una invitacion en estado
PUBLISHED
Efectos colaterales:
- Se activan los workflows de comunicacion programados
- Los endpoints moviles del evento quedan habilitados
- El EventAccessCode ya esta disponible (se genero en creacion)
2.2 ACTIVE --> COMPLETED (Auto-complete)
Transicion automatica ejecutada por un cron job.
Servicio responsable: EventSchedulerService
Frecuencia: Cada hora (0 * * * *)
Flujo:
- El cron busca eventos en estado
ACTIVEdondeendDatees menor o igual anow - Para cada evento encontrado:
- Cambia el estado a
COMPLETED - Cierra todas las invitaciones en
PUBLISHED(transicion aCLOSED) - Pausa todos los workflows activos
- Registra
completedAtcon timestamp
- Cambia el estado a
Validaciones:
- Solo eventos en estado
ACTIVE endDatedebe ser menor o igual anow()
Efectos colaterales:
- Invitaciones cerradas (estado
CLOSEDconcloseReason: 'EVENT_COMPLETED') - Workflows pausados
- Campanas de comunicacion en
SCHEDULEDse cancelan - Se dispara el trigger
POST_EVENTpara workflows configurados
2.3 ACTIVE/DRAFT --> CANCELLED (Cancelacion manual)
Transicion manual iniciada por el organizador.
Endpoint: PATCH /events/:id/cancel
Roles permitidos: OWNER, ADMIN
Flujo:
- El usuario envia la solicitud de cancelacion
- Se valida que el evento no este ya en
COMPLETEDoCANCELLED - Se cambia el estado a
CANCELLED - Se ejecutan los efectos colaterales de cierre
Validaciones:
- El evento debe estar en
DRAFToACTIVE - El usuario debe tener rol
OWNERoADMINen la organizacion - Se registra
cancelledAtycancelledBy
Efectos colaterales:
- Todas las invitaciones en
UNPUBLISHEDoPUBLISHEDse cierran (CLOSEDconcloseReason: 'EVENT_CANCELLED') - Todos los workflows activos se pausan
- Campanas en
SCHEDULEDoSENDINGse cancelan - Se envia notificacion al equipo del evento
3. Creacion del Evento
Al crear un evento, se generan automaticamente varios recursos asociados.
3.1 EventAccessCode
Cada evento recibe un codigo de acceso unico para la app movil.
| Campo | Descripcion |
|---|---|
code | 8 caracteres alfanumericos unicos (generado con nanoid) |
hashedPin | PIN de 4 digitos hasheado con bcrypt (para acceso HOST desde la app) |
isActive | Se activa al crear, se desactiva al cancelar/completar |
Uso: El host ingresa el codigo + PIN en la app movil para acceder como anfitrion del evento. Los invitados acceden via deep link o QR (sin PIN).
3.2 Flujo de Creacion
4. Flujo de Publicacion y Activacion
El momento mas importante del ciclo de vida: cuando una invitacion se publica y el evento se activa.
5. Actores del Sistema
| Actor | Tipo | Acciones sobre eventos |
|---|---|---|
| Organizador (Owner/Admin) | Humano | Crear, editar, cancelar, gestionar invitados |
| EventSchedulerService | Sistema (cron) | Auto-completar eventos cuya fecha paso |
| EventLifecycleService | Sistema (reactivo) | Auto-activar evento al publicar invitacion |
| ApprovalWorkflowService | Sistema (reactivo) | Disparar activacion al aprobar invitacion |
6. Restricciones y Limites
| Restriccion | Valor | Descripcion |
|---|---|---|
| Max invitaciones por evento | 3 | Maximo 3 invitaciones (internas o externas) por evento |
| Max versiones por invitacion | 50 | Solo aplica a invitaciones internas |
| EventAccessCode | Unico global | El codigo de 8 caracteres es unico en toda la plataforma |
| PIN | 4 digitos | Hasheado con bcrypt, no recuperable |
| Cron auto-complete | Cada hora | EventSchedulerService ejecuta cada 60 minutos |
7. Archivos Clave
| Archivo | Ubicacion | Responsabilidad |
|---|---|---|
events.service.ts | src/modules/events/ | CRUD de eventos, validaciones de negocio |
event-lifecycle.service.ts | src/modules/events/services/ | Activacion automatica al publicar invitacion |
event-scheduler.service.ts | src/modules/events/services/ | Cron job de auto-complete cada hora |
event-access-code.service.ts | src/modules/events/services/ | Generacion y validacion de codigos de acceso |
events.controller.ts | src/modules/events/ | Endpoints REST del dominio eventos |
8. Diagrama de Flujo Completo
9. Consideraciones de Timezone
- Cron de auto-complete: Ejecuta cada hora en UTC. La comparacion
endDatemenor o igual anowusa UTC. - Fechas del evento: Se almacenan en UTC en la base de datos. La conversion a timezone local se hace en el frontend.
- Cierre de invitaciones por evento completado: Usa timezone
America/Mexico_Citypara el cron diario de medianoche que cierra invitaciones de eventos pasados (complementario al cron horario de auto-complete de eventos).
10. Relacion con Otros Flujos
| Flujo relacionado | Relacion |
|---|---|
| Ciclo de Vida de la Invitacion | La publicacion de invitacion dispara la activacion del evento |
| Flujo del Invitado | Los invitados solo pueden interactuar con eventos en estado ACTIVE |
| Flujo de Comunicaciones | Los workflows se activan al pasar a ACTIVE y se pausan al COMPLETED/CANCELLED |
| Flujo de Pagos | Los PaymentLinks solo funcionan para eventos ACTIVE |