Skip to main content

Módulo Actividades

El módulo Activities (src/domains/activities/) gestiona las actividades socioemocionales que los participantes realizan en la plataforma Vibra.

Schema Activity

Definido en schemas/activity.schema.ts. Colección MongoDB: activities.

CampoTipoDescripción
idstring (único)Identificador secuencial auto-generado (ACT-001)
titlestring (requerido)Título de la actividad
descriptionstringDescripción opcional
emotionObjectIdEmotionEmoción asociada (ref, indexado)
typeenumreto, evento_personal, actividad_pares, otro (indexado)
difficultynumber (1–5)Nivel de dificultad (default: 3)
isActivebooleanSi está activa (default: true, indexado)
resourcesArrayRecursos multimedia: { type: 'video'|'audio', url, duration, metadata }
questionsArrayPreguntas: { id, questionText, type: 'multiple'|'open', options, correctAnswer, points }
gamesArrayJuegos gamificados incrustados (ver abajo)
tipsArrayTips con emoji, mensaje y categoría
scheduleObjectProgramación: { date, weekNumber, year }
createdAtDateFecha de creación
updatedAtDateFecha de actualización

Juegos disponibles (games[])

Cada juego se define con { type, config, order }:

  • WordSearch — Sopa de letras con vocabulario emocional
  • MatchingConcepts — Emparejamiento de conceptos
  • DiceGame — Juego de dados con preguntas
  • EmotionBox — Caja de emociones interactiva

Índices compuestos

Definidos en el schema:

ActivitySchema.index({ type: 1 })
ActivitySchema.index({ isActive: 1 })
ActivitySchema.index({ 'schedule.date': 1 })

Endpoints CRUD

MétodoRutaDescripciónPermiso
POST/api/activitiesCrear actividad16
GET/api/activitiesListar activas (paginado, filtro por emoción)Bypass
GET/api/activities/allListar (paginado, sin filtros)
GET/api/activities/:idObtener por ID
PUT/api/activities/:idActualizar (incluye isActive)16
DELETE/api/activities/:idSoft delete (isActive=false)16

Submit de respuestas

POST /api/activities/:id/:userId/submit

Procesa las respuestas del usuario a las preguntas de una actividad. El servicio processResponse():

  1. Busca la actividad y sus preguntas
  2. Compara cada respuesta con correctAnswer
  3. Calcula totalScore sumando puntos de respuestas correctas
  4. Guarda/actualiza el UserResponse en MongoDB
  5. Retorna { activityId, userId, results, totalScore }

Actividad del día

GET /api/activities/daily/current

Retorna la actividad activa programada para la fecha actual mediante dos estrategias:

  1. Schedule match — Busca por schedule.date igual al día de hoy usando agregación con $dateToString
  2. Fallback — Si no hay actividad agendada, busca la última creada hoy sin schedule

Respuesta: { activity, schedule: { date, status: 'active'\|'no_activity' } }

Filtros por tipo

GET /api/activities/user/:userId?type=reto&page=1&limit=10

Filtra actividades completadas por un usuario según el tipo:

  • reto — Actividades tipo reto
  • evento_personal — Actividades de reflexión personal
  • actividad_pares — Actividades colaborativas entre pares

El controller expone además:

  • GET /api/activities/count-by-type?type=reto — Conteo de actividades activas por tipo
  • GET /api/activities/count-all-activities — Conteo total
  • GET /api/activities/by-month?year=2026&courseId=... — Actividades completadas agrupadas por mes

Notificaciones push al crear actividad

Cuando se crea una actividad con schedule.date igual al día actual, el servicio envía automáticamente notificaciones push a todos los dispositivos registrados vía Expo Push API.