Files
FitnessDroid/doc/activities-plan.md
claude 06b2f0ec86
All checks were successful
release / build-release (push) Successful in 5m54s
Etapp 1: kroppsdata synkas mot servern + BMR + dagens kcal-mätare på Hem
- Profile/myProfile med heightCm/birthYear/sex (fallback mot äldre server),
  updateProfile-mutation i GymApi
- Kroppsdata sparas lokalt och synkas: serverns värden vinner, lokala pushas
  upp om servern är tom (migrerar vågens lokala data)
- Mifflin–St Jeor-BMR (data/Bmr.kt)
- Hemskärm: Dagens kalorier-kort — aktivt loggat (dagens pass), telefonen
  (platshållare för etapp 5) och passivt (BMR-andel av dygnet, tickar per
  minut). Uppmaning om kroppsdata saknas.
- Version 0.5.0

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01C2GA94E1f3cmrvdQLQhYdg
2026-08-23 17:20:39 +02:00

110 lines
5.4 KiB
Markdown
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

# 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 (MifflinSt 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 (MET1) 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? (010),
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
- [x] Etapp 1 — Profil & kalorigrund *(kod klar 2026-08-23: backend a1cd4d3, webb 560894c, app — väntar på användartest + omdeploy av gym-api/frontend-containrarna)*
- [ ] 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.