feat: split jídel

feat: graf příjmů
This commit is contained in:
Ondřej Anděl committed 2026-10-09 15:15:04 +02:00
1 parent bc85a37fc0
commit b880b36edd
32 files changed
+2048 -262

No files matched your search

+4
View File
@@ -20,6 +20,8 @@ paths:
$ref: "./paths/meals/add.yml"
/meals/update:
$ref: "./paths/meals/update.yml"
/meals/split:
$ref: "./paths/meals/split.yml"
/meals/delete:
$ref: "./paths/meals/delete.yml"
/meals/multiplier:
@@ -38,6 +40,8 @@ paths:
# Statistiky (/api/stats)
/stats/summary:
$ref: "./paths/stats/summary.yml"
/stats/intake:
$ref: "./paths/stats/intake.yml"
/stats/activity:
$ref: "./paths/stats/activity.yml"
+22
View File
@@ -0,0 +1,22 @@
post:
operationId: splitMeal
summary: Rozdělí jedno jídlo na dvě — původní se upraví a vedle něj vznikne nové ve stejném dni.
requestBody:
required: true
content:
application/json:
schema:
$ref: "../../schemas/_index.yml#/MealSplitRequest"
responses:
"200":
description: Aktualizovaný přehled dne
content:
application/json:
schema:
$ref: "../../schemas/_index.yml#/DayRecord"
"400":
description: Neplatná data
"401":
description: Neautentizovaný uživatel
"404":
description: Záznam neexistuje
+29
View File
@@ -0,0 +1,29 @@
get:
operationId: getIntakeStats
summary: Vrátí statistiky energetického příjmu (jídla) za zvolené období včetně porovnání s výdejem.
parameters:
- in: query
name: from
required: true
schema:
type: string
format: date
description: První den období (včetně), YYYY-MM-DD
- in: query
name: to
required: true
schema:
type: string
format: date
description: Poslední den období (včetně), YYYY-MM-DD
responses:
"200":
description: Statistiky příjmu za období
content:
application/json:
schema:
$ref: "../../schemas/_index.yml#/IntakeStats"
"400":
description: Neplatný rozsah
"401":
description: Neautentizovaný uživatel
+197
View File
@@ -228,6 +228,7 @@ MealGroup:
- missingCaloriesCount
- missingWeightCount
- missingNutrientsCount
- days
- values
properties:
name:
@@ -252,6 +253,11 @@ MealGroup:
missingNutrientsCount:
description: Počet jídel bez nutričních hodnot
type: integer
days:
description: Dny, kdy se jídlo jedlo, od nejnovějšího
type: array
items:
$ref: "#/MealGroupDay"
values:
description: |
Hodnoty k předvyplnění — z nejnovějšího jídla skupiny, které je má.
@@ -1508,3 +1514,194 @@ ActivitySummaryItem:
calories:
description: Spálené kcal včetně násobku
type: integer
IntakeGroupTotal:
description: Součet příjmu jedné skupiny jídel (chod, nebo zdroj)
type: object
additionalProperties: false
required:
- key
- calories
- count
properties:
key:
description: Klíč skupiny — hodnota MealType, nebo název zdroje
type: string
calories:
description: Přijaté kcal včetně násobku
type: integer
count:
description: Počet záznamů o jídle
type: integer
IntakePeriodTotal:
description: Příjem za jedno období (den, měsíc nebo rok) s výdejem stejných dní
type: object
additionalProperties: false
required:
- period
- calories
- burnCalories
- dayCount
- caloriesDayCount
- byMealType
properties:
period:
description: Označení období — YYYY-MM-DD (den), YYYY-MM (měsíc) nebo YYYY (rok)
type: string
calories:
description: Přijaté kcal včetně násobku
type: integer
burnCalories:
description: |
Výdej (klidový + pohyb) za dny období, ve kterých má aspoň jedno jídlo
kalorie. Ostatní dny se nezapočítávají, jinak by vycházel deficit tam,
kde uživatel jen nic nezapsal nebo kalorie nezná.
type: integer
dayCount:
description: Počet dní období se zapsaným jídlem
type: integer
caloriesDayCount:
description: Počet dní období, kdy má aspoň jedno jídlo kalorie — základ průměru a bilance
type: integer
byMealType:
description: Příjem po chodech; chody bez kalorií chybí
type: array
items:
$ref: "#/IntakeGroupTotal"
IntakeStats:
description: |
Statistiky energetického příjmu za zvolené období — kolik se snědlo, v jakých
chodech a jídlech, jaké živiny a jak to vychází proti výdeji.
type: object
additionalProperties: false
required:
- from
- to
- totalCalories
- burnCalories
- hasBasal
- entryCount
- missingCaloriesCount
- dayCount
- caloriesDayCount
- nutrientsDayCount
- byDay
- byMonth
- byYear
- byMealType
- bySource
properties:
from:
description: Začátek období (YYYY-MM-DD, včetně)
type: string
format: date
to:
description: Konec období (YYYY-MM-DD, včetně)
type: string
format: date
totalCalories:
description: Přijaté kcal za období včetně násobku
type: integer
burnCalories:
description: Výdej (klidový + pohyb) za dny, kdy má aspoň jedno jídlo kalorie
type: integer
hasBasal:
description: |
Zda výdej obsahuje klidový metabolismus. Bez něj porovnává bilance jen
jídlo proti pohybu a nejde o skutečný deficit.
type: boolean
targetDailyBalance:
description: Cílová denní bilance podle tempa změny hmotnosti, pokud je cíl nastavený
type: integer
proteinTargetGrams:
description: Denní cíl bílkovin v gramech k hmotnosti na konci období, pokud je cíl nastavený
type: integer
entryCount:
description: Počet záznamů o jídle v období
type: integer
missingCaloriesCount:
description: Počet jídel bez kalorií — do součtů nevstupují
type: integer
dayCount:
description: Počet dní, ve kterých je alespoň jedno jídlo
type: integer
caloriesDayCount:
description: Počet dní, kdy má aspoň jedno jídlo kalorie — základ průměru a bilance
type: integer
totalNutrients:
description: Součet živin za období; jen jídla s gramáží a nutričními hodnotami
allOf:
- $ref: "#/Nutrients"
nutrientsDayCount:
description: Počet dní, ve kterých má aspoň jedno jídlo živiny — základ pro průměr na den
type: integer
byDay:
description: Součty po dnech se zapsaným jídlem, vzestupně
type: array
items:
$ref: "#/IntakePeriodTotal"
byMonth:
description: Součty po měsících, vzestupně
type: array
items:
$ref: "#/IntakePeriodTotal"
byYear:
description: Součty po letech, vzestupně
type: array
items:
$ref: "#/IntakePeriodTotal"
byMealType:
description: Příjem po chodech, sestupně dle kcal
type: array
items:
$ref: "#/IntakeGroupTotal"
bySource:
description: Příjem dle zdroje jídla, sestupně dle kcal; jídla bez zdroje pod "Neuvedeno"
type: array
items:
$ref: "#/IntakeGroupTotal"
MealGroupDay:
description: Den, ve kterém se jídlo skupiny jedlo
type: object
additionalProperties: false
required:
- date
- incomplete
properties:
date:
type: string
format: date
incomplete:
description: Zda některému jídlu skupiny v tento den chybí kalorie, gramáž nebo živiny
type: boolean
MealSplitRequest:
description: |
Rozdělení jídla, které import (nebo uživatel) zapsal jako jedno, na dvě.
Obě části zůstávají ve dni původního jídla; datum v částech se ignoruje.
type: object
additionalProperties: false
required:
- id
- date
- original
- split
properties:
id:
description: Identifikátor rozdělovaného jídla
type: string
date:
description: Den rozdělovaného jídla (YYYY-MM-DD)
type: string
format: date
original:
description: Nové hodnoty původního jídla — přepíší ho stejně jako úprava
allOf:
- $ref: "#/MealInput"
split:
description: Odštěpená část, vznikne z ní nové jídlo
allOf:
- $ref: "#/MealInput"