Rutinas de Entrenamiento
Endpoints para crear y gestionar rutinas de entrenamiento.
Modelos de Datos
Section titled “Modelos de Datos”Los siguientes modelos de Prisma pertenecen al schema fitness:
WorkoutRoutine
Section titled “WorkoutRoutine”model WorkoutRoutine { id String @id @default(cuid()) name String description String?
difficulty RoutineDifficulty @default(BEGINNER) estimatedDuration Int? @map("estimated_duration") targetMuscles String[] @map("target_muscles") equipment String[] tags String[]
isPublic Boolean @default(false) @map("is_public") isActive Boolean @default(true) @map("is_active") createdById String @map("created_by_id")
createdBy UserProfile @relation("CreatedRoutines", fields: [createdById], references: [id], onDelete: Cascade) exercises RoutineExercise[] assignments RoutineAssignment[] logs WorkoutLog[]
createdAt DateTime @default(now()) @map("created_at") updatedAt DateTime @updatedAt @map("updated_at")
@@map("workout_routines") @@schema("fitness")}RoutineExercise
Section titled “RoutineExercise”model RoutineExercise { id String @id @default(cuid()) routineId String @map("routine_id") exerciseId String @map("exercise_id")
order Int
sets Int? reps Int? weight Float? duration Int? distance Float? restTime Int? @map("rest_time")
notes String?
dropSets Boolean @default(false) @map("drop_sets") rpeTarget Int? @map("rpe_target")
routine WorkoutRoutine @relation(fields: [routineId], references: [id], onDelete: Cascade) exercise Exercise @relation(fields: [exerciseId], references: [id], onDelete: Cascade)
@@unique([routineId, order]) @@map("routine_exercises") @@schema("fitness")}RoutineDifficulty (Enum)
Section titled “RoutineDifficulty (Enum)”enum RoutineDifficulty { BEGINNER INTERMEDIATE ADVANCED EXPERT
@@schema("fitness")}Endpoints
Section titled “Endpoints”Obtener Rutinas de Entrenamiento
Section titled “Obtener Rutinas de Entrenamiento”Obtener una lista de rutinas de entrenamiento.
- URL:
/api/v1/workouts/routines - Método:
GET - Autenticación Requerida: Sí
Descripción Interna
Section titled “Descripción Interna”Este endpoint obtiene rutinas de entrenamiento:
-
Filtros disponibles:
name: Búsqueda por nombre (contains, case-insensitive)difficulty: BEGINNER, INTERMEDIATE, ADVANCEDtargetMuscles: Array de músculos objetivoequipment: Array de equipamientotags: Array de etiquetasisPublic/isActive: Filtros booleanoscreatedBy: Filtrar por creadorminDuration/maxDuration: Duración estimada
-
Incluye:
- createdBy (id, name)
- exercises con detalles del ejercicio
- Contadores de assignments y logs
Parámetros de Consulta de Solicitud
Section titled “Parámetros de Consulta de Solicitud”isPublic: Filtrar por status públicodifficulty: Filtrar por dificultadtargetMuscles: Filtrar por músculos objetivoequipment: Filtrar por equipamientopage: Número de páginalimit: Resultados por página
Respuesta
Section titled “Respuesta”{ "data": [ { "id": "...", "name": "Full Body", "description": "Complete full body workout", "difficulty": "INTERMEDIATE", "estimatedDuration": 60, "targetMuscles": ["Chest", "Back", "Legs"], "equipment": ["Barbell", "Dumbbells"], "isPublic": true, "createdBy": {...}, "exercises": [...], "_count": { "assignments": 25, "logs": 150 } } ], "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.routines.$get({ query: { isPublic: 'true' }})Obtener Rutina por ID
Section titled “Obtener Rutina por ID”Obtener una rutina específica con ejercicios.
- URL:
/api/v1/workouts/routines/:id - Método:
GET - Autenticación Requerida: Sí
Descripción Interna
Section titled “Descripción Interna”Este endpoint obtiene una rutina específica:
- Incluye:
- createdBy con email
- exercises ordenados por
orderascendente - Cada ejercicio incluye detalles completos (instructions, gifUrl)
- assignments activos con userProfile
- Contadores
Crear Rutina de Entrenamiento
Section titled “Crear Rutina de Entrenamiento”Crear una nueva rutina de entrenamiento.
- URL:
/api/v1/workouts/routines - Método:
POST - Autenticación Requerida: Sí
Descripción Interna
Section titled “Descripción Interna”Este endpoint crea una nueva rutina:
-
Obtiene createdById del token
-
Crea la rutina con nested create para exercises:
- Para cada ejercicio: exerciseId, order, sets, reps, weight, duration, distance, restTime, notes, dropSets, rpeTarget
-
Retorna rutina con exercises ordenados y createdBy
Cuerpo de Solicitud
Section titled “Cuerpo de Solicitud”{ "name": "Full Body", "description": "Full body workout", "difficulty": "INTERMEDIATE", "estimatedDuration": 60, "targetMuscles": ["Chest", "Back", "Legs"], "equipment": ["Barbell"], "isPublic": true, "exercises": [ { "exerciseId": "exercise_id", "order": 1, "sets": 3, "reps": 10, "weight": 50, "restTime": 60 } ]}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.routines.$post({ json: { name: 'Full Body', description: 'Full body workout', isPublic: true, exercises: [...] }})Actualizar Rutina de Entrenamiento
Section titled “Actualizar Rutina de Entrenamiento”Actualizar una rutina existente.
- URL:
/api/v1/workouts/routines/:id - Método:
PUT - Autenticación Requerida: Sí
Descripción Interna
Section titled “Descripción Interna”Este endpoint actualiza una rutina:
-
Si se proporcionan exercises:
- Primero elimina TODOS los RoutineExercise existentes
- Luego crea los nuevos con nested create
-
Actualiza los demás campos de la rutina
Nota: La actualización de exercises es un reemplazo completo, no parcial.
Eliminar Rutina de Entrenamiento
Section titled “Eliminar Rutina de Entrenamiento”Eliminar una rutina.
- URL:
/api/v1/workouts/routines/:id - Método:
DELETE - Autenticación Requerida: Sí