2026-09-12 14:35:57 +02:00
|
|
|
|
# BLS Food Reference – technische Spec
|
|
|
|
|
|
|
2026-09-12 15:31:20 +02:00
|
|
|
|
**Stand:** 2026-09-12 · Migration **062** + **063**
|
2026-09-12 14:35:57 +02:00
|
|
|
|
|
|
|
|
|
|
## Tabellen
|
|
|
|
|
|
|
|
|
|
|
|
- `food_attributes` — dynamischer Stoff-/Merkmalskatalog (`attr_key`, `data_type`, `origin`)
|
|
|
|
|
|
- `food_catalog` — Lebensmittel (`bls_code` UNIQUE bei official_bls; manuell ohne BLS-Code)
|
|
|
|
|
|
- `food_attribute_values` — typisiertes EAV
|
|
|
|
|
|
- `food_name_mappings` — FDDB-Name → `food_id` (User / global)
|
|
|
|
|
|
- `nutrition_items` — Tagebuchzeilen inkl. `logged_at`
|
|
|
|
|
|
- `nutrition_daily_nutrients` — Tages-Rollup numerischer Attribute
|
|
|
|
|
|
- `nutrition_day_marks` — `fasting` | `incomplete`
|
2026-09-12 15:31:20 +02:00
|
|
|
|
- `food_recipes` / `food_recipe_ingredients` — FDDB-Listen; `nutrition_items.recipe_id`
|
2026-09-12 14:35:57 +02:00
|
|
|
|
|
|
|
|
|
|
## Layer 1
|
|
|
|
|
|
|
|
|
|
|
|
- `data_layer/food_mapping.py` — Normalisierung, Lookup, Learn, Apply, Delete
|
|
|
|
|
|
- `data_layer/nutrition_items.py` — Ingest, drei Makro-Summen, Policy, `resolve_*_attributes`
|
2026-09-12 15:31:20 +02:00
|
|
|
|
- `data_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)
|
2026-09-12 14:35:57 +02:00
|
|
|
|
|
|
|
|
|
|
## 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, eigene Foods, eigene Mappings
|
|
|
|
|
|
- `/api/admin/bls/*` — Import, Katalog, Attribute
|
|
|
|
|
|
- `/api/admin/food-mappings` — Admin-CRUD
|
|
|
|
|
|
- `/api/nutrition/*` — Items, Unmapped, Bulk-Map, Marken, Konflikt-Resolve
|
2026-09-12 15:31:20 +02:00
|
|
|
|
- `GET /api/nutrition/recipes`, `POST /api/nutrition/recipes/import-fddb-lists`, `POST /api/nutrition/recipes/{id}/apply`
|
|
|
|
|
|
- Unmapped = Tagebuchzeilen ohne `food_id`/`recipe_id` **plus** Rezeptzutaten ohne Mapping
|
|
|
|
|
|
- Frontend: `FoodSearchModal` (Name-Suche), Listen-Import auf dem Tab Zuordnen
|