Skip to content

Planes Nutricionales

Endpoints para crear y gestionar planes nutricionales.

Los siguientes modelos de Prisma pertenecen al schema nutrition:

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")
}
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")
}
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")
}
enum PlanType {
WEIGHT_LOSS
MUSCLE_GAIN
MAINTENANCE
CUTTING
BULKING
KETO
VEGETARIAN
VEGAN
MEDITERRANEAN
CUSTOM
@@schema("nutrition")
}
enum PlanDifficulty {
BEGINNER
INTERMEDIATE
ADVANCED
@@schema("nutrition")
}

Obtener planes nutricionales.

  • URL: /api/v1/nutrition/plans
  • Método: GET
  • Autenticación Requerida:

Este endpoint obtiene planes nutricionales:

  1. Filtros disponibles:

    • search: Búsqueda en nombre y descripción
    • type: Tipo de plan
    • difficulty: Nivel de dificultad
    • isPublic: Solo planes públicos
    • createdBy: Filtrar por creador
    • tags: Filtrar por etiquetas (separadas por coma)
  2. Incluye:

    • createdBy (id, name)
    • Contadores de planFoods y assignments
  • search: Buscar en nombre/descripción
  • type: Tipo de plan
  • difficulty: Nivel de dificultad
  • isPublic: Solo planes públicos
  • createdBy: Filtrar por creador
  • page: Número de página
  • limit: Resultados por página
import { hcWithType } from '@vitality-gym/api/client'
const client = hcWithType('http://localhost:3000')
const res = await client.api.v1.nutrition.plans.$get({
query: {}
})

Obtener un plan nutricional específico con alimentos.

  • URL: /api/v1/nutrition/plans/:id
  • Método: GET
  • Autenticación Requerida:

Crear un nuevo plan nutricional.

  • URL: /api/v1/nutrition/plans
  • Método: POST
  • Autenticación Requerida:Admin Trainer

Este endpoint crea un nuevo plan nutricional:

  1. Obtiene createdById del usuario autenticado
  2. Crea el plan con la configuración proporcionada
  3. Retorna el plan con información del creador
{
"name": "Weight Loss",
"description": "Low carb plan",
"isPublic": true
}
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 un plan nutricional existente.

  • URL: /api/v1/nutrition/plans/:id
  • Método: PUT
  • Autenticación Requerida: Sí (Admin/Trainer)

Eliminar un plan nutricional.

  • URL: /api/v1/nutrition/plans/:id
  • Método: DELETE
  • Autenticación Requerida: Sí (Admin/Trainer)

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)

Este endpoint añade un alimento a un plan:

  1. Verifica que el plan existe

  2. Verifica que el alimento existe

  3. Crea PlanFood con:

    • foodId, planId
    • dayOfPlan: Día del plan
    • mealType: Tipo de comida (BREAKFAST, LUNCH, etc.)
    • quantity, unit
    • notes opcionales
  4. Retorna el registro con información del alimento

{
"foodId": "food_id",
"dayOfPlan": 1,
"mealType": "BREAKFAST",
"quantity": 200,
"unit": "g"
}

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 un plan nutricional a un usuario.

  • URL: /api/v1/nutrition/plans/:planId/assign
  • Método: POST
  • Autenticación Requerida: Sí (Admin/Trainer)

Obtener asignaciones de planes nutricionales para el usuario actual.

  • URL: /api/v1/nutrition/plans/assignments/me
  • Método: GET
  • Autenticación Requerida: