Architecture
Flux de données
Un parcours complet à travers la stack, du clic sur la carte à la ligne en base.
Déroulons une création d'itinéraire :
- L'utilisateur clique sur la carte. Mapbox émet un clic avec lng/lat. Le composant carte de l'application web appelle
addWaypoint(coords)sur le store Zustand de routage de@routess/core. - Le store se met à jour. Le store ajoute le point de passage, recalcule la distance/durée totale localement et notifie les abonnés. Le panneau latéral se réaffiche.
- Effet de bord de persistance. Un abonné dans
apps/webappelleapiClient.routes.upsertCurrent(state), avec un debounce d'environ 500 ms. - Requête HTTP.
@routess/api-clientémetPATCH /api/v1/routes/:idavec le cookie JWT attaché. - L'API reçoit. NestJS authentifie le cookie, valide le corps via des DTO et persiste via MikroORM.
- Réponse. L'API renvoie l'itinéraire canonique. Le store réconcilie (si le serveur a normalisé quoi que ce soit).
Pourquoi un état client-first ?
routess privilégie un état local rapide avec une réconciliation serveur à terme. La carte doit donner une impression d'instantanéité ; faire un aller-retour à chaque clic donnerait une sensation de latence.
Modes de défaillance
- Serveur injoignable : les éditions locales continuent de fonctionner ; la couche de persistance met en file d'attente et réessaie avec un backoff exponentiel.
- Authentification expirée : le serveur renvoie 401 ; le web redirige vers la connexion.
- Échec de validation : le serveur renvoie 422 avec des erreurs au niveau des champs ; le web affiche un toast et conserve l'édition locale.