Initial commit: full fitness-rewards app
Backend: FastAPI + PostgreSQL + SQLAlchemy async - Auth (JWT), onboarding (PAR-Q+, TTM, BREQ-2), activities, food log - Points engine with daily gate + weekly targets - Strava + Polar OAuth integration - Open Food Facts barcode lookup - Resource recommendation engine - 10 seeded Darebee/StrongLifts/YouTube programs Frontend: React + Vite, mobile-first dark theme - Login/Register, 8-step onboarding flow - Dashboard with daily gate status - Activity logger, food logger (manual + barcode scan + search) - Reward shop with redemption - Weekly summary view - Settings (point rules, targets, integrations) Deployment: Docker Compose for Coolify (Traefik)
This commit is contained in:
commit
4db2b0846b
61 changed files with 4280 additions and 0 deletions
18
backend/app/utils/dates.py
Normal file
18
backend/app/utils/dates.py
Normal file
|
|
@ -0,0 +1,18 @@
|
|||
from datetime import date, timedelta
|
||||
|
||||
|
||||
def get_week_boundaries(d: date) -> tuple[date, date]:
|
||||
"""Return Monday and Sunday of the week containing date d."""
|
||||
monday = d - timedelta(days=d.weekday())
|
||||
sunday = monday + timedelta(days=6)
|
||||
return monday, sunday
|
||||
|
||||
|
||||
def get_month_boundaries(year: int, month: int) -> tuple[date, date]:
|
||||
"""Return first and last day of a month."""
|
||||
first = date(year, month, 1)
|
||||
if month == 12:
|
||||
last = date(year + 1, 1, 1) - timedelta(days=1)
|
||||
else:
|
||||
last = date(year, month + 1, 1) - timedelta(days=1)
|
||||
return first, last
|
||||
Loading…
Add table
Add a link
Reference in a new issue