Skip to main content

Módulo Participantes

El módulo Participant (src/domains/participant/) gestiona los datos de participación y progreso gamificado de los usuarios en la plataforma Vibra.

Schema Participant

Definido en schemas/participant.schema.ts. Colección: participants.

CampoTipoDescripción
userIdObjectIdUser (único)Referencia al usuario
nicknamestring (requerido)Apodo visible
avatarstringURL del avatar
pointsnumberPuntos acumulados (default: 0)
levelenumNivel: bronce, plata, oro, platino, diamante
currentStreaknumberRacha actual de días consecutivos
maxStreaknumberRacha máxima histórica
totalActivitiesCompletednumberTotal de actividades completadas
lastActivityDateDateFecha de última actividad
currentCourseObjectIdCourseCurso actual del participante
preferencesObject{ language, notifications }
lastSessionDateDateÚltima sesión
isActivebooleanEstado activo

Sistema de niveles (calculateLevel)

points >= 1000'diamante'
points >= 600'platino'
points >= 300'oro'
points >= 100'plata'
else'bronce'

Relación con Users y Courses

  • userIdUser: cada participante es un usuario del sistema (relación 1:1)
  • currentCourseCourse: curso en el que está inscrito el participante

Endpoints

MétodoRutaDescripciónPermiso
POST/api/participantsCrear participante (desde registro User)
GET/api/participantsListar participantes (paginado)9
GET/api/participants/by-user/:userIdObtener por userId
GET/api/participants/:idObtener por _id9
POST/api/participants/updateActualizar participanteBypass
POST/api/participants/deleteEliminar participante9
PATCH/api/participants/:id/pointsIncrementar puntos + streak + level
GET/api/participants/:id/activity-historyHistorial de actividades por día
GET/api/participants/leaderboardLeaderboard del curso por puntos
GET/api/participants/count-all-participantsConteo totalBypass
GET/api/participants/searchBuscar participantes9
POST/api/participants/bulkCarga masiva CSV9

Actualización de puntos (PATCH /:id/points)

El servicio updatePoints() ejecuta:

  1. Incrementa points según dto.pointsIncrement
  2. Recalcula level vía calculateLevel()
  3. Si activityCompleted=true: incrementa totalActivitiesCompleted, actualiza currentStreak (día consecutivo, reinicio si >1 día de diferencia), actualiza maxStreak
  4. Guarda y retorna { points, level, currentStreak, maxStreak, totalActivitiesCompleted, lastActivityDate }

Activity History (GET /:id/activity-history)

Usa agregación sobre WeeklySchedule para obtener el historial de los últimos N días con { date, count }, rellenando días sin actividad con count=0.

Leaderboard (GET /leaderboard)

Retorna top N participantes (default: 20) ordenados por puntos descendente, filtrado por courseId opcional. Incluye rank calculado como número de posición.