Planes Nutricionales
Endpoints para crear y gestionar planes nutricionales.
Modelos de Datos
Section titled “Modelos de Datos”Los siguientes modelos de Prisma pertenecen al schema nutrition:
NutritionPlan
Section titled “NutritionPlan”model NutritionPlan { id String @id @default(cuid()) name String description String?
type PlanType difficulty PlanDifficulty @default(BEGINNER) duration Int? calorieTarget Int? @map("calorie_target")
proteinPercentage Float? @map("protein_percentage") carbPercentage Float? @map("carb_percentage") fatPercentage Float? @map("fat_percentage")
createdById String @map("created_by_id") isPublic Boolean @default(false) @map("is_public") isActive Boolean @default(true) @map("is_active")
tags String[]
createdBy UserProfile @relation("CreatedNutritionPlans", fields: [createdById], references: [id], onDelete: Cascade) assignments PlanAssignment[] planFoods PlanFood[]
createdAt DateTime @default(now()) @map("created_at") updatedAt DateTime @updatedAt @map("updated_at")
@@map("nutrition_plans") @@schema("nutrition")}PlanFood
Section titled “PlanFood”model PlanFood { id String @id @default(cuid()) planId String @map("plan_id") foodId String @map("food_id")
mealType MealType @map("meal_type") portion Float dayOfPlan Int? @map("day_of_plan") isOptional Boolean @default(false) @map("is_optional")
notes String? preparationTips String? @map("preparation_tips")
plan NutritionPlan @relation(fields: [planId], references: [id], onDelete: Cascade) food Food @relation(fields: [foodId], references: [id], onDelete: Cascade)
@@map("plan_foods") @@schema("nutrition")}PlanAssignment
Section titled “PlanAssignment”model PlanAssignment { id String @id @default(cuid()) planId String @map("plan_id") userProfileId String @map("user_profile_id") assignedById String @map("assigned_by_id")
startDate DateTime @map("start_date") endDate DateTime? @map("end_date") status AssignmentStatus @default(ACTIVE)
calorieAdjustment Int? @map("calorie_adjustment") notes String? userNotes String? @map("user_notes")
plan NutritionPlan @relation(fields: [planId], references: [id], onDelete: Cascade) userProfile UserProfile @relation("AssignedNutritionPlans", fields: [userProfileId], references: [id], onDelete: Cascade) assignedBy UserProfile @relation("AssignedNutritionPlansByMe", fields: [assignedById], references: [id], onDelete: Cascade)
createdAt DateTime @default(now()) @map("created_at") updatedAt DateTime @updatedAt @map("updated_at")
@@unique([planId, userProfileId]) @@map("plan_assignments") @@schema("nutrition")}PlanType (Enum)
Section titled “PlanType (Enum)”enum PlanType { WEIGHT_LOSS MUSCLE_GAIN MAINTENANCE CUTTING BULKING KETO VEGETARIAN VEGAN MEDITERRANEAN CUSTOM
@@schema("nutrition")}PlanDifficulty (Enum)
Section titled “PlanDifficulty (Enum)”enum PlanDifficulty { BEGINNER INTERMEDIATE ADVANCED
@@schema("nutrition")}Endpoints
Section titled “Endpoints”Obtener Planes Nutricionales
Section titled “Obtener Planes Nutricionales”Obtener planes nutricionales.
- URL:
/api/v1/nutrition/plans - Método:
GET - Autenticación Requerida: Sí
Descripción Interna
Section titled “Descripción Interna”Este endpoint obtiene planes nutricionales:
-
Filtros disponibles:
search: Búsqueda en nombre y descripcióntype: Tipo de plandifficulty: Nivel de dificultadisPublic: Solo planes públicoscreatedBy: Filtrar por creadortags: Filtrar por etiquetas (separadas por coma)
-
Incluye:
- createdBy (id, name)
- Contadores de planFoods y assignments
Parámetros de Consulta de Solicitud
Section titled “Parámetros de Consulta de Solicitud”search: Buscar en nombre/descripcióntype: Tipo de plandifficulty: Nivel de dificultadisPublic: Solo planes públicoscreatedBy: Filtrar por creadorpage: Número de páginalimit: Resultados por página
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.nutrition.plans.$get({ query: {}})Obtener Plan por ID
Section titled “Obtener Plan por ID”Obtener un plan nutricional específico con alimentos.
- URL:
/api/v1/nutrition/plans/:id - Método:
GET - Autenticación Requerida: Sí
Crear Plan Nutricional (Admin/Trainer)
Section titled “Crear Plan Nutricional (Admin/Trainer)”Crear un nuevo plan nutricional.
- URL:
/api/v1/nutrition/plans - Método:
POST - Autenticación Requerida: Sí Admin Trainer
Descripción Interna
Section titled “Descripción Interna”Este endpoint crea un nuevo plan nutricional:
- Obtiene createdById del usuario autenticado
- Crea el plan con la configuración proporcionada
- Retorna el plan con información del creador
Cuerpo de Solicitud
Section titled “Cuerpo de Solicitud”{ "name": "Weight Loss", "description": "Low carb plan", "isPublic": true}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.nutrition.plans.$post({ json: { name: 'Weight Loss', description: 'Low carb plan', isPublic: true }})Actualizar Plan Nutricional
Section titled “Actualizar Plan Nutricional”Actualizar un plan nutricional existente.
- URL:
/api/v1/nutrition/plans/:id - Método:
PUT - Autenticación Requerida: Sí (Admin/Trainer)
Eliminar Plan Nutricional
Section titled “Eliminar Plan Nutricional”Eliminar un plan nutricional.
- URL:
/api/v1/nutrition/plans/:id - Método:
DELETE - Autenticación Requerida: Sí (Admin/Trainer)
Añadir Alimento a Plan
Section titled “Añadir Alimento a Plan”Añadir un item de alimento a un plan nutricional.
- URL:
/api/v1/nutrition/plans/:planId/foods - Método:
POST - Autenticación Requerida: Sí (Admin/Trainer)
Descripción Interna
Section titled “Descripción Interna”Este endpoint añade un alimento a un plan:
-
Verifica que el plan existe
-
Verifica que el alimento existe
-
Crea PlanFood con:
- foodId, planId
- dayOfPlan: Día del plan
- mealType: Tipo de comida (BREAKFAST, LUNCH, etc.)
- quantity, unit
- notes opcionales
-
Retorna el registro con información del alimento
Cuerpo de Solicitud
Section titled “Cuerpo de Solicitud”{ "foodId": "food_id", "dayOfPlan": 1, "mealType": "BREAKFAST", "quantity": 200, "unit": "g"}Eliminar Alimento del Plan
Section titled “Eliminar Alimento del Plan”Eliminar un item de alimento de un plan nutricional.
- URL:
/api/v1/nutrition/plans/:planId/foods/:foodId - Método:
DELETE - Autenticación Requerida: Sí (Admin/Trainer)
Asignar Plan a Usuario
Section titled “Asignar Plan a Usuario”Asignar un plan nutricional a un usuario.
- URL:
/api/v1/nutrition/plans/:planId/assign - Método:
POST - Autenticación Requerida: Sí (Admin/Trainer)
Obtener Mis Asignaciones de Plan
Section titled “Obtener Mis Asignaciones de Plan”Obtener asignaciones de planes nutricionales para el usuario actual.
- URL:
/api/v1/nutrition/plans/assignments/me - Método:
GET - Autenticación Requerida: Sí