Bincio Planner
Caricamento…
bincio_planner è lo strumento di pianificazione percorsi del gruppo. Permette di costruire itinerari sulla mappa con waypoint draggabili, calcola il percorso ottimale via Brouter, mostra il profilo altimetrico e permette di salvare e scaricare le route.
Repository: git.bincio.org/bincio/bincio_planner · Produzione: planner.bincio.org
Funzionalità implementate
- Waypoint sulla mappa — click per aggiungere punti numerati, trascinabili
- Routing via Brouter — calcolo percorso debounced (400ms), profili selezionabili
- Inserimento su percorso — click sul tracciato esistente per inserire un waypoint nel punto esatto
- Profili disponibili: Strada (fastbike), Gravel, MTB, Trekking, Safety
- Statistiche percorso: distanza totale + dislivello positivo
- Profilo altimetrico — grafico SVG responsivo sotto la mappa
- Tile multipli — CyclOSM (default), OSM standard, OpenTopoMap, Esri Satellite
- Chiudi anello — duplica il primo waypoint come ultimo
- Export GPX — genera e scarica il file GPX dal GeoJSON Brouter
- Salvataggio piani — salva/carica/elimina percorsi nominati via backend FastAPI
- Track di riferimento — sovrappone attività passate sulla mappa, colorate per anno
- Palette gare — cambia colore accent durante Giro/Tour/Vuelta (come bincio_activity)
- Auth gate — richiede login via bincio; redirect automatico se non autenticato
Architettura
Browser (SPA statica — Svelte 5 + Vite)
│
├── activity.bincio.org/api/me — auth check al caricamento
├── brouter.de/brouter — calcolo routing (esterno, pubblico)
└── planner.bincio.org/api/ — salvataggio piani (FastAPI locale)
Il frontend è una SPA completamente statica. Il routing geografico è delegato interamente a Brouter (nessun codice di routing in questo repo). Il backend FastAPI è opzionale: senza di esso la pianificazione e l’export GPX funzionano ugualmente; manca solo il salvataggio piani.
Backend piani
Il server FastAPI (server/server.py) espone un CRUD per i piani:
| Metodo | Path | Descrizione |
|---|---|---|
GET | /api/plans | Lista piani utente (senza GeoJSON) |
POST | /api/plans | Crea nuovo piano |
GET | /api/plans/{id} | Carica piano completo |
PUT | /api/plans/{id} | Aggiorna piano esistente |
DELETE | /api/plans/{id} | Elimina piano |
I piani sono salvati come file JSON in /var/bincio_planner/{handle}/{plan_id}.json. L’auth usa il cookie bincio_session verificato sul database SQLite condiviso.
Auth
Il cookie bincio_session è emesso da bincio auth e scoped su .bincio.org, quindi è disponibile automaticamente su tutti i sottodomini.
Frontend: al caricamento chiama activity.bincio.org/api/me per verificare la sessione. In caso di 401 redirige a bincio.org/login/ (non a activity). La chiamata a activity è solo una verifica di validità JWT, non autenticazione.
Backend (server/server.py): valida il JWT direttamente — nessun accesso a database, nessuna chiamata HTTP ad altri servizi. Tenta RS256 (OIDC da bincio_auth, chiave pubblica caricata via JWKS all’avvio), poi HS256 (segreto condiviso). Controlla il claim activity_access nel payload.
Dipendenze esterne
Brouter (brouter.de) — motore di routing gratuito, no API key. Query: ?lonlats=lng,lat|..&profile=gravel&format=geojson. Restituisce GeoJSON con coordinate [lng, lat, elevation_m] e proprietà track-length, ascend.
Stack
| Componente | Tecnologia |
|---|---|
| Frontend | Svelte 5 + Vite (SPA statica) |
| Mappa | MapLibre GL JS |
| Routing | Brouter API (esterno) |
| Backend | Python, FastAPI, uvicorn |
| Deploy | nginx + systemd (bincio-planner.service) |