Saltar al contenido principal

🏆 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 alto
  • GOLD - Tier medio
  • SILVER - 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 challenge
  • description: Descripción detallada
  • sponsorshipId: Sponsorship asociado
  • hackathonId: 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:

  1. Fulfillment Score (40%): ¿Cumple con el challenge?
  2. Technical Score (30%): Calidad técnica
  3. Adoption Score (20%): Potencial de adopción
  4. 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


Siguiente: Leaderboard Calculation