diff --git a/package.json b/package.json index 9b44e8c..caa8063 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "homepage", - "version": "1.20.0", + "version": "1.21.0", "private": true, "type": "module", "scripts": { diff --git a/src/lib/components/fitness/MealTypePicker.svelte b/src/lib/components/fitness/MealTypePicker.svelte new file mode 100644 index 0000000..3f6e7e6 --- /dev/null +++ b/src/lib/components/fitness/MealTypePicker.svelte @@ -0,0 +1,63 @@ + + +
{isEn ? 'No matching suggestions found.' : 'Keine passenden Vorschläge gefunden.'}
+ {/if} +{isEnglish + ? 'Recompute and cache per-100g nutrition on all recipes with nutrition mappings. Required for "Round off this day" suggestions.' + : 'Per-100g-Nährwerte für alle Rezepte mit Nährwertzuordnungen neu berechnen und cachen. Notwendig für "Tag abrunden"-Vorschläge.'} +
+ + + {#if cacheResult} +| {isEnglish ? 'Recipe' : 'Rezept'} | kcal/100g | {isEnglish ? 'Total (g)' : 'Gesamt (g)'} |
|---|---|---|
| {d.name} | +{d.calories} | +{d.totalGrams} | +
{errorMsg}
{/if} diff --git a/src/routes/api/[recipeLang=recipeLang]/nutrition/cache-per100g/+server.ts b/src/routes/api/[recipeLang=recipeLang]/nutrition/cache-per100g/+server.ts new file mode 100644 index 0000000..ca6d580 --- /dev/null +++ b/src/routes/api/[recipeLang=recipeLang]/nutrition/cache-per100g/+server.ts @@ -0,0 +1,97 @@ +import { json, type RequestHandler } from '@sveltejs/kit'; +import { Recipe } from '$models/Recipe'; +import { dbConnect } from '$utils/db'; +import { requireGroup } from '$lib/server/middleware/auth'; +import { getBlsEntryByCode, getNutritionEntryByFdcId } from '$lib/server/nutritionMatcher'; + +const KEYS = [ + 'calories', 'protein', 'fat', 'saturatedFat', 'carbs', 'fiber', 'sugars', + 'calcium', 'iron', 'magnesium', 'phosphorus', 'potassium', 'sodium', 'zinc', + 'vitaminA', 'vitaminC', 'vitaminD', 'vitaminE', 'vitaminK', + 'thiamin', 'riboflavin', 'niacin', 'vitaminB6', 'vitaminB12', 'folate', 'cholesterol', +]; + +function parseAmount(amount: string | undefined): number { + if (!amount?.trim()) return 0; + const s = amount.trim().replace(',', '.'); + const rangeMatch = s.match(/^(\d+(?:\.\d+)?)\s*[-–]\s*(\d+(?:\.\d+)?)$/); + if (rangeMatch) return (parseFloat(rangeMatch[1]) + parseFloat(rangeMatch[2])) / 2; + const fractionMatch = s.match(/^(\d+)\s*\/\s*(\d+)$/); + if (fractionMatch) return parseInt(fractionMatch[1]) / parseInt(fractionMatch[2]); + const parsed = parseFloat(s); + return isNaN(parsed) ? 0 : parsed; +} + +function computePer100g(recipe: any): { per100g: Record