Skip to content

Rutinas de Entrenamiento

Endpoints para crear y gestionar rutinas de entrenamiento.

Los siguientes modelos de Prisma pertenecen al schema fitness:

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")
}
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")
}
enum RoutineDifficulty {
BEGINNER
INTERMEDIATE
ADVANCED
EXPERT
@@schema("fitness")
}

Obtener una lista de rutinas de entrenamiento.

  • URL: /api/v1/workouts/routines
  • Método: GET
  • Autenticación Requerida:

Este endpoint obtiene rutinas de entrenamiento:

  1. Filtros disponibles:

    • name: Búsqueda por nombre (contains, case-insensitive)
    • difficulty: BEGINNER, INTERMEDIATE, ADVANCED
    • targetMuscles: Array de músculos objetivo
    • equipment: Array de equipamiento
    • tags: Array de etiquetas
    • isPublic/isActive: Filtros booleanos
    • createdBy: Filtrar por creador
    • minDuration/maxDuration: Duración estimada
  2. Incluye:

    • createdBy (id, name)
    • exercises con detalles del ejercicio
    • Contadores de assignments y logs
  • isPublic: Filtrar por status público
  • difficulty: Filtrar por dificultad
  • targetMuscles: Filtrar por músculos objetivo
  • equipment: Filtrar por equipamiento
  • page: Número de página
  • limit: Resultados por página
{
"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": {...}
}
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 una rutina específica con ejercicios.

  • URL: /api/v1/workouts/routines/:id
  • Método: GET
  • Autenticación Requerida:

Este endpoint obtiene una rutina específica:

  1. Incluye:
    • createdBy con email
    • exercises ordenados por order ascendente
    • Cada ejercicio incluye detalles completos (instructions, gifUrl)
    • assignments activos con userProfile
    • Contadores

Crear una nueva rutina de entrenamiento.

  • URL: /api/v1/workouts/routines
  • Método: POST
  • Autenticación Requerida:

Este endpoint crea una nueva rutina:

  1. Obtiene createdById del token

  2. Crea la rutina con nested create para exercises:

    • Para cada ejercicio: exerciseId, order, sets, reps, weight, duration, distance, restTime, notes, dropSets, rpeTarget
  3. Retorna rutina con exercises ordenados y createdBy

{
"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
}
]
}
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 una rutina existente.

  • URL: /api/v1/workouts/routines/:id
  • Método: PUT
  • Autenticación Requerida:

Este endpoint actualiza una rutina:

  1. Si se proporcionan exercises:

    • Primero elimina TODOS los RoutineExercise existentes
    • Luego crea los nuevos con nested create
  2. Actualiza los demás campos de la rutina

Nota: La actualización de exercises es un reemplazo completo, no parcial.


Eliminar una rutina.

  • URL: /api/v1/workouts/routines/:id
  • Método: DELETE
  • Autenticación Requerida: