Onboarding y autenticación
CÉNIT cubre todo el ciclo de alta de usuarios — staff y jugadores — con cuatro flujos distintos, pensados para minimizar el trabajo manual del cuerpo técnico y eliminar fricción del lado del atleta.
- Staff se invita uno por uno desde Settings → Usuarios.
- Jugadores se activan en bloque con un único link grupal (recomendado) o se invita uno a uno desde el Plantel (legacy).
- Todo invite cae en
/auth/set-passwordpara fijar la contraseña. - El correo sale por Resend (clave
RESEND_API_KEY). Sin Resend configurado, el invite no llega.
Flujos disponibles
Sección titulada «Flujos disponibles»| Flujo | Ruta del staff | Ruta pública | Cuándo usarlo |
|---|---|---|---|
| Self-onboarding masivo del plantel | /dashboard/onboarding-link | /onboarding/[token] | Alta inicial del plantel completo. Recomendado. |
| Invitación individual de jugador | Plantel → perfil del jugador | /auth/set-password?next=/player | Jugador que se incorpora después del onboarding masivo. |
| Invitación de staff | /dashboard/settings → Usuarios | /auth/set-password?next=/dashboard | Cualquier miembro del cuerpo técnico. |
| Primer acceso (común a todos) | n/a | /auth/set-password | Pantalla final que cierra cualquier invite. |
Anti-spoofing (jugadores)
Sección titulada «Anti-spoofing (jugadores)»El self-onboarding masivo no le manda el mail al input del usuario:
lo manda a players.email pre-cargado por el cuerpo técnico, o al
fallback que el jugador escribe en la pantalla de confirmación. Así,
si alguien curiosea la grilla y se hace pasar por otro jugador, el
mail con el link cae igual en la casilla del titular real.
Roles que pueden invitar
Sección titulada «Roles que pueden invitar»- Self-onboarding masivo:
hop,dir,sc. - Invitar jugador individual:
hop,dir. - Invitar staff:
hop,dir.
El resto de los roles ven los flujos pero no acceden a las acciones.
Variables de entorno
Sección titulada «Variables de entorno»Sin RESEND_API_KEY + RESEND_FROM en Workers Secrets, ningún
correo de invitación llega. Comportamiento por acción:
inviteOrgUser(staff) — devuelve{ ok: false, error: "No se pudo enviar el email. Verificá la configuración de Resend." }. La membership igual queda creada.invitePlayeryclaimPlayer(jugador) — devuelven{ ok: true, emailSent: false }y loguean warning en Sentry. La UI muestra el flag para indicar que el mail no salió.
NEXT_PUBLIC_SITE_URL se usa para armar el link absoluto del
invite (default https://cenitapp.com).