fix: recepty přesnuty k jídlům

feat: přidána podpora fotek
This commit is contained in:
Ondřej Anděl committed 2026-10-12 10:20:12 +02:00
1 parent efed5e6e86
commit e13f7ce8e5
39 files changed
+1266 -511

No files matched your search

+22 -5
View File
@@ -59,8 +59,9 @@ cd client && yarn build # tsc --noEmit + vite build → client/dist
- **Entry:** `index.ts` — Express app, auth middleware, error middleware
- **Routes:** `routes/` — `dayRoutes`, `mealRoutes`, `activityRoutes`, `workoutRoutes`,
`statsRoutes`, `calorieRoutes`, `settingsRoutes`, `importRoutes`
- **Domain:** `meals.ts` (jídlo a historie jídel), `nutrients.ts` (živiny),
`mealTemplates.ts` (recepty), `activities.ts` (pohyb), `workouts.ts` (šablony
- **Domain:** `meals.ts` (jídlo a historie jídel), `mealGroups.ts` (seznam jídel —
skupiny podle názvu a zdroje, doplnění a přejmenování), `mealPhotos.ts` (fotky
jídel), `nutrients.ts` (živiny), `mealTemplates.ts` (recepty), `activities.ts` (pohyb), `workouts.ts` (šablony
tréninků), `sleep.ts` (spánek), `weights.ts` (vážení po dnech), `profile.ts`
(tělesné údaje a výpočet BMR), `bodyMetrics.ts` (BMI, podíl tuku, cíle),
`dayOverview.ts` (spojení dne a bilance), `statsService.ts` (agregace),
@@ -75,7 +76,7 @@ cd client && yarn build # tsc --noEmit + vite build → client/dist
- **Pages:** `pages/` — `DayPage` (přehled dne se záložkami Příjem/Výdej),
`MealGroupsPage` (`/jidla` — seznam jídel podle názvu a zdroje s filtrem zdroje,
hromadným doplněním údajů a přejmenováním),
`TemplatesPage` (šablony tréninků a recepty), `ProfilePage` (Profil — ukazatele,
`WorkoutsPage` (`/treninky` — šablony tréninků), `ProfilePage` (Profil — ukazatele,
vývoj hmotnosti, tělesné údaje, cíle a klidový výdej),
`StatsPage` (statistiky se záložkami Příjem / Výdej / Útrata a import; panely
`IntakeStatsPanel`, `ActivityStatsPanel`, `SpendingStatsPanel`)
@@ -305,7 +306,21 @@ Druhou akcí skupiny je **přejmenování** (`renameMealGroup`,
`POST /api/meals/renameGroup`) — změní název i zdroj všem jídlům skupiny ve
všech dnech. Je oddělené od doplnění schválně: doplnění jen připisuje, co chybí,
přejmenování přepisuje. Když nový název a zdroj patří jiné skupině, jídla se do
ní sloučí (formulář na to předem upozorní).
ní sloučí (formulář na to předem upozorní). Recept a fotky jdou s jídlem; dvě
jídla s recepty sloučit nejde.
**Recept a fotky jsou rozšířením jídla v seznamu**, ne samostatnou evidencí —
patří dvojici název a zdroj, ne dni. V přehledu dne se nezobrazují.
- Recept se k jídlu váže **shodou názvu a zdroje** (`getRecipeKey`), jedno jídlo
má nejvýš jeden (`saveMealTemplate` druhý odmítne). Recept jídla, které se
ještě nejedlo, je v seznamu jako skupina s `count: 0` a bez `lastDate`.
Má-li jídlo recept, doplnění údajů předvyplní gramáž porce a energii z něj.
- Fotky (`mealPhotos.ts`): klient je před nahráním zmenší (`imageResize.ts`,
~1600 px JPEG) a pošle i náhled (240 px). Rejstřík s náhledy je jeden pro
uživatele (`mealPhotos:<login>`, klíč jídla → fotky), aby ho seznam jídel
načetl jedním čtením; plné obrázky leží každý zvlášť (`mealPhoto:<login>:<id>`)
a načtou se, až když se fotky jídla otevřou.
Pole Zdroj (`SourceInput`) nabízí zdroje z historie (`getMealSources`,
`GET /api/meals/sources`, nejčastější první) a podniky se sazbou z nastavení;
@@ -313,7 +328,9 @@ psát jde i nový.
`MealTemplate` (`mealTemplates.ts`, klíč `mealTemplates:<login>`) je **recept** —
vařené jídlo se surovinami (`ingredients`), počtem porcí (`servings`), hmotností
hotového jídla (`cookedWeight`) a postupem v `note`. `deriveRecipe` z nich při
hotového jídla (`cookedWeight`) a postupem v `note`. **Chod nemá** — patří ke dni,
ne k jídlu; použije se zvolený při použití, jinak oběd (starší recepty ho v úložišti
mít můžou, `toMealTemplate` ho zahodí). `deriveRecipe` z nich při
uložení spočítá hodnoty **jedné porce** a uloží je do plochých polí (`weight`,
`caloriesPer100g`, `calories`, `price`); použitím vznikne běžný `MealEntry` přes
`addMeal`. Energie na 100 g se bere z hmotnosti hotového jídla, ne ze součtu