feat: zlepšení šablon, přidány osobní údaje a spánkový režim

This commit is contained in:
Ondřej Anděl
2026-09-15 14:16:42 +02:00
parent a5711f3e1e
commit 21b01528e9
51 changed files with 3739 additions and 504 deletions
+18
View File
@@ -30,6 +30,8 @@ paths:
# Přehled dne (/api/day)
/day:
$ref: "./paths/day/overview.yml"
/day/sleep:
$ref: "./paths/day/sleep.yml"
# Pohyb (/api/activities)
/activities/add:
@@ -48,6 +50,20 @@ paths:
$ref: "./paths/workouts/delete.yml"
/workouts/apply:
$ref: "./paths/workouts/apply.yml"
/workouts/fromActivities:
$ref: "./paths/workouts/fromActivities.yml"
# Šablony jídel (/api/mealTemplates)
/mealTemplates:
$ref: "./paths/mealTemplates/list.yml"
/mealTemplates/save:
$ref: "./paths/mealTemplates/save.yml"
/mealTemplates/delete:
$ref: "./paths/mealTemplates/delete.yml"
/mealTemplates/apply:
$ref: "./paths/mealTemplates/apply.yml"
/mealTemplates/fromMeal:
$ref: "./paths/mealTemplates/fromMeal.yml"
# Kalorie (/api/calories)
/calories/search:
@@ -58,6 +74,8 @@ paths:
$ref: "./paths/settings/settings.yml"
/settings/basal:
$ref: "./paths/settings/basal.yml"
/settings/profile:
$ref: "./paths/settings/profile.yml"
# Importy (/api/import)
/import/luncher:
+29
View File
@@ -0,0 +1,29 @@
post:
operationId: saveSleep
summary: Uloží délku spánku pro zvolený den.
requestBody:
required: true
content:
application/json:
schema:
type: object
required: [date]
properties:
date:
type: string
format: date
sleepMinutes:
description: Délka spánku v minutách. Null nebo 0 záznam odstraní.
type: integer
nullable: true
responses:
"200":
description: Aktualizovaný přehled dne
content:
application/json:
schema:
$ref: "../../schemas/_index.yml#/DayOverview"
"400":
description: Neplatná data
"401":
description: Neautentizovaný uživatel
+35
View File
@@ -0,0 +1,35 @@
post:
operationId: applyMealTemplate
summary: Založí jídlo ze šablony do zvoleného dne.
requestBody:
required: true
content:
application/json:
schema:
type: object
required: [id, date]
properties:
id:
description: Identifikátor šablony
type: string
date:
description: Den, do kterého se jídlo založí
type: string
format: date
mealType:
description: Chod. Bez něj se použije chod ze šablony, jinak oběd.
allOf:
- $ref: "../../schemas/_index.yml#/MealType"
responses:
"200":
description: Aktualizovaný přehled dne
content:
application/json:
schema:
$ref: "../../schemas/_index.yml#/DayOverview"
"400":
description: Neplatná data
"401":
description: Neautentizovaný uživatel
"404":
description: Šablona neexistuje
+26
View File
@@ -0,0 +1,26 @@
post:
operationId: deleteMealTemplate
summary: Smaže šablonu jídla.
requestBody:
required: true
content:
application/json:
schema:
type: object
required: [id]
properties:
id:
type: string
responses:
"200":
description: Aktualizovaný seznam šablon
content:
application/json:
schema:
type: array
items:
$ref: "../../schemas/_index.yml#/MealTemplate"
"400":
description: Neplatná data
"401":
description: Neautentizovaný uživatel
+33
View File
@@ -0,0 +1,33 @@
post:
operationId: createMealTemplateFromMeal
summary: Vytvoří šablonu jídla z existujícího záznamu v přehledu dne.
requestBody:
required: true
content:
application/json:
schema:
type: object
required: [id, date]
properties:
id:
description: Identifikátor jídla, ze kterého se šablona vytvoří
type: string
date:
description: Den, ve kterém jídlo je
type: string
format: date
responses:
"200":
description: Aktualizovaný seznam šablon
content:
application/json:
schema:
type: array
items:
$ref: "../../schemas/_index.yml#/MealTemplate"
"400":
description: Neplatná data
"401":
description: Neautentizovaný uživatel
"404":
description: Jídlo neexistuje
+14
View File
@@ -0,0 +1,14 @@
get:
operationId: getMealTemplates
summary: Vrátí šablony jídel přihlášeného uživatele.
responses:
"200":
description: Šablony seřazené podle názvu
content:
application/json:
schema:
type: array
items:
$ref: "../../schemas/_index.yml#/MealTemplate"
"401":
description: Neautentizovaný uživatel
+22
View File
@@ -0,0 +1,22 @@
post:
operationId: saveMealTemplate
summary: Založí novou šablonu jídla, nebo upraví existující.
requestBody:
required: true
content:
application/json:
schema:
$ref: "../../schemas/_index.yml#/MealTemplateInput"
responses:
"200":
description: Aktualizovaný seznam šablon
content:
application/json:
schema:
type: array
items:
$ref: "../../schemas/_index.yml#/MealTemplate"
"400":
description: Neplatná data
"401":
description: Neautentizovaný uživatel
+20
View File
@@ -0,0 +1,20 @@
post:
operationId: saveProfile
summary: Uloží tělesné údaje uživatele a přepočte z nich klidový výdej.
requestBody:
required: true
content:
application/json:
schema:
$ref: "../../schemas/_index.yml#/PersonalProfile"
responses:
"200":
description: Aktualizované nastavení včetně dopočteného klidového výdeje
content:
application/json:
schema:
$ref: "../../schemas/_index.yml#/UserSettings"
"400":
description: Neplatná data
"401":
description: Neautentizovaný uživatel
+40
View File
@@ -0,0 +1,40 @@
post:
operationId: createWorkoutTemplateFromActivities
summary: |
Vytvoří šablonu tréninku z aktivit zaznamenaných v přehledu dne.
Bez výčtu identifikátorů se použijí všechny aktivity daného dne.
requestBody:
required: true
content:
application/json:
schema:
type: object
required: [date, name]
properties:
date:
description: Den, ze kterého se aktivity berou
type: string
format: date
name:
description: Název nové šablony
type: string
ids:
description: |
Identifikátory aktivit, které se do šablony dostanou.
Bez nich se použijí všechny aktivity dne.
type: array
items:
type: string
responses:
"200":
description: Aktualizovaný seznam šablon
content:
application/json:
schema:
type: array
items:
$ref: "../../schemas/_index.yml#/WorkoutTemplate"
"400":
description: Neplatná data
"401":
description: Neautentizovaný uživatel
+187 -9
View File
@@ -444,8 +444,21 @@ UserSettings:
$ref: "#/SourceRate"
basalCalories:
description: |
Klidový výdej (bazální metabolismus) v kcal za den. Bez něj se bilance dne
počítá jen jako jídlo proti pohybu a nejde o skutečný deficit.
Ručně zadaný klidový výdej v kcal za den. Má přednost před hodnotou
spočítanou z tělesných údajů. Bez obojího se bilance dne počítá jen
jako jídlo proti pohybu a nejde o skutečný deficit.
type: integer
profile:
$ref: "#/PersonalProfile"
computedBasalCalories:
description: |
Klidový výdej spočítaný z tělesných údajů rovnicí Mifflin–St Jeor.
Doplňuje server, při ukládání se ignoruje. Chybí, pokud profil není úplný.
type: integer
effectiveBasalCalories:
description: |
Klidový výdej, který se reálně použije v bilanci dne — ručně zadaný,
jinak spočítaný z profilu. Doplňuje server.
type: integer
ActivityUnit:
@@ -482,7 +495,15 @@ ActivityEntry:
unit:
$ref: "#/ActivityUnit"
quantity:
description: Množství v dané jednotce — počet kroků, minut, kilometrů nebo opakování
description: |
Množství v dané jednotce na jednu sérii — počet kroků, minut, kilometrů
nebo opakování.
type: integer
sets:
description: |
Počet sérií. Celkové množství je sets × quantity, z něj se počítají kalorie.
Chybí-li, počítá se s jednou sérií. Drží se odděleně od množství, protože
3 × 40 opakování s pauzami je jiný trénink než 120 opakování v kuse.
type: integer
caloriesPer100Units:
description: |
@@ -528,8 +549,12 @@ ActivityInput:
unit:
$ref: "#/ActivityUnit"
quantity:
description: Množství v dané jednotce
description: Množství v dané jednotce na jednu sérii
type: integer
sets:
description: Počet sérií. Nevyplněno znamená jednu.
type: integer
nullable: true
caloriesPer100Units:
description: Spálené kcal na 100 jednotek
type: integer
@@ -564,21 +589,38 @@ ActivityDay:
type: integer
WorkoutTemplateItem:
description: Jedna položka šablony tréninku
description: |
Jedna položka šablony tréninku — buď konkrétní cvik, nebo odkaz na jinou
šablonu, jejíž cviky se při použití rozbalí.
type: object
additionalProperties: false
required:
- name
- unit
- quantity
- kind
properties:
kind:
$ref: "#/WorkoutItemKind"
name:
description: Název cviku. Povinný u položky druhu CVIK.
type: string
unit:
$ref: "#/ActivityUnit"
quantity:
description: Množství v dané jednotce na jednu sérii. Povinné u položky druhu CVIK.
type: integer
sets:
description: Počet sérií. Nevyplněno znamená jednu.
type: integer
caloriesPer100Units:
description: Spálené kcal na 100 jednotek
type: integer
templateRefId:
description: Identifikátor vnořené šablony. Povinný u položky druhu SABLONA.
type: string
templateRefName:
description: Název vnořené šablony. Doplňuje server, při ukládání se ignoruje.
type: string
templateRefCalories:
description: Odhad kcal vnořené šablony. Doplňuje server, při ukládání se ignoruje.
type: integer
WorkoutTemplate:
@@ -592,6 +634,8 @@ WorkoutTemplate:
- name
- items
- estimatedCalories
- hasNested
- usedByCount
properties:
id:
type: string
@@ -603,7 +647,15 @@ WorkoutTemplate:
items:
$ref: "#/WorkoutTemplateItem"
estimatedCalories:
description: Odhad spálených kcal za celou šablonu
description: Odhad spálených kcal za celou šablonu včetně vnořených
type: integer
hasNested:
description: |
True, pokud šablona obsahuje odkaz na jinou šablonu. Takovou šablonu
už nelze vnořit do další — zanoření je povolené jen na jednu úroveň.
type: boolean
usedByCount:
description: Kolik jiných šablon tuto šablonu používá
type: integer
EnergyBalance:
@@ -662,3 +714,129 @@ DayOverview:
$ref: "#/ActivityDay"
energy:
$ref: "#/EnergyBalance"
sleepMinutes:
description: |
Délka spánku v minutách. Eviduje se jako kontext dne — do energetické
bilance nevstupuje, protože klidový výdej už pokrývá celých 24 hodin
včetně spánku a žádná standardní rovnice délku spánku nezohledňuje.
type: integer
Pohlavi:
description: Pohlaví — vstupuje do výpočtu bazálního metabolismu
type: string
enum:
- MUZ
- ZENA
PersonalProfile:
description: |
Tělesné údaje uživatele. Slouží k výpočtu bazálního metabolismu
(klidového výdeje) rovnicí Mifflin–St Jeor.
type: object
additionalProperties: false
properties:
sex:
$ref: "#/Pohlavi"
birthYear:
description: Rok narození, ze kterého se odvozuje věk
type: integer
heightCm:
description: Výška v centimetrech
type: integer
weightGrams:
description: Hmotnost v gramech. Celé číslo, aby se počítalo bez desetinných chyb.
type: integer
WorkoutItemKind:
description: |
Druh položky šablony — buď přímo cvik, nebo odkaz na jinou šablonu.
Zanoření je povolené jen na jednu úroveň.
type: string
enum:
- CVIK
- SABLONA
MealTemplate:
description: |
Předpřipravené jídlo. Použitím se založí do zvoleného dne, takže opakovaně
jedené jídlo není potřeba zadávat znovu. Na rozdíl od šablon tréninků se
šablony jídel neskládají z jiných — jsou to ploché záznamy.
type: object
additionalProperties: false
required:
- id
- name
properties:
id:
type: string
name:
description: Název jídla
type: string
source:
description: Zdroj jídla (podnik, obchod, "doma", ...)
type: string
mealType:
description: Chod, pod kterým se jídlo zakládá. Bez něj se použije oběd.
allOf:
- $ref: "#/MealType"
calories:
description: |
Energetická hodnota celé porce v kcal. Použije se, když jídlo nemá
vyplněnou gramáž a energii na 100 g.
type: integer
caloriesPer100g:
description: Energetická hodnota na 100 g v kcal
type: integer
weight:
description: Obvyklá gramáž porce v gramech
type: integer
price:
description: Obvyklá cena v haléřích
type: integer
pricePer100g:
description: Cena za 100 g v haléřích
type: integer
note:
description: |
Poznámka nebo postup přípravy. U domácích jídel sem lze zapsat recept
volným textem; strukturované suroviny mohou přibýt později.
type: string
MealTemplateInput:
description: |
Data pro založení nebo úpravu šablony jídla. Oproti {@link MealTemplate} je
`id` volitelné — bez něj se šablona založí jako nová.
type: object
additionalProperties: false
required:
- name
properties:
id:
description: Identifikátor upravované šablony. Bez něj se založí nová.
type: string
name:
type: string
source:
type: string
nullable: true
mealType:
allOf:
- $ref: "#/MealType"
calories:
type: integer
nullable: true
caloriesPer100g:
type: integer
nullable: true
weight:
type: integer
nullable: true
price:
type: integer
nullable: true
pricePer100g:
type: integer
nullable: true
note:
type: string
nullable: true