Tracker de vie auto-hébergé : suivi poids/calories/sport avec planning de pesées, sevrage tabac (vape) avec modèle de coût DIY et économies, et finances personnelles avec import de relevés bancaires. Architecture : FastAPI + SQLAlchemy 2.0 + PostgreSQL 16, React 18 + TS + Vite + Tailwind + ECharts, déploiement Docker Compose. Modules auto-découverts des deux côtés (pkgutil / import.meta.glob) et framework de connecteurs à deux voies (importeurs de fichiers + ingestion JSON) pour brancher de nouvelles sources sans toucher au noyau. Validé : 292 tests pytest, tsc + vite build, contrat API/web vérifié contre le schéma OpenAPI, et déploiement Docker réel sur PostgreSQL 16 (28 tables, SPA servie par nginx, wizard de premier démarrage). Documentation : README.md, docs/GUIDE.md, CONVENTIONS.md, et les documents de conception et de recherche dans docs/. Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
60 lines
4.7 KiB
Markdown
60 lines
4.7 KiB
Markdown
# LifeTrack — Synthèse du design (v1)
|
|
|
|
> Tracker de vie auto-hébergé : sport/calories/poids, arrêt de la cigarette (vape), et finances
|
|
> personnelles — interface web riche en graphiques, déployée via Docker Compose.
|
|
|
|
## Documents de référence
|
|
|
|
| Document | Contenu |
|
|
|---|---|
|
|
| [docs/design/architecture.md](docs/design/architecture.md) | Architecture technique complète : monorepo, FastAPI, React, auto-découverte des modules, framework de connecteurs, Docker. **§10 = CONVENTIONS (extrait dans [CONVENTIONS.md](CONVENTIONS.md))** |
|
|
| [docs/design/datamodel-health-vape.md](docs/design/datamodel-health-vape.md) | Tables + formules santé/nutrition/vape : BMR/TDEE, tendance EMA, projections, coût/ml, économies |
|
|
| [docs/design/datamodel-finance.md](docs/design/datamodel-finance.md) | Tables + logique finances : pipeline d'import, dédup, moteur de règles, virements, récurrents, budgets |
|
|
| [docs/design/ux-pages.md](docs/design/ux-pages.md) | Spec UX française page par page : ~30 graphiques ECharts, KPI, modales, palette validée daltonisme |
|
|
| [docs/research/health-connect.md](docs/research/health-connect.md) | Comment sortir les données de Health Connect (bridge webhook, Health Sync CSV, app compagnon v2) |
|
|
| [docs/research/nutrition-sources.md](docs/research/nutrition-sources.md) | Foodvisor (export RGPD), Open Food Facts, CIQUAL, importeurs CSV nutrition |
|
|
| [docs/research/finance-sources.md](docs/research/finance-sources.md) | Formats CSV réels de 10 banques FR + PayPal, OFX, Enable Banking (v2) |
|
|
|
|
## Stack (décidée)
|
|
|
|
- **Backend** : Python 3.12 (Docker) · FastAPI · SQLAlchemy 2.0 typé · PostgreSQL 16 · PyJWT + argon2
|
|
- **Frontend** : React 18 · TypeScript strict · Vite · TailwindCSS (thème sombre) · Apache ECharts · TanStack Query
|
|
- **Déploiement** : Docker Compose (postgres + api + web/nginx) ; dev = uvicorn --reload + vite
|
|
- **Langues** : code en anglais, UI et messages d'erreur en français (fr-FR : `1 234,56 €`, `dd/MM/yyyy`)
|
|
|
|
## Décisions structurantes
|
|
|
|
1. **Modules auto-découverts** des deux côtés (pkgutil côté API, `import.meta.glob` côté web) :
|
|
ajouter un module = créer un dossier, personne ne modifie `main.py`/`router.tsx` → chantiers
|
|
parallèles sans conflit, extensibilité maximale (« l'appli peut aller dans plein de sens »).
|
|
2. **Framework de connecteurs** à deux voies : importeurs de **fichiers** (`BaseImporter`,
|
|
`POST /api/imports`, suivi `ImportRun`, dédup idempotente) et handlers d'**ingestion JSON**
|
|
(`BaseIngestHandler`, `POST /api/ingest/{domain}`, clés d'appareil à scopes `ingest:<domain>`).
|
|
3. **Dédup normalisée** : `(user_id, source, external_id)` + `(user_id, content_hash)` pour les
|
|
événements ; `(user_id, day, source)` + upsert pour les agrégats journaliers → ré-imports sûrs.
|
|
4. **Health Connect = push, jamais pull** (données on-device, pas d'API cloud ; Google Fit API
|
|
morte). v1 : endpoint d'ingestion + app bridge `health-connect-webhook` + import CSV Health
|
|
Sync ; v2 : app compagnon Android (Kotlin, 3-5 j) ; v2/v3 : tapis via Web Bluetooth FTMS.
|
|
5. **Nutrition v1** : saisie rapide + recherche Open Food Facts (proxy backend + cache) + table
|
|
CIQUAL + import CSV Foodvisor (export RGPD) ; connecteur Foodvisor natif impossible (pas d'API).
|
|
6. **Finances v1 = fichiers** : mapper CSV générique + presets par banque (10 banques FR),
|
|
OFX, PayPal ; aperçu avant import + rollback par lot. **v2 = Enable Banking** (PSD2 gratuit
|
|
pour ses propres comptes — GoCardless/Nordigen ferme, ne pas construire dessus).
|
|
7. **Vape** : modèle de coût DIY historisé (base, boosters, arômes, résistances) → coût/ml,
|
|
coût/jour avec amortissement résistance, économies cumulées vs baseline cigarettes gelée.
|
|
8. **Temps** : stockage UTC `timestamptz`, jours locaux `Date` en Europe/Paris (`?tz=` sur les
|
|
agrégations). **Unités canoniques** : kg, cm/m, ml, kcal, secondes, centimes d'euro.
|
|
9. **v1 sans Alembic** : `metadata.create_all` au démarrage (migrations ajoutées quand le schéma
|
|
bougera). Tests pytest sur SQLite → types portables (voir CONVENTIONS C8).
|
|
10. **Graphiques** : palette 8 couleurs validée daltonisme sur fond sombre, jamais de double axe Y,
|
|
sémantique directionnelle (déficit/économies = vert), réponses stats déjà au format ECharts.
|
|
|
|
## Périmètre v1 (ce dépôt) / v2 / v3
|
|
|
|
- **v1** : tout le web + API ci-dessus, imports fichiers, ingestion JSON Health Connect (bridge),
|
|
dashboards complets, wizard premier démarrage.
|
|
- **v2** : app compagnon Android Health Connect, connecteur Enable Banking, calculateur DIY avancé,
|
|
Alembic, notifications.
|
|
- **v3** : enregistrement tapis Web Bluetooth FTMS, analyse photo repas (si API Foodvisor s'ouvre),
|
|
multi-utilisateurs complet, thème clair.
|