← Phase 2 Overview / Radar Avancé
🛡️
Module 12 — Phase 2

Radar Sécurité Avancé

Score de sécurité au niveau quartier, routing sûr sur la carte, données criminalité hyperlocale, alertes santé & vaccins.

Backlog

User Stories

US12.1
En tant qu'utilisateur, je vois la sécurité au niveau quartier (polygones colorés sur la carte)
must 13pts
US12.2
En tant qu'utilisateur, je peux demander un itinéraire pédestre/transport évitant les zones rouges
must 10pts
US12.3
En tant qu'utilisateur, le copilote propose un "Plan B" si ma zone devient dangereuse
must 8pts
US12.4
En tant qu'utilisateur, je vois une heatmap de criminalité pour les villes couvertes
should 8pts
US12.5
En tant qu'utilisateur, je vois les informations vaccins recommandés/obligatoires par destination
must 5pts
US12.6
En tant qu'utilisateur, je reçois une alerte santé si une épidémie est détectée sur ma destination
must 5pts
US12.7
En tant qu'utilisateur, je vois l'évolution du score de sécurité d'une ville sur 30j (graphique)
should 4pts
US12.8
En tant que système, les données SpotCrime sont agrégées et geocodées par quartier
must 10pts
US12.9
En tant que système, les données WHO/CDC sont agrégées pour alertes santé
must 6pts
/safety (v2)

Endpoints API

GET /safety/neighborhoods Polygones quartiers + scores (?city_id=&bounds=) public
GET /safety/neighborhoods/:id Détail quartier (score, criminalité, sources) public
POST /safety/safe-route Calcule itinéraire évitant zones rouges (body: origin, dest, mode) 🔒 auth
GET /safety/heatmap Données heatmap (?city=&type=crime|conflict) public
GET /safety/health/country/:code Vaccins + alertes santé par pays public
GET /safety/health/alerts Épidémies actives (WHO/CDC) public
GET /safety/history/:placeId/trend Évolution score 30j public
POST /ai/safety-planb Copilote : plan B si zone dangereuse (body: place_id, context) 🔒 auth
Schémas de données

Tables Quartiers & Santé

TABLE neighborhoods
id UUID PRIMARY KEY place_id UUID REFERENCES places(id) -- ville parente name TEXT geometry GEOMETRY(Polygon, 4326) safety_score FLOAT DEFAULT 75.0 safety_level INT -- 1-5 crime_index FLOAT -- 0-100 SpotCrime data_source TEXT[] updated_at TIMESTAMPTZ INDEX USING GIST (geometry)
TABLE health_advisories
id UUID PRIMARY KEY country_code CHAR(2) NOT NULL type ENUM('vaccine_required','vaccine_recommended','epidemic','food_safety') disease TEXT description TEXT ai_summary TEXT source TEXT -- 'WHO','CDC','ECDC' severity INT -- 1-3 is_active BOOLEAN DEFAULT true starts_at TIMESTAMPTZ created_at TIMESTAMPTZ DEFAULT NOW()
Business Logic

Règles Métier

🗺️
Routing sûr via Mapbox
POST /safety/safe-route → récupère polygones level≥4 → Mapbox Directions API avec exclusion de polygones (avoid_areas). Retourne le trajet + score de sécurité moyen du parcours.
📊
SpotCrime agrégation
Cron quotidien : API SpotCrime → crimes derniers 30j → geocoding → snapping au quartier le plus proche → calcul crime_index (incidents/km²/mois). Disponible US + grandes villes EU.
💉
Données vaccins WHO
Scraping mensuel des recommandations IAMAT + WHO (API non-publique). Stocké par pays. Mis en avant dans la fiche lieu et lors de la création d'itinéraire vers pays concerné.
⚠️
Plan B IA
Si safety_level d'un lieu passe à 4+ pendant un séjour planifié → notification push + proposition automatique copilote d'un lieu alternatif similaire avec score ≥ 3 dans un rayon de 200km.
Critères d'acceptation
Polygones quartiers chargés en < 2s sur la carte (vector tiles Mapbox)
Routing sûr calculé en < 5s pour trajets urbains
Alertes santé affichées dans la fiche lieu avant tout itinéraire
Plan B proposé dans < 10s après détection de changement de niveau
Heatmap visible avec données < 30j d'ancienneté