← Phase 1 Overview / Radar Sécurité
🛡️
Module 5 — Phase 1 MVP

Radar Sécurité NOMIIQ

Agrégation temps réel d'alertes officielles, météo, conflits et criminalité. Carte mondiale colorée, feed dédié et notifications push critiques.

Backlog

User Stories

US5.1
En tant qu'utilisateur, je vois une carte mondiale avec les niveaux de risque par pays/ville en 5 couleurs
must 8 pts
US5.2
En tant qu'utilisateur, je peux voir le détail d'une alerte (source, niveau, résumé IA, date)
must 4 pts
US5.3
En tant qu'utilisateur, je reçois une notification push immédiate si alerte critique sur une zone que je suis
must 5 pts
US5.4
En tant qu'utilisateur, je peux "suivre" un pays ou une ville pour recevoir ses alertes
must 3 pts
US5.5
En tant qu'utilisateur, je vois un feed dédié "Sécurité" avec actualités filtrées + résumés IA
must 5 pts
US5.6
En tant qu'utilisateur, je peux demander au copilote "Explique la situation à Dakar"
must 4 pts
US5.7
En tant qu'utilisateur, je vois l'historique des alertes d'un pays (90 jours)
should 3 pts
US5.8
En tant que système, les alertes sont agrégées toutes les 30 min depuis 4 sources
must 8 pts
US5.9
En tant que système, un résumé IA est généré pour chaque nouvelle alerte (max 3 phrases)
must 4 pts
US5.10
En tant qu'utilisateur, le niveau de risque d'un lieu est visible sur sa fiche (carte + couleur)
must 3 pts
Agrégation

Sources de Données & Pipeline

Sources Phase 1

🇬🇧 UK Foreign Office Travel Advisories Toutes 2h
https://www.gov.uk/foreign-travel-advice
Alertes officielles par pays (RSS + scraping)
🇺🇸 US State Dept Travel Advisories Toutes 2h
https://travel.state.gov
Niveaux 1-4 officiels US
🌍 GDELT Project Toutes 30min
api.gdeltproject.org
Événements mondiaux (conflits, protests)
⛅ OpenWeatherMap Alerts Toutes 30min
api.openweathermap.org
Alertes météo extrêmes (tempêtes, inondations)
📡 Reliefweb API Toutes 4h
api.reliefweb.int
Crises humanitaires ONU

Pipeline de Traitement

1
Cron BullMQ (toutes 30min)
Déclenche les workers de collecte pour chaque source
2
Normalisation
Chaque source est normalisée vers le schéma NOMIIQ safety_alert
3
Déduplication Redis
Hash du contenu → skip si déjà traité dans les 24h
4
Géocodage
Extraction lieu → geocoding Mapbox → association place_id
5
Résumé IA (GPT-4o-mini)
Génère un résumé 3 phrases de l'alerte en FR + EN
6
Calcul niveau (1-5)
Règles métier : source officielle × gravité mots-clés × fréquence
7
Mise à jour safety_score
UPDATE places SET safety_score WHERE ST_DWithin(location, alert_point, radius)
8
Notifications push
FCM envoyé aux users qui suivent la zone si level ≥ 4
REST API /safety

Endpoints API

GET /safety/alerts ?country=&level=&category=&after= (paginé) public
GET /safety/alerts/:id Détail d'une alerte + résumé IA public
GET /safety/map Données carte (?bounds=) — niveaux par pays/ville public
GET /safety/country/:code Score + alertes actives d'un pays public
GET /safety/feed Feed sécurité personnalisé (zones suivies) 🔒 auth
POST /safety/subscriptions Suivre une zone (body: place_id) 🔒 auth
DELETE /safety/subscriptions/:placeId Ne plus suivre une zone 🔒 auth
GET /safety/subscriptions Mes zones suivies 🔒 auth
GET /safety/history/:placeId Historique 90j d'un lieu public
Schémas de données

Tables Sécurité

TABLE safety_alerts
id UUID PRIMARY KEY place_id UUID REFERENCES places(id) country_code CHAR(2) NOT NULL level INT CHECK (level BETWEEN 1 AND 5) category ENUM('crime','weather','political','health','natural_disaster','conflict') title TEXT NOT NULL description TEXT ai_summary_fr TEXT -- résumé GPT-4o-mini ai_summary_en TEXT source_name TEXT -- 'uk_fco', 'us_state', 'gdelt'... source_url TEXT content_hash TEXT -- déduplication is_active BOOLEAN DEFAULT true starts_at TIMESTAMPTZ ends_at TIMESTAMPTZ -- null si durée inconnue notified_at TIMESTAMPTZ -- quand push envoyé created_at TIMESTAMPTZ DEFAULT NOW()
TABLE safety_subscriptions
user_id UUID REFERENCES users(id) place_id UUID REFERENCES places(id) min_level INT DEFAULT 3 -- notifier si ≥ ce niveau created_at TIMESTAMPTZ DEFAULT NOW() PRIMARY KEY (user_id, place_id)
🎨 Échelle des Niveaux
Niveau 1 — Sûr
Niveau 2 — Vigilance conseillée
Niveau 3 — Risque modéré
Niveau 4 — Danger — déconseillé
Niveau 5 — Critique — évacuation
Critères d'acceptation
Alertes mises à jour en < 35 min après publication sur source officielle
Notification push envoyée en < 2 min après détection d'alerte niveau 4+
Carte de risque charge en < 2s (données cachées 5min Redis)
Résumé IA généré en < 5s par alerte
Déduplication : même alerte publiée 2 fois → 1 seul enregistrement
Feed sécurité personnalisé vide si aucune zone suivie → message d'incitation