👥 Flujo de Participante
Visión General
El flujo del PARTICIPANT es el más complejo del sistema, involucrando registro, formación de equipos, desarrollo y envío de proyectos.
Diagrama de Flujo Completo
Casos de Uso Detallados
CU-1: Registro en Hackathon
Actor: PARTICIPANT
Precondiciones:
- Usuario tiene perfil con
role: PARTICIPANT - Hackathon existe con
status: REGISTRATION now >= registrationOpensAt && now <= registrationClosesAt
Flujo Principal:
- Usuario navega a
/hackathons - Ve lista de hackathons con
status: REGISTRATION - Clic en "Participar" en un hackathon
- Sistema valida:
- Rol es PARTICIPANT
- Hackathon está en REGISTRATION
- Fecha actual dentro de ventana
- Usuario no está ya registrado
- Sistema crea
HackathonParticipation - Mensaje de éxito: "¡Registro exitoso! Ahora crea o únete a un equipo."
Flujos Alternativos:
- FA-1.1: Hackathon no está en REGISTRATION → Error: "Este hackathon no está abierto para registro"
- FA-1.2: Fuera de ventana de fechas → Error: "El registro está cerrado"
- FA-1.3: Ya registrado → Error: "Ya estás registrado en este hackathon"
CU-2: Crear Equipo
Actor: PARTICIPANT
Precondiciones:
- Usuario está registrado en hackathon
hackathon.status IN (REGISTRATION, RUNNING)now < submissionDeadline- Usuario no pertenece a otro equipo en ese hackathon
Flujo Principal:
- Usuario va a
/hackathons/[slug]/teams/create - Ingresa:
name,description(opcional) - Sistema valida precondiciones
- Sistema genera
codeúnico (ej: "HX42YZ") - Sistema crea:
TeamconhackathonId,name,codeTeamMemberconisLeader: true
- Muestra código para compartir
- Redirige a
/hackathons/[slug]/teams/[teamId]
Flujos Alternativos:
- FA-2.1: Hackathon no permite crear equipos → Error: "No se pueden crear equipos en este momento"
- FA-2.2: Ya tiene equipo → Error: "Ya perteneces a un equipo en este hackathon"
CU-3: Unirse a Equipo
Actor: PARTICIPANT
Precondiciones:
- Usuario está registrado en hackathon
hackathon.status IN (REGISTRATION, RUNNING)now < submissionDeadline- Usuario no pertenece a otro equipo
Flujo Principal:
- Usuario va a
/hackathons/[slug]/teams/join - Ingresa código de equipo
- Sistema valida:
- Código existe
- Equipo pertenece al mismo hackathon
- Equipo no ha alcanzado
maxTeamSize - Usuario está registrado
- Usuario no tiene otro equipo
- Sistema crea
TeamMember - Mensaje de éxito: "Te has unido al equipo [nombre]"
- Redirige a
/hackathons/[slug]/teams/[teamId]
Flujos Alternativos:
- FA-3.1: Código inválido → Error: "Código de equipo inválido"
- FA-3.2: Equipo lleno → Error: "El equipo está lleno"
- FA-3.3: Ya tiene equipo → Error: "Ya perteneces a un equipo"
CU-4: Enviar Submission
Actor: PARTICIPANT (miembro del equipo)
Precondiciones:
- Usuario es miembro del equipo
hackathon.status: RUNNINGnow < submissionDeadline- Equipo tiene tamaño
>= minTeamSize - Equipo no tiene submission previa
Flujo Principal:
- Usuario va a
/hackathons/[slug]/teams/[teamId]/submit - Completa formulario:
title(requerido)description(requerido)repoUrl(opcional)demoUrl(opcional)challengeId(opcional - elegir de lista)- Campos técnicos detallados
- Sistema valida precondiciones
- Sistema crea
Submission - Si
challengeIdpresente, creaSubmissionChallenge - Mensaje de éxito: "Submission enviada exitosamente"
- Redirige a
/hackathons/[slug]/teams/[teamId]
Flujos Alternativos:
- FA-4.1: Hackathon no está RUNNING → Error: "El hackathon no está en ejecución"
- FA-4.2: Pasó deadline → Error: "La fecha límite ha pasado"
- FA-4.3: Equipo muy pequeño → Error: "El equipo no cumple el tamaño mínimo"
- FA-4.4: Ya tiene submission → Error: "Tu equipo ya envió un proyecto"
CU-5: Editar Submission
Actor: PARTICIPANT (miembro del equipo)
Precondiciones:
- Usuario es miembro del equipo
- Equipo tiene submission
now < submissionDeadlinehackathon.status != JUDGING && != FINISHED
Flujo Principal:
- Usuario va a
/hackathons/[slug]/teams/[teamId]/submit - Ve formulario pre-llenado con datos actuales
- Modifica campos deseados
- Sistema valida precondiciones
- Sistema actualiza
Submission - Mensaje de éxito: "Submission actualizada"
Flujos Alternativos:
- FA-5.1: Pasó deadline → Botón "Editar" desaparece, solo lectura
- FA-5.2: Hackathon en JUDGING → Error: "No se puede editar durante la evaluación"
Validaciones Críticas
Al Registrarse
// Validaciones en Server Action
export async function registerForHackathon(hackathonId: string) {
const user = await getCurrentUser();
requireRole(user, ['PARTICIPANT']);
const hackathon = await db.hackathon.findUnique({
where: { id: hackathonId },
});
// Validar estado
if (hackathon.status !== 'REGISTRATION') {
throw new Error('Hackathon no está abierto para registro');
}
// Validar fechas
const now = new Date();
if (now < hackathon.registrationOpensAt || now > hackathon.registrationClosesAt) {
throw new Error('Fuera de la ventana de registro');
}
// Validar no duplicado
const existing = await db.hackathonParticipation.findUnique({
where: {
hackathonId_profileId: {
hackathonId,
profileId: user.profile.id,
},
},
});
if (existing) {
throw new Error('Ya estás registrado en este hackathon');
}
// Crear participación
await db.hackathonParticipation.create({
data: {
hackathonId,
profileId: user.profile.id,
},
});
}
Al Formar Equipo
// Validaciones
- hackathon.status IN (REGISTRATION, RUNNING)
- now < submissionDeadline
- Usuario registrado en hackathon
- Usuario no tiene otro equipo
Al Unirse
// Validaciones adicionales
- Código existe y pertenece al mismo hackathon
- Equipo no ha alcanzado maxTeamSize
Al Enviar Submission
// Validaciones
- hackathon.status: RUNNING
- now < submissionDeadline
- Usuario es miembro del equipo
- Equipo tiene tamaño >= minTeamSize
- Equipo no tiene submission previa (DB constraint)
Restricciones Temporales
Crear/Unirse/Salir de Equipo
Permitido hasta: submissionDeadline
Después de deadline: Solo lectura, no se pueden hacer cambios
Editar Submission
Permitido hasta: submissionDeadline
Después de deadline:
- Botón "Editar" desaparece
- Formulario en solo lectura
- Mensaje: "Submission bloqueada (fecha límite superada)"
Diagrama de Estados
Próximos Pasos
- Judge Flow - Flujo del juez
- Organizer Flow - Flujo del organizador
- Business Logic - Team Formation - Lógica de equipos
Siguiente: Judge Flow