Feature: nutrition module (keto macros + intermittent fasting + electrolytes)
Backend:
- models/nutrition.py: NutritionGoal, Fast, ElectrolyteLog tables
- schemas/nutrition.py: Pydantic schemas for new endpoints
- routers/nutrition.py: /api/nutrition/{today,goals,fasts,electrolytes}
- main.py: register router + migration for new tables + seed keto point rules
Frontend:
- pages/Nutrition.jsx: macro bars, fast timer, eating window, electrolyte quick-add
- App.jsx: /nutrition route + Keto nav tab
- api.js: nutrition endpoints
Points schema for fasts (tier-based partial credit):
16:8=25, 18:6=40, 20:4=60, 24h=200, 36h=350, 48h=500, 72h=1000
Defaults tuned for Scot: 135kg M 44yo strict keto, 12:00-20:00 window,
Asia/Bangkok timezone, 2400/2600 cal rest/training, 20g net carb cap.
This commit is contained in:
parent
9a306bc250
commit
5dd5d39ca6
8 changed files with 818 additions and 6 deletions
|
|
@ -59,6 +59,18 @@ export const api = {
|
|||
scanBarcode: (barcode) => request(`/food/scan/${barcode}`),
|
||||
searchFood: (q) => request(`/food/search?q=${encodeURIComponent(q)}`),
|
||||
|
||||
// Nutrition (v3: keto + fasting)
|
||||
nutritionToday: () => request('/nutrition/today'),
|
||||
getNutritionGoals: () => request('/nutrition/goals'),
|
||||
updateNutritionGoals: (data) => request('/nutrition/goals', { method: 'PATCH', body: JSON.stringify(data) }),
|
||||
startFast: (data) => request('/nutrition/fasts', { method: 'POST', body: JSON.stringify(data) }),
|
||||
endFast: (id, data) => request(`/nutrition/fasts/${id}`, { method: 'PATCH', body: JSON.stringify(data || {}) }),
|
||||
listFasts: (limit) => request(`/nutrition/fasts${limit ? `?limit=${limit}` : ''}`),
|
||||
getActiveFast: () => request('/nutrition/fasts/active'),
|
||||
deleteFast: (id) => request(`/nutrition/fasts/${id}`, { method: 'DELETE' }),
|
||||
logElectrolytes: (data) => request('/nutrition/electrolytes', { method: 'POST', body: JSON.stringify(data) }),
|
||||
getElectrolytesToday: () => request('/nutrition/electrolytes/today'),
|
||||
|
||||
// Rewards
|
||||
listRewards: () => request('/rewards'),
|
||||
createReward: (data) => request('/rewards', { method: 'POST', body: JSON.stringify(data) }),
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue