diff --git a/doc/activities-plan.md b/doc/activities-plan.md new file mode 100644 index 0000000..48659aa --- /dev/null +++ b/doc/activities-plan.md @@ -0,0 +1,109 @@ +# Aktiviteter, kcal-mätare & mål — plan + +*Godkänd 2026-08-23. Samma plan finns i brasse-pc.eu-v2: +`docs/gym-activities-plan.md` — uppdatera båda vid ändringar.* + +Cardio/fristående aktiviteter (promenad, jogg, vandring, fäktning/HEMA m.m.) +som eget koncept vid sidan av gympass, en daglig kcal-mätare på hemskärmen, +mål (dag/vecka/månad) och GPS-livespårning. Kondition markeras med ❤️. + +## Grundkoncept + +- **Pass** (finns): gympass med övningar/set. +- **Aktivitet** (nytt): något man gör över tid. Har tid, ev. distans/höjd/ + rutt, kcal, ansträngning (RPE) och källa (manuellt/spårat/telefon/import). + +### Aktivitetsbibliotek + +~60 kurerade aktiviteter från **Compendium of Physical Activities** +(publika MET-standarden), seedade i gym-API:t: +`key, namnSv, namnEn, met, kategori, isDistanceBased, iconKey, googleFitType`. +Google Fit-typmappningen gör framtida import rak. Stadspromenad, jogg, +skogsvandring och HEMA/fäktning får tempo-/RPE-justerade MET-kurvor. + +### Kcal-modellen + +Kräver längd/födelseår/kön i API:t (gamla "milstolpe 5" ur +`openscale-integration.md` bakas in i etapp 1). + +- **Passivt:** BMR (Mifflin–St Jeor: `10·vikt + 6.25·längd − 5·ålder + k`, + k = +5 man / −161 kvinna), fylls på linjärt över dygnet. +- **Aktivt loggat:** gympass (befintlig MET-modell) + aktiviteter + (MET × vikt × timmar; distansaktiviteter justeras efter verkligt tempo och + höjdmeter, icke-distans efter RPE-slidern). Netto-kcal (MET−1) används så + BMR inte dubbelräknas. +- **Telefon-auto:** steg + externa pass via **Health Connect**, med + dubbelräkningsskydd (steg under egen loggad aktivitet räknas inte). +- **RPE-slider:** "ingen ansträngning" → "kan inte prata mer än ett par ord" + (talk test) → intensitetsfaktor på aktivitetens MET. +- **Aktivitetsgissning:** tempo + höjdprofil ⇒ promenad (<~6,5 km/h)/jogg/ + vandring (lågt tempo + höjdmeter); stillastående + timer ⇒ fäktning/HEMA. + +### Mätaren på hemskärmen + +Dagens kcal överst på Hem, tredelad: **aktivt loggat / telefon / passivt**. +Mål visas som progress-bars/mätare under. + +## Datamodell (gym-API, EF-migrationer körs vid deploy) + +- `User` + `HeightCm` (double?), `BirthYear` (int?), `Sex` (string? "male"/"female") +- `ActivityType` — seedad tabell (se ovan), utökningsbar +- `Activity` — Guid id, userId, activityTypeId, startedAt, durationSeconds, + distanceMeters?, elevationGainMeters?, estimatedKcal, rpe? (0–10), + source (`manual`/`tracked`/`phone`/`imported`), routePolyline? + (Google encoded), externalId? (dedup vid import), notes? +- `DailySteps` — userId, date, steps (upsert från appen) +- `Goal` — metric (`KCAL`/`GYM_SESSIONS`/`STEPS`/`ACTIVITIES`/`DISTANCE_KM`) + × period (`DAY`/`WEEK`/`MONTH`), targetValue; max ett mål per metrik+period +- GraphQL: `activityTypes`, `activities(from,to)`, `addActivity`/`update`/ + `delete`, `upsertDailySteps`, `goals` + `setGoal`/`deleteGoal`, + `myProfile`/`updateProfile` (+längd/år/kön), `dailySummary(date)` + (kcal-tredelningen serverberäknad så app+webb delar logik) + +## Tagna designbeslut (2026-08-23) + +| Fråga | Beslut | +|---|---| +| Karta i appen | **osmdroid + OpenStreetMap** (inga nycklar, GPL-vänligt) | +| Steg/telefondata | **Health Connect** (även vägen för Google Fit-import) | +| Ruttlagring | **Encoded polyline + sammanfattning** på servern | +| Aktivitetsbibliotek | **~60 kurerade** ur MET-kompendiet | + +## Etapper + +Leveransordning per etapp: **backend → CI grönt → webb → CI grönt → app → +användartest**. Endast ETT Pi5-bygge åt gången — polla CI och vänta hellre +för länge. (Path-filter: gym-api triggas av `backend-gym-traker/**`, +frontend av `src/**` m.fl., FitnessDroid av varje push till main.) + +1. **Profil & kalorigrund** — API: HeightCm/BirthYear/Sex + `updateProfile`. + Webb: profilfält. App: kroppsdata synkas mot servern (lokal cache kvar), + BMR, kcal-mätare v1 på hemskärmen (passivt + gympass). +2. **Aktiviteter: bibliotek + manuell logg** — API: ActivityType (seed) + + Activity CRUD + `dailySummary`. Webb: aktivitetsflik ❤️ (logga/lista/ + rätta). App: aktivitetsflik med bibliotek, manuell loggning + (tid/distans/RPE), kcal in i mätaren. +3. **Live-spårning (GPS)** — App: starta aktivitet, foreground-service, + osmdroid-livekarta, live kcal/distans/tempo/höjdmeter; icke-distansläge + (timer + RPE efteråt); aktivitetsgissning; polyline till servern. + Webb: Leaflet-karta i aktivitetsdetalj. +4. **Mål & mätare** — API: Goal CRUD. App: målkort med progress på Hem + (dag/vecka/månad × kcal/pass/steg/aktiviteter/km). Webb: målinställningar + + progress. +5. **Steg & telefondata** — API: DailySteps. App: Health Connect-permissions, + daglig stegsynk, auto-aktiviteter från HC ("telefon"-källa), mätarens + tredelning komplett. Webb: stegvisning. +6. **Statistik & polish** — ❤️-sektion i statistiken (app+webb): + distans/tempo-trender per typ, vecko-km; dokumentation; Google + Fit-importens grund (source/externalId/typmappning/HC) verifierad klar. + +## Status + +- [ ] Etapp 1 — Profil & kalorigrund +- [ ] Etapp 2 — Aktiviteter: bibliotek + manuell logg +- [ ] Etapp 3 — Live-spårning (GPS) +- [ ] Etapp 4 — Mål & mätare +- [ ] Etapp 5 — Steg & telefondata +- [ ] Etapp 6 — Statistik & polish + +Google Fit-importen byggs efter etapp 6 som separat arbete.