Lebensmittel oder Rezept wählbar; gemappte Zutaten werden übernommen, offene erscheinen in der Liste. Dazu Fettgehalt-Suche, EPA-Stoffe, Rezept-CRUD und Wechsel bestehender Zuordnungen. Co-authored-by: Cursor <cursoragent@cursor.com>
3.0 KiB
3.0 KiB
BLS Food Reference – technische Spec
Stand: 2026-09-12 · Migration 062 + 063
Tabellen
food_attributes— dynamischer Stoff-/Merkmalskatalog (attr_key,data_type,origin)food_catalog— Lebensmittel (bls_codeUNIQUE bei official_bls; manuell ohne BLS-Code)food_attribute_values— typisiertes EAVfood_name_mappings— FDDB-Name →food_id(User / global)nutrition_items— Tagebuchzeilen inkl.logged_atnutrition_daily_nutrients— Tages-Rollup numerischer Attributenutrition_day_marks—fasting|incompletefood_recipes/food_recipe_ingredients— FDDB-Listen;nutrition_items.recipe_id
Layer 1
data_layer/food_mapping.py— Normalisierung, Lookup, Learn, Apply, Deletedata_layer/nutrition_items.py— Ingest, drei Makro-Summen, Policy,resolve_*_attributesdata_layer/food_recipes.py— Listen-Upsert, Link auf Tagebuchzeilen, Rezept-Makros (Skala: gegessen_g / Summe Zutaten, sonst 1/Portionen)bls/recipe_parser.py—produkte-Feld: Split nur vor nächstem\d+ (g|kg|ml|l)(Kommas im Namen bleiben)
Import
BLS: Admin-Upload Components + Daten-XLSX (backend/bls/parser.py). Upsert über bls_code / attr_key, nie Delete+Insert offizieller Zeilen.
FDDB: Items persistieren; nutrition_log nur bei leerem Tag oder laut Policy / Bestätigung.
Router
/api/bls/*— Suche, Attribute-Suche, eigene Foods (attributes+serving_g), eigene Mappings- Migration 065 — Extension-Keys EPA/DHA/DPA/ALA/OMEGA3/OMEGA6 falls BLS sie nicht unter diesem Key hat
/api/admin/bls/*— Import, Katalog, Attribute/api/admin/food-mappings— Admin-CRUD/api/nutrition/*— Items, Unmapped, Bulk-Map, Marken, Konflikt-ResolveGET/POST /api/nutrition/recipes,PUT/DELETE /api/nutrition/recipes/{id},POST …/import-fddb-lists,POST …/{id}/applyPUT /api/admin/food-mappings/{id}— Ziel-Lebensmittel einer bestehenden Zuordnung wechseln- Unmapped = Tagebuchzeilen ohne
food_id/recipe_idplus Rezeptzutaten ohne Mapping - Frontend: Inline-Vorschläge auf Zuordnen (
food_suggest.py: Collapse-Key ohne Leerzeichen, Index 5 Min. Cache, Fett-%-Zahlen 9,5/10),FoodSearchModalnur noch Zusatzsuche (Abort + Debounce). Neu anlegen fragt zuerst Lebensmittel vs. Rezept; Rezept-Zutaten ohne Mapping erscheinen alskind=recipe_ingredientin Unmapped. GET /nutrition/unmapped?since_days=28— nur Namen mitlast_dateim Fenster;count_onlyliefert{count, total, since_days};POST /bls/foods/suggest-batchfür sichtbare Zeilen (max. 80)- Mapping-Schreiben und Nährwert-Rebuild sind getrennte Transaktionen; Rebuild läuft nach der API-Antwort im Hintergrund (UI bleibt bedienbar)
food_name_mappings.grams_per_unit/source_unit(Migration 064)GET/POST /api/nutrition/food-knowledge— portable JSON (mitai-food-knowledgev1): manuelle Foods, Mappings (überbls_code/ Name, keine UUIDs), Listen. Import löst Katalog auf dem Zielsystem auf (BLS muss dort importiert sein).