👥 Formación de Equipos
Visión General
El sistema de formación de equipos en PuntoHack permite a los participantes crear equipos, unirse mediante códigos, y gestionar miembros con restricciones basadas en el estado del hackathon.
Flujo de Formación
Crear Equipo
Proceso
Validaciones
- RBAC: Solo PARTICIPANT puede crear equipos
- Un equipo por hackathon: No puede tener equipo en el mismo hackathon
- Estado del hackathon: Debe estar en REGISTRATION o RUNNING
- Deadline:
now < submissionDeadline - Código único: Generado automáticamente (6 caracteres alfanuméricos)
Código de Invitación
Formato: 6 caracteres alfanuméricos (sin 0, O, I, 1)
Generación:
function generateInviteCode(): string {
const chars = 'ABCDEFGHJKLMNPQRSTUVWXYZ23456789';
let code = '';
for (let i = 0; i < 6; i++) {
code += chars.charAt(Math.floor(Math.random() * chars.length));
}
return code;
}
Validación de Unicidad:
async function isInviteCodeUnique(code: string): Promise<boolean> {
const existing = await db.team.findUnique({
where: { code },
});
return existing === null;
}
Unirse a Equipo
Proceso
Validaciones
- Código existe: El código debe corresponder a un equipo
- Sin equipo previo: No puede tener equipo en el mismo hackathon
- Estado del hackathon: Debe estar en REGISTRATION o RUNNING
- Deadline:
now < submissionDeadline - Equipo no lleno:
team.members.length < hackathon.maxTeamSize
Salir de Equipo
Proceso
Reglas Especiales
- Último miembro con submission: No puede salir si es el último miembro y el equipo tiene submission
- Equipo vacío sin submission: Si el equipo queda vacío y no tiene submission, se elimina automáticamente
- Deadline: Solo puede salir antes de
submissionDeadline
Invitaciones por Email
Proceso
Validaciones
- Es miembro: Solo miembros del equipo pueden invitar
- Estado del hackathon: Debe estar en REGISTRATION o RUNNING
- Deadline:
now < submissionDeadline - Usuarios registrados: Los emails deben corresponder a usuarios registrados en el hackathon
- Sin equipo: Los usuarios no deben tener equipo en el hackathon
- Sin invitación pendiente: No debe haber invitación pendiente previa
Restricciones por Estado
REGISTRATION
Permitido:
- ✅ Crear equipos
- ✅ Unirse a equipos
- ✅ Salir de equipos
- ✅ Invitar por email
RUNNING
Permitido:
- ✅ Crear equipos (hasta
submissionDeadline) - ✅ Unirse a equipos (hasta
submissionDeadline) - ✅ Salir de equipos (hasta
submissionDeadline) - ✅ Invitar por email (hasta
submissionDeadline)
Restricciones:
- ❌ Después de
submissionDeadline: No se pueden crear/unirse/salir equipos
JUDGING / FINISHED
Restricciones:
- ❌ No se pueden crear equipos
- ❌ No se pueden unirse a equipos
- ❌ No se pueden salir de equipos
- ❌ No se pueden invitar
Validación de Tamaño
Al Crear Submission
Regla: El equipo debe tener al menos hackathon.minTeamSize miembros
const team = await getTeamById(teamId);
if (team.members.length < hackathon.minTeamSize) {
throw new Error(`Team must have at least ${hackathon.minTeamSize} members`);
}
Al Unirse
Regla: El equipo no debe exceder hackathon.maxTeamSize miembros
const team = await getTeamById(teamId);
if (team.members.length >= hackathon.maxTeamSize) {
throw new Error(`Team is full (max ${hackathon.maxTeamSize} members)`);
}
Líder del Equipo
Asignación
- El creador del equipo se convierte automáticamente en líder (
isLeader: true) - Solo puede haber un líder por equipo
Privilegios
- ✅ Puede invitar miembros
- ✅ Puede eliminar miembros (futuro)
- ✅ Puede editar información del equipo (futuro)
Diagrama de Estados del Equipo
Próximos Pasos
- Evaluation System - Sistema de evaluación
- Hackathon Lifecycle - Ciclo de vida completo
- Leaderboard Calculation - Cálculo de leaderboard
Siguiente: Evaluation System