Rachas
Endpoints para seguimiento y gestión de rachas de actividad.
Modelos de Datos
Section titled “Modelos de Datos”El siguiente modelo de Prisma pertenece al schema gamification:
Streak
Section titled “Streak”model Streak { id String @id @default(cuid()) userProfileId String @map("user_profile_id") goalId String? @map("goal_id") type StreakType
currentStreak Int @default(0) @map("current_streak") longestStreak Int @default(0) @map("longest_streak") totalDays Int @default(0) @map("total_days")
lastActivityDate DateTime? @map("last_activity_date") streakStartDate DateTime? @map("streak_start_date")
freezesUsed Int @default(0) @map("freezes_used") freezesAvailable Int @default(0) @map("freezes_available")
isActive Boolean @default(true) @map("is_active")
userProfile UserProfile @relation(fields: [userProfileId], references: [id], onDelete: Cascade) goal Goal? @relation(fields: [goalId], references: [id], onDelete: Cascade)
createdAt DateTime @default(now()) @map("created_at") updatedAt DateTime @updatedAt @map("updated_at")
@@unique([userProfileId, type, goalId]) @@map("streaks") @@schema("gamification")}StreakType (Enum)
Section titled “StreakType (Enum)”enum StreakType { WORKOUT_STREAK GOAL_STREAK ATTENDANCE_STREAK CLASS_STREAK
@@schema("gamification")}Lógica de Rachas
Section titled “Lógica de Rachas”Las rachas se actualizan automáticamente al registrar progreso en un objetivo:
- Día consecutivo: currentStreak++
- Día no consecutivo (1-3 días): Usa freeze si disponible
- Más de 3 días: Reinicia a 1
Endpoints
Section titled “Endpoints”Obtener Rachas
Section titled “Obtener Rachas”Obtener rachas del usuario.
- URL:
/api/v1/gamification/streaks - Método:
GET - Autenticación Requerida: Sí
Descripción Interna
Section titled “Descripción Interna”Este endpoint obtiene las rachas del usuario:
-
Filtros disponibles:
type: Tipo de racha (GOAL_STREAK, WORKOUT_STREAK, etc.)isActive: Solo rachas activasgoalId: Filtrar por objetivo específico
-
Incluye información del goal asociado (id, title, type)
-
Ordenado por currentStreak descendente
Parámetros de Consulta de Solicitud
Section titled “Parámetros de Consulta de Solicitud”type: Tipo de rachaisActive: Filtrar rachas activasgoalId: Filtrar por objetivopage: Número de páginalimit: Resultados por página
Respuesta
Section titled “Respuesta”{ "data": [ { "id": "...", "type": "WORKOUT_STREAK", "currentStreak": 15, "longestStreak": 30, "totalDays": 120, "lastActivityDate": "2023-10-27T00:00:00Z", "streakStartDate": "2023-10-12T00:00:00Z", "freezesUsed": 2, "freezesAvailable": 3, "isActive": true, "goal": { "id": "...", "title": "Daily Workout", "type": "GENERAL_FITNESS" } } ], "pagination": {...}}Ejemplo de Cliente Hono
Section titled “Ejemplo de Cliente Hono”import { hcWithType } from '@vitality-gym/api/client'
const client = hcWithType('http://localhost:3000')
const res = await client.api.v1.gamification.streaks.$get({ query: { isActive: 'true' }})Obtener Racha por ID
Section titled “Obtener Racha por ID”Obtener una racha específica con historial.
- URL:
/api/v1/gamification/streaks/:id - Método:
GET - Autenticación Requerida: Sí
Obtener Mis Mejores Rachas
Section titled “Obtener Mis Mejores Rachas”Obtener las mejores rachas del usuario.
- URL:
/api/v1/gamification/streaks/best - Método:
GET - Autenticación Requerida: Sí
Respuesta
Section titled “Respuesta”{ "data": { "currentBest": { "type": "WORKOUT_STREAK", "currentStreak": 15 }, "allTimeBest": { "type": "GOAL_STREAK", "longestStreak": 45 }, "topStreaks": [...] }}Usar Congelación de Racha
Section titled “Usar Congelación de Racha”Usar una congelación para proteger una racha.
- URL:
/api/v1/gamification/streaks/:id/freeze - Método:
POST - Autenticación Requerida: Sí
Descripción Interna
Section titled “Descripción Interna”Este endpoint usa un freeze para proteger una racha:
- Verifica que el streak tenga freezes disponibles
- Verifica que la racha esté activa
- Actualiza freezesUsed++ y freezesAvailable—
- Marca el día como wasFrozen
Respuesta
Section titled “Respuesta”{ "data": { "id": "...", "freezesUsed": 3, "freezesAvailable": 2, "message": "Freeze used successfully" }}Añadir Congelaciones de Racha (Admin)
Section titled “Añadir Congelaciones de Racha (Admin)”Añadir congelaciones a la racha de un usuario.
- URL:
/api/v1/gamification/streaks/:id/add-freezes - Método:
POST - Autenticación Requerida: Sí (Admin)
Cuerpo de Solicitud
Section titled “Cuerpo de Solicitud”{ "amount": 3}Tipos de Racha
Section titled “Tipos de Racha”| Tipo | Descripción |
|---|---|
WORKOUT_STREAK | Entrenamientos consecutivos |
GOAL_STREAK | Cumplimiento de objetivos diarios |
ATTENDANCE_STREAK | Asistencia al gimnasio |
CLASS_STREAK | Asistencia a clases |