Saltar al contenido principal

👥 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:

  1. Usuario navega a /hackathons
  2. Ve lista de hackathons con status: REGISTRATION
  3. Clic en "Participar" en un hackathon
  4. Sistema valida:
    • Rol es PARTICIPANT
    • Hackathon está en REGISTRATION
    • Fecha actual dentro de ventana
    • Usuario no está ya registrado
  5. Sistema crea HackathonParticipation
  6. 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:

  1. Usuario va a /hackathons/[slug]/teams/create
  2. Ingresa: name, description (opcional)
  3. Sistema valida precondiciones
  4. Sistema genera code único (ej: "HX42YZ")
  5. Sistema crea:
    • Team con hackathonId, name, code
    • TeamMember con isLeader: true
  6. Muestra código para compartir
  7. 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:

  1. Usuario va a /hackathons/[slug]/teams/join
  2. Ingresa código de equipo
  3. Sistema valida:
    • Código existe
    • Equipo pertenece al mismo hackathon
    • Equipo no ha alcanzado maxTeamSize
    • Usuario está registrado
    • Usuario no tiene otro equipo
  4. Sistema crea TeamMember
  5. Mensaje de éxito: "Te has unido al equipo [nombre]"
  6. 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: RUNNING
  • now < submissionDeadline
  • Equipo tiene tamaño >= minTeamSize
  • Equipo no tiene submission previa

Flujo Principal:

  1. Usuario va a /hackathons/[slug]/teams/[teamId]/submit
  2. Completa formulario:
    • title (requerido)
    • description (requerido)
    • repoUrl (opcional)
    • demoUrl (opcional)
    • challengeId (opcional - elegir de lista)
    • Campos técnicos detallados
  3. Sistema valida precondiciones
  4. Sistema crea Submission
  5. Si challengeId presente, crea SubmissionChallenge
  6. Mensaje de éxito: "Submission enviada exitosamente"
  7. 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 < submissionDeadline
  • hackathon.status != JUDGING && != FINISHED

Flujo Principal:

  1. Usuario va a /hackathons/[slug]/teams/[teamId]/submit
  2. Ve formulario pre-llenado con datos actuales
  3. Modifica campos deseados
  4. Sistema valida precondiciones
  5. Sistema actualiza Submission
  6. 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


Siguiente: Judge Flow