Skip to content

Alimentos

Endpoints para gestionar la base de datos de alimentos.

Los siguientes modelos de Prisma pertenecen al schema nutrition:

model Food {
id String @id @default(cuid())
name String
brand String?
barcode String?
calories Float
protein Float
carbohydrates Float @map("carbs")
fat Float
fiber Float?
sugar Float?
sodium Float?
servingSize Float? @map("serving_size")
servingUnit String? @map("serving_unit")
category FoodCategory
allergens String[]
isVerified Boolean @default(false) @map("is_verified")
source String?
foodEntries FoodEntry[]
planFoods PlanFood[]
createdAt DateTime @default(now()) @map("created_at")
updatedAt DateTime @updatedAt @map("updated_at")
@@index([name])
@@index([barcode])
@@index([category])
@@map("foods")
@@schema("nutrition")
}
enum FoodCategory {
VEGETABLES
FRUITS
GRAINS
PROTEINS
DAIRY
FATS_OILS
BEVERAGES
SNACKS
PREPARED_FOODS
SUPPLEMENTS
SPICES_CONDIMENTS
NUTS_SEEDS
LEGUMES
SEAFOOD
@@schema("nutrition")
}

Obtener una lista de alimentos con filtros.

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

Este endpoint obtiene alimentos de la base de datos:

  1. Filtros disponibles:

    • search: Búsqueda en nombre y marca (case-insensitive)
    • category: Categoría del alimento
    • isVerified: Solo alimentos verificados
    • barcode: Búsqueda exacta por código de barras
  2. Ordenamiento y paginación dinámicos

  3. Campos por alimento:

    • Información nutricional: calories, protein, carbohydrates, fat
    • Tamaño de porción y unidad
    • Marca y categoría
  • name: Filtrar por nombre
  • category: Filtrar por categoría
  • search: Buscar en nombre y marca
  • isVerified: Solo alimentos verificados
  • 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.foods.$get({
query: {
name: 'Apple'
}
})

Obtener detalles de un alimento específico.

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

Este endpoint obtiene un alimento específico por su ID.


Buscar alimento por código de barras.

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

Este endpoint busca un alimento por código de barras:

  1. Busca en la base de datos por código exacto
  2. Si no encuentra: Lanza error 404

TODO: Integrar con APIs externas (OpenFoodFacts, USDA) cuando el alimento no existe localmente

import { hcWithType } from '@vitality-gym/api/client'
const client = hcWithType('http://localhost:3000')
const res = await client.api.v1.nutrition.foods.barcode[':barcode'].$get({
param: { barcode: '123456789' }
})

Crear un nuevo item de alimento.

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

Este endpoint crea un nuevo alimento:

  1. Verifica duplicados por barcode si se proporciona
  2. Crea el alimento con toda la información nutricional
  3. Retorna el alimento creado
  • name: Nombre del alimento (requerido)
  • calories: Calorías por porción
  • protein: Proteínas en gramos
  • carbohydrates (carbs): Carbohidratos en gramos
  • fat: Grasas en gramos
  • servingSize: Tamaño de porción
  • unit: Unidad (g, ml, oz, etc.)
  • barcode: Código de barras (opcional)
  • brand: Marca (opcional)
  • category: Categoría
{
"name": "Chicken Breast",
"calories": 165,
"protein": 31,
"carbs": 0,
"fat": 3.6,
"servingSize": 100,
"unit": "g"
}
  • 400 Bad Request: Ya existe un alimento con este código de barras
import { hcWithType } from '@vitality-gym/api/client'
const client = hcWithType('http://localhost:3000')
const res = await client.api.v1.nutrition.foods.$post({
json: {
name: 'Chicken Breast',
calories: 165,
protein: 31,
carbs: 0,
fat: 3.6,
servingSize: 100,
unit: 'g'
}
})

Actualizar un item de alimento existente.

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

Eliminar un item de alimento.

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