🏆 Sistema de Challenges
Visión General
El sistema de challenges permite a los sponsors crear desafíos específicos dentro de un hackathon, y a los participantes optar por resolverlos para obtener puntos adicionales.
Flujo Completo
Componentes
1. Organización (Organization)
Creación:
export async function createOrganization(
data: CreateOrganizationInput,
currentUserId: string
)
Validaciones:
- ✅ Solo SPONSOR/ADMIN puede crear
- ✅ Usuario se convierte en OWNER automáticamente
2. Sponsorship
Creación:
export async function createSponsorship(
data: CreateSponsorshipInput,
currentUserId: string
)
Tiers:
PLATINUM- Tier más altoGOLD- Tier medioSILVER- Tier básico
Validaciones:
- ✅ Solo miembros de la organización pueden crear
- ✅ Organización debe existir
- ✅ Hackathon debe existir
3. Challenge
Creación:
export async function createChallenge(
data: CreateChallengeInput,
currentUserId: string
)
Campos:
title: Título del challengedescription: Descripción detalladasponsorshipId: Sponsorship asociadohackathonId: Hackathon donde se aplica
Validaciones:
- ✅ Solo miembros de la organización pueden crear
- ✅ Sponsorship debe pertenecer a la organización
- ✅ Hackathon debe existir
4. Optar por Challenge
Proceso:
Validaciones:
- ✅ Submission debe existir
- ✅ Challenge debe existir
- ✅ Submission debe pertenecer al hackathon del challenge
- ✅ No duplicar (unique constraint)
5. Evaluación de Challenge
Proceso:
Criterios de Evaluación:
- Fulfillment Score (40%): ¿Cumple con el challenge?
- Technical Score (30%): Calidad técnica
- Adoption Score (20%): Potencial de adopción
- Documentation Score (10%): Documentación específica
Cálculo:
const challengeScore = (
evaluation.fulfillmentScore * 0.4 +
evaluation.technicalScore * 0.3 +
evaluation.adoptionScore * 0.2 +
evaluation.documentationScore * 0.1
);
6. Shortlist
Proceso:
Propósito: Marcar submissions favoritas para seguimiento posterior
Integración con Leaderboard
Score de Challenge
Regla: Solo challenges aprobados cuentan para el leaderboard
Cálculo:
// Obtener evaluaciones aprobadas
const approvedEvaluations = submission.challengeEvaluations.filter(
e => e.sponsorApprovalStatus === 'APPROVED'
);
if (approvedEvaluations.length > 0) {
// Calcular score promedio
const challengeScores = approvedEvaluations.map(evaluation => {
return (
evaluation.fulfillmentScore * 0.4 +
evaluation.technicalScore * 0.3 +
evaluation.adoptionScore * 0.2 +
evaluation.documentationScore * 0.1
);
});
const averageChallengeScore = challengeScores.reduce((sum, val) => sum + val, 0) / challengeScores.length;
// Agregar 20% al score total
challengeScore = averageChallengeScore * 0.2;
}
Score Final:
const finalScore = Math.min(
normalizedTechnicalScore + challengeScore,
100 // Máximo 100 puntos
);
Restricciones
Visibilidad
- ✅ Challenges son visibles para todos los participantes
- ✅ Solo miembros de la organización pueden crear/gestionar
- ✅ Solo sponsors pueden aprobar evaluaciones
Evaluación
- ✅ Solo jueces asignados pueden evaluar
- ✅ Solo sponsors pueden aprobar
- ✅ Solo evaluaciones aprobadas cuentan para leaderboard
Shortlist
- ✅ Solo sponsors pueden shortlist
- ✅ Solo submissions con challenge pueden ser shortlisted
- ✅ Un submission puede estar en múltiples shortlists
Diagrama de Relaciones
Próximos Pasos
- Leaderboard Calculation - Cálculo completo
- Evaluation System - Sistema de evaluación
- Hackathon Lifecycle - Ciclo de vida
Siguiente: Leaderboard Calculation