import type { AllergyView, DietView, IngredientView } from "@batch-cooking/shared"; import { prisma } from "../../db/prisma.js"; /** * All reference dietary regimes, ordered by `key` — small, static list (see * prisma/seed.ts). `key` is a stable slug, not the display label (see * {@link DietView}), so this is an alphabetical-by-slug order rather than a * true French alphabetical one — close enough for a 5-item list, and the * server has no other order to offer now that the label itself only exists * client-side (`apps/web`'s `locales/fr/translation.json`). */ export async function getDiets(): Promise { return prisma.diet.findMany({ orderBy: { key: "asc" } }); } /** * All reference allergens, ordered by key (see {@link getDiets} for why key, * not label). `Allergy` carries no `key` of its own — it's the selectable * instance of a keyed `Category` (see schema.prisma) — so this resolves * each allergen's key from its category and flattens the split away for * callers. */ export async function getAllergies(): Promise { const allergies = await prisma.allergy.findMany({ include: { category: { select: { key: true, kind: true } } }, orderBy: { category: { key: "asc" } }, }); return allergies.map((allergy) => ({ id: allergy.id, key: allergy.category.key, kind: allergy.category.kind, })); } /** * All reference ingredients, ordered by key (see {@link getDiets} for why), * each resolved to its allergens (see `IngredientAllergy` in schema.prisma) * and compatible diet regimes (see `IngredientDiet`) — same flattening * approach as {@link getAllergies}. Ingredients with no linked * allergen/diet come back with `allergens: []`/`diets: []`. */ export async function getIngredients(): Promise { const ingredients = await prisma.ingredient.findMany({ include: { allergies: { include: { allergy: { include: { category: true } } } }, diets: { include: { diet: true } }, }, orderBy: { key: "asc" }, }); return ingredients.map((ingredient) => ({ id: ingredient.id, key: ingredient.key, icon: ingredient.icon, category: ingredient.category, subcategory: ingredient.subcategory, reproducible: ingredient.reproducible, allergens: ingredient.allergies.map(({ allergy }) => ({ id: allergy.id, key: allergy.category.key, kind: allergy.category.kind, })), diets: ingredient.diets.map(({ diet }) => ({ id: diet.id, key: diet.key })), })); }