feat: storia diete, schedule allenamento, frequenza pasti (PRD §5.1)
Tre leve aggiuntive che migliorano la personalizzazione del piano dopo
le tre del commit precedente (BF%, deficit, condizioni mediche).
1. Storia delle diete precedenti (adattamento metabolico)
- Profile.dietHistory ∈ {NONE,SOME,EXTENSIVE,SEVERE} cifrato at-rest
- bmrAdjustForDietHistory: 0.97 / 0.93 / 0.85 — aggiustamento BMR per
riflettere l'adattamento metabolico osservato in studi a lungo termine
(Fothergill 2016 Biggest Loser, Rosenbaum 2008)
- Select in ProfileForm con copy diretto sulla "questione yo-yo"
2. Schedule allenamento (kcal extra training-day)
- Preferences.trainingDays Int[] (0=Lun..6=Dom)
- Preferences.trainingType ∈ {CARDIO,STRENGTH,MIXED,SPORT}
- Preferences.sessionMinutes Int?
- extraKcalForSession: equazione MET (Ainsworth 2011) con MET prevalenti
8/5/6/7 a tipo. Output arrotondato a 25 kcal per evitare false-precisioni
- Plan generation aggiunge l'extra solo nei training days
- Chips Lun-Dom + select tipo + input durata in PreferencesForm
3. Frequenza pasti preferita
- Preferences.mealsPerDay Int? (1..4)
- mealShareForFrequency: 1=solo cena, 2=pranzo+cena, 3=no spuntino, 4=default
- Quando mealsPerDay è impostato e non c'è fastingProtocol attivo,
sostituisce la share del protocollo (il digiuno IF ha precedenza)
- Slot a share=0 saltati alla creazione (niente colazione/spuntino "vuoti")
Schema migration 20260429220XXX_add_lifestyle_fields.
Smoke verificato via API: con mealsPerDay=3 e nessun protocollo IF, ogni
giorno del piano ha esattamente 3 pasti (Colazione+Pranzo+Cena, niente
Spuntino). 54/54 unit test verdi (11 nuovi).
Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
This commit is contained in:
1 parent
9401497f03
commit
a583434c42
20 files changed
+460
-31
No files matched your search
@@ -1,5 +1,7 @@
|
||||
import { z } from 'zod';
|
||||
|
||||
import { TRAINING_TYPES } from './training.js';
|
||||
|
||||
// PRD §5.1 — gruppi di esclusione legati agli ingredienti.
|
||||
// Devono coincidere con i tag su `Ingredient.exclusionGroups` nel seed
|
||||
// (vedi packages/db/prisma/seed-ingredients.ts).
|
||||
@@ -45,6 +47,12 @@ export const preferencesPatchSchema = z
|
||||
cuisinePreferences: z.array(z.enum(CUISINE_TAGS)).max(CUISINE_TAGS.length).optional(),
|
||||
cookingTime: z.enum(COOKING_TIMES).optional(),
|
||||
fastingProtocol: z.enum(FASTING_PROTOCOL_VALUES).nullable().optional(),
|
||||
// Schedule allenamento (vedi preferences/training.ts).
|
||||
trainingDays: z.array(z.coerce.number().int().min(0).max(6)).max(7).optional(),
|
||||
trainingType: z.enum(TRAINING_TYPES).nullable().optional(),
|
||||
sessionMinutes: z.coerce.number().int().min(10).max(240).nullable().optional(),
|
||||
// Pasti/giorno preferiti. Il fastingProtocol ha precedenza.
|
||||
mealsPerDay: z.coerce.number().int().min(1).max(4).nullable().optional(),
|
||||
})
|
||||
.strict();
|
||||
|
||||
|
||||
Reference in new issue
Block a user