La confirmación cambió el proyecto
Al principio parecía un sitio principalmente visual: la historia de la pareja, la información del evento, las ubicaciones y algunas animaciones. La confirmación de asistencia fue la parte que terminó convirtiéndolo en una aplicación pequeña.
No podía publicar una lista de invitados ni usar un formulario abierto. Cada grupo tenía un cupo diferente y necesitaba volver al mismo enlace si quería corregir su respuesta. Además de construir la interfaz con Astro (abre en una pestaña nueva) , tuve que resolver ese flujo en el backend.
Cómo funciona cada invitación
Generé un enlace individual para cada invitación. El código del enlace identifica al grupo, pero nunca se guarda directamente en la base de datos. Antes de buscarlo lo transformo con SHA-256 (abre en una pestaña nueva) y comparo el resultado con el hash almacenado.
Cuando alguien confirma, el servidor comprueba que la invitación siga activa y que la cantidad de personas no supere el cupo asignado. Si ya existía una respuesta, la actualiza en lugar de crear otra. Así el mismo enlace sirve tanto para responder por primera vez como para hacer un cambio después.
Los datos y el panel privado
Guardé la información en Cloudflare D1 (abre en una pestaña nueva) . La tabla invitations contiene el nombre mostrado, el cupo, el hash y el estado de cada invitación. La tabla rsvps conserva la asistencia, los nombres, el mensaje y las fechas de la respuesta.
También construí un panel para revisar las confirmaciones, filtrar resultados, ver algunas métricas y exportar la información a Excel. Como esa parte sí contiene datos personales, la protegí con Cloudflare Access (abre en una pestaña nueva) en lugar de crear otro sistema de inicio de sesión dentro del proyecto.
No publiqué una demostración porque implicaría exponer una invitación real o preparar datos falsos solo para mostrarla. Prefiero dejar documentadas las decisiones técnicas sin hacer pública la información del evento.