Asignaciones de Rutinas
Endpoints para asignar rutinas a usuarios y seguir progreso.
Modelos de Datos
Section titled “Modelos de Datos”Los siguientes modelos de Prisma pertenecen al schema fitness:
RoutineAssignment
Section titled “RoutineAssignment”model RoutineAssignment { id String @id @default(cuid()) routineId String @map("routine_id") userProfileId String @map("user_profile_id") assignedById String @map("assigned_by_id")
startDate DateTime @map("start_date") endDate DateTime? @map("end_date") frequency AssignmentFrequency @default(FLEXIBLE)
status AssignmentStatus @default(ACTIVE) isActive Boolean @default(true) @map("is_active")
completedSessions Int @default(0) @map("completed_sessions") totalSessions Int? @map("total_sessions")
notes String? userNotes String? @map("user_notes")
routine WorkoutRoutine @relation(fields: [routineId], references: [id], onDelete: Cascade) userProfile UserProfile @relation("AssignedRoutines", fields: [userProfileId], references: [id], onDelete: Cascade) assignedBy UserProfile @relation("AssignedRoutinesByMe", fields: [assignedById], references: [id], onDelete: Cascade)
createdAt DateTime @default(now()) @map("created_at") updatedAt DateTime @updatedAt @map("updated_at")
@@unique([routineId, userProfileId]) @@map("routine_assignments") @@schema("fitness")}AssignmentFrequency (Enum)
Section titled “AssignmentFrequency (Enum)”enum AssignmentFrequency { DAILY EVERY_OTHER_DAY THREE_TIMES_WEEK FOUR_TIMES_WEEK FIVE_TIMES_WEEK WEEKLY FLEXIBLE
@@schema("fitness")}AssignmentStatus (Enum)
Section titled “AssignmentStatus (Enum)”enum AssignmentStatus { ACTIVE PAUSED COMPLETED CANCELLED
@@schema("fitness")}Endpoints
Section titled “Endpoints”Obtener Asignaciones de Rutinas
Section titled “Obtener Asignaciones de Rutinas”Obtener asignaciones de rutinas con filtros.
- URL:
/api/v1/workouts/assignments - Método:
GET - Autenticación Requerida: Sí (Admin/Staff para todas)
Descripción Interna
Section titled “Descripción Interna”Este endpoint obtiene asignaciones de rutinas:
-
Filtros disponibles:
userId: Por usuario asignadoroutineId: Por rutinaassignedBy: Por quien asignóstatus: Estado de la asignaciónfrequency: DAILY, WEEKLY, etc.isActive: Solo asignaciones activasstartDate/endDate: Rango de fechas
-
Incluye:
- routine (id, name, difficulty, estimatedDuration)
- userProfile
- assignedBy
-
Usa Promise.all para obtener assignments y total en paralelo
Respuesta
Section titled “Respuesta”{ "data": [ { "id": "...", "startDate": "2023-10-01", "endDate": "2023-12-31", "frequency": "WEEKLY", "targetSessionsPerWeek": 3, "completedSessions": 8, "status": "ACTIVE", "routine": {...}, "userProfile": {...}, "assignedBy": {...} } ], "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.workouts.assignments.$get({ query: {}})Crear Asignación de Rutina
Section titled “Crear Asignación de Rutina”Asignar una rutina a un usuario.
- URL:
/api/v1/workouts/assignments - Método:
POST - Autenticación Requerida: Sí (Trainer/Admin/Staff)
Descripción Interna
Section titled “Descripción Interna”Este endpoint asigna una rutina:
- Verifica duplicados: Busca asignación existente con mismo routineId + userProfileId
- Si existe y está activa: Lanza error 400
- Crea asignación con:
- assignedById del token
- startDate y endDate convertidos a Date
Cuerpo de Solicitud
Section titled “Cuerpo de Solicitud”{ "routineId": "routine_id", "userProfileId": "user_profile_id", "startDate": "2023-10-01", "endDate": "2023-12-31", "frequency": "WEEKLY", "targetSessionsPerWeek": 3, "notes": "Focus on form"}Errores Comunes
Section titled “Errores Comunes”400 Bad Request: El usuario ya tiene una asignación activa para esta rutina
Obtener Mis Asignaciones de Rutinas
Section titled “Obtener Mis Asignaciones de Rutinas”Obtener asignaciones de rutinas para el usuario actual.
- URL:
/api/v1/workouts/assignments/me - Método:
GET - Autenticación Requerida: Sí
Descripción Interna
Section titled “Descripción Interna”Este endpoint es un wrapper que filtra por el userId del token autenticado.
Actualizar Progreso de Asignación
Section titled “Actualizar Progreso de Asignación”Actualizar progreso al completar un entrenamiento (interno).
- URL: Función interna
- Autenticación Requerida: N/A
Descripción Interna
Section titled “Descripción Interna”Esta función se llama internamente cuando se completa un workout:
- Busca asignación por routineId + userProfileId
- Si existe y está activa: Incrementa completedSessions
- Retorna null si no hay asignación