Ejercicios
Endpoints para la biblioteca de ejercicios.
Modelos de Datos
Section titled “Modelos de Datos”El siguiente modelo de Prisma pertenece al schema fitness:
Exercise
Section titled “Exercise”model Exercise { id String @id @default(cuid()) name String gifUrl String? @map("gif_url") targetMuscles String[] @map("target_muscles") secondaryMuscles String[] @map("secondary_muscles")
bodyParts String[] @map("body_parts") equipments String[] instructions String[]
workoutExercises WorkoutExercise[] routineExercises RoutineExercise[]
createdAt DateTime @default(now()) @map("created_at") updatedAt DateTime @updatedAt @map("updated_at")
@@map("exercises") @@schema("fitness")}Endpoints
Section titled “Endpoints”Obtener Ejercicios
Section titled “Obtener Ejercicios”Obtener una lista de ejercicios con filtros.
- URL:
/api/v1/exercises - Método:
GET - Autenticación Requerida: Sí
Descripción Interna
Section titled “Descripción Interna”Este endpoint obtiene ejercicios de la biblioteca con caching y filtrado:
-
Sistema de Caché (Redis):
- Clave:
exercises:list:{filtros_serializados} - TTL: 5 minutos para listas
- Si existe en caché, retorna inmediatamente
- Clave:
-
Filtros disponibles:
name: Búsqueda por nombre (contains, case-insensitive)targetMuscles: Filtra por músculos objetivo (hasSome para arrays)secondaryMuscles: Filtra por músculos secundariosbodyParts: Filtra por partes del cuerpoequipments: Filtra por equipamiento necesario
-
Paginación: Usa
pageylimitcon cálculo de skip -
Ordenamiento: Por nombre ascendente
-
Transacción: Ejecuta findMany y count en paralelo
Parámetros de Consulta de Solicitud
Section titled “Parámetros de Consulta de Solicitud”name: Buscar por nombretargetMuscles: Filtrar por músculo(s) objetivosecondaryMuscles: Filtrar por músculo(s) secundario(s)bodyParts: Filtrar por parte(s) del cuerpoequipments: Filtrar por equipamiento(s)page: Número de página (por defecto: 1)limit: Resultados por página (por defecto: 10)
Respuesta
Section titled “Respuesta”{ "data": [ { "id": "...", "name": "Squat", "targetMuscles": ["Quadriceps"], "secondaryMuscles": ["Glutes", "Hamstrings"], "instructions": "...", "gifUrl": "..." } ], "pagination": { "page": 1, "limit": 10, "total": 150, "totalPages": 15 }}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.exercises.$get({ query: { targetMuscles: 'Legs' }})Obtener Ejercicio por ID
Section titled “Obtener Ejercicio por ID”Obtener detalles de un ejercicio específico.
- URL:
/api/v1/exercises/:id - Método:
GET - Autenticación Requerida: Sí
Descripción Interna
Section titled “Descripción Interna”Este endpoint obtiene un ejercicio específico con caché:
- Verifica caché: Clave
exercises:{id}, TTL 24 horas - Si no está en caché: Busca en BD con
findUniqueOrThrow - Guarda en caché el resultado para futuras consultas
- Retorna todos los campos del ejercicio
Respuesta
Section titled “Respuesta”{ "data": { "id": "...", "name": "Squat", "description": "...", "targetMuscles": ["Quadriceps"], "secondaryMuscles": ["Glutes"], "bodyParts": ["Legs"], "equipments": ["Barbell"], "instructions": "...", "gifUrl": "..." }}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.exercises[':id'].$get({ param: { id: 'exercise_id' }})Crear Ejercicio
Section titled “Crear Ejercicio”Añadir un nuevo ejercicio a la biblioteca.
- URL:
/api/v1/exercises - Método:
POST - Autenticación Requerida: Sí
Descripción Interna
Section titled “Descripción Interna”Este endpoint crea un nuevo ejercicio:
- Crea el ejercicio en la base de datos con todos los campos proporcionados
- Invalida caché de listas: Elimina todas las claves
exercises:list:*para que las búsquedas reflejen el nuevo ejercicio - Retorna el ejercicio creado
Campos del Ejercicio
Section titled “Campos del Ejercicio”name: Nombre del ejercicio (requerido)description: Descripción detalladatargetMuscles: Array de músculos principalessecondaryMuscles: Array de músculos secundariosbodyParts: Partes del cuerpo trabajadasequipments: Equipamiento necesarioinstructions: Instrucciones paso a pasogifUrl: URL del GIF demostrativo
Cuerpo de Solicitud
Section titled “Cuerpo de Solicitud”{ "name": "Squat", "description": "Lower body exercise", "targetMuscles": ["Quadriceps"], "secondaryMuscles": ["Glutes", "Hamstrings"], "bodyParts": ["Legs"], "equipments": ["Barbell"], "instructions": "1. Stand with feet shoulder-width apart...", "gifUrl": "https://..."}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.exercises.$post({ json: { name: 'Squat', description: 'Lower body exercise', targetMuscles: ['Quadriceps'], secondaryMuscles: ['Glutes'], bodyParts: ['Legs'], equipments: ['Barbell'] }})Actualizar Ejercicio
Section titled “Actualizar Ejercicio”Actualizar un ejercicio existente.
- URL:
/api/v1/exercises/:id - Método:
PUT - Autenticación Requerida: Sí
Descripción Interna
Section titled “Descripción Interna”Este endpoint actualiza un ejercicio existente:
- Actualiza el ejercicio con los campos proporcionados
- Invalida caché individual: Elimina
exercises:{id} - Invalida caché de listas: Elimina
exercises:list:* - Retorna el ejercicio actualizado
Cuerpo de Solicitud (Parcial)
Section titled “Cuerpo de Solicitud (Parcial)”{ "name": "Barbell Squat", "description": "Updated description"}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.exercises[':id'].$put({ param: { id: 'exercise_id' }, json: { name: 'Barbell Squat' }})Eliminar Ejercicio
Section titled “Eliminar Ejercicio”Eliminar un ejercicio.
- URL:
/api/v1/exercises/:id - Método:
DELETE - Autenticación Requerida: Sí
Descripción Interna
Section titled “Descripción Interna”Este endpoint elimina un ejercicio:
- Invalida caché individual: Elimina
exercises:{id} - Invalida caché de listas: Elimina
exercises:list:* - Elimina el ejercicio de la base de datos
- Retorna el ejercicio eliminado
Advertencia: Verificar que el ejercicio no esté siendo usado en rutinas activas antes de eliminar.
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.exercises[':id'].$delete({ param: { id: 'exercise_id' }})