import "server-only"; import { query } from "@/lib/db"; import { loadTranslationsFor } from "./translations"; import type { MenuEntry } from "@/lib/types"; interface MenuEntryRow { id: string; menu_date: string; section_key: string; position: number; dish_id: string; name: string; price: string; allergens: string[]; additives: string[]; } /** Wochenplan-Einträge inkl. zugehörigem Gericht für den Zeitraum laden – * gemeinsam von der öffentlichen Speisekarte (Server Component) und * /api/menu-entries genutzt, damit der JOIN nur einmal gepflegt wird. */ export async function loadMenuEntries(fromISO: string, toISO: string): Promise { const rows = await query( `select me.id, me.menu_date, me.section_key, me.position, d.id as dish_id, d.name, d.price, d.allergens, d.additives from menu_entries me join dishes d on d.id = me.dish_id where me.menu_date between $1 and $2 order by me.position, me.created_at`, [fromISO, toISO] ); const dishIds = [...new Set(rows.map((r) => r.dish_id))]; const translations = await loadTranslationsFor("dish_translations", dishIds); return rows.map((r) => ({ id: r.id, menu_date: r.menu_date, section_key: r.section_key, position: r.position, dish: { id: r.dish_id, name: r.name, translations: translations.get(r.dish_id) ?? {}, price: Number(r.price), allergens: r.allergens, additives: r.additives, }, })); }