diff --git a/ROADMAP.md b/ROADMAP.md index a1fbb46..738daae 100644 --- a/ROADMAP.md +++ b/ROADMAP.md @@ -159,49 +159,63 @@ ## πŸ“ Architecture Actuelle -``` -β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β” -β”‚ FRONTEND (SPA) β”‚ -β”‚ Vanilla JS + Tailwind CSS + Chart.js + SortableJS β”‚ -β”‚ Canvas Gauges β€’ Dark Mode β€’ Mobile-First β”‚ -β””β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”¬β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”˜ - β”‚ REST API (JWT) -β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β–Όβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β” -β”‚ BACKEND (FastAPI) β”‚ -β”‚ β”‚ -β”‚ β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β” β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β” β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β” β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β” β”‚ -β”‚ β”‚ Auth β”‚ β”‚Challengesβ”‚ β”‚ Health β”‚ β”‚ Analytics β”‚ β”‚ -β”‚ β”‚ /api/authβ”‚ β”‚/api/chal-β”‚ β”‚ /api/ β”‚ β”‚ /api/ β”‚ β”‚ -β”‚ β”‚ β”‚ β”‚ lenges β”‚ β”‚ health* β”‚ β”‚ analytics β”‚ β”‚ -β”‚ β””β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”˜ β””β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”˜ β””β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”˜ β””β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”˜ β”‚ -β”‚ β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”β”‚ -β”‚ β”‚ Health Connect API β”‚β”‚ -β”‚ β”‚ /api/health-connect/sync β€’ /sync-raw β€’ Raw Storage β”‚β”‚ -β”‚ β””β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”˜β”‚ -β”‚ β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”β”‚ -β”‚ β”‚ Service Layer β”‚β”‚ -β”‚ β”‚ AuthService β€’ AggregationService β€’ HealthProvider β”‚β”‚ -β”‚ β””β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”˜β”‚ -β””β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”¬β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”˜ - β”‚ SQLAlchemy ORM -β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β–Όβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β” -β”‚ DATABASE (PostgreSQL / SQLite) β”‚ -β”‚ β”‚ -β”‚ 6 Core Tables β”‚ 3 HC Aggregated β”‚ 15 HC Raw Tables β”‚ -β”‚ users β”‚ sync_logs β”‚ hc_raw_steps β”‚ -β”‚ challenges β”‚ daily_metrics β”‚ hc_raw_heart_* β”‚ -β”‚ tracking β”‚ exercise_sessionsβ”‚ hc_raw_sleep_* β”‚ -β”‚ daily_health_* β”‚ β”‚ hc_raw_spo2... β”‚ -β”‚ daily_context β”‚ β”‚ (15 total) β”‚ -β”‚ workout_sess. β”‚ β”‚ β”‚ -β””β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”¬β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”˜ - β”‚ -β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β–Όβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β” -β”‚ ANDROID COMPANION APP β”‚ -β”‚ Health Connect API β†’ Raw Records β†’ POST /sync-raw β”‚ -β”‚ Kotlin β€’ Retrofit β€’ Jetpack β€’ Health Connect SDK β”‚ -β”‚ Auto-sync β€’ Sync History β€’ Connection Test β”‚ -β””β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”˜ +```mermaid +graph TB + subgraph FRONTEND["πŸ–₯️ FRONTEND (SPA)"] + direction LR + FE_TECH["Vanilla JS Β· Tailwind CSS Β· Chart.js Β· SortableJS
Canvas Gauges Β· Dark Mode Β· Mobile-First"] + end + + subgraph BACKEND["βš™οΈ BACKEND (FastAPI)"] + direction TB + subgraph ROUTES["Routes API"] + AUTH["πŸ” Auth
/api/auth"] + CHAL["🎯 Challenges
/api/challenges"] + HEALTH["❀️ Health
/api/health*"] + ANALYTICS["πŸ“Š Analytics
/api/analytics"] + HC_API["πŸ“± Health Connect
/api/health-connect/sync-raw"] + end + subgraph SERVICES["Service Layer"] + AUTH_SVC["AuthService"] + AGG_SVC["AggregationService"] + HP["HealthProvider"] + end + ROUTES --> SERVICES + end + + subgraph DB["πŸ—„οΈ DATABASE (PostgreSQL / SQLite)"] + direction LR + subgraph CORE["6 Core Tables"] + CORE_T["users Β· challenges Β· tracking
daily_health_metrics
daily_context Β· workout_sessions"] + end + subgraph HC_AGG["3 HC Aggregated"] + HC_T["sync_logs Β· daily_metrics
exercise_sessions"] + end + subgraph HC_RAW["15 HC Raw Tables"] + RAW_T["hc_raw_steps Β· heart_rate Β· sleep_*
spo2 Β· weight Β· calories Β· distance
exercise Β· nutrition Β· hydration Β· hrv"] + end + end + + subgraph ANDROID["πŸ“± ANDROID COMPANION"] + ANDROID_TECH["Kotlin Β· Retrofit Β· Health Connect SDK
Auto-sync Β· Sync History Β· Connection Test"] + end + + FRONTEND -->|"REST API (JWT)"| BACKEND + BACKEND -->|"SQLAlchemy ORM"| DB + ANDROID -->|"POST /sync-raw"| HC_API + ANDROID -.->|"Health Connect API"| HC["πŸ₯ Android Health Connect"] + HC -->|"Raw Records"| ANDROID + + style FRONTEND fill:#1e293b,stroke:#38bdf8,color:#e2e8f0 + style BACKEND fill:#1e293b,stroke:#10b981,color:#e2e8f0 + style DB fill:#1e293b,stroke:#f59e0b,color:#e2e8f0 + style ANDROID fill:#1e293b,stroke:#a78bfa,color:#e2e8f0 + style HC fill:#1e293b,stroke:#ef4444,color:#e2e8f0 + style ROUTES fill:#0f172a,color:#e2e8f0 + style SERVICES fill:#0f172a,color:#e2e8f0 + style CORE fill:#0f172a,color:#e2e8f0 + style HC_AGG fill:#0f172a,color:#e2e8f0 + style HC_RAW fill:#0f172a,color:#e2e8f0 ``` ---