Résolution des incohérences #10, #11, et #12 de l'analyse d'architecture. ## Phase 1 : Réorganisation Features BDD (Point #10 - RÉSOLU) - Créer structure features/{api,ui,e2e} - Déplacer 83 features en 3 catégories via git mv (historique préservé) - features/api/ : 53 features (tests API backend) - features/ui/ : 22 features (tests UI mobile) - features/e2e/ : 8 features (tests end-to-end) Domaines déplacés : - API : authentication, recommendation, rgpd-compliance, content-creation, moderation, monetisation, premium, radio-live, publicites - UI : audio-guides, navigation, interest-gauges, mode-offline, partage, profil, recherche - E2E : abonnements, error-handling ## Phase 2 : Mise à jour Documentation ### ADR-007 - Tests BDD - Ajouter section "Convention de Catégorisation des Features" - Documenter règles api/ui/e2e avec exemples concrets - Spécifier step definitions (backend Go, mobile Dart) ### ADR-024 - Stratégie CI/CD Monorepo (NOUVEAU) - Créer ADR dédié pour stratégie CI/CD avec path filters - Architecture workflows séparés (backend.yml, mobile.yml, shared.yml) - Configuration path filters détaillée avec exemples YAML - Matrice de déclenchement et optimisations (~70% gain temps CI) - Plan d'implémentation (~2h, reporté jusqu'au développement) ### ADR-016 - Organisation Monorepo - Simplifier en retirant section CI/CD détaillée - Ajouter référence vers ADR-024 pour stratégie CI/CD ### INCONSISTENCIES-ANALYSIS.md - Point #10 (Tests BDD synchronisés) : ✅ RÉSOLU - Catégorisation features implémentée - ADR-007 mis à jour avec convention complète - Point #11 (70/30 Split paiements) : ✅ ANNULÉ (faux problème) - ADR-009 et Règle 18 parfaitement cohérents - Documentation exhaustive existante (formule, SQL, comparaisons) - Point #12 (Monorepo path filters) : ⏸️ DOCUMENTÉ - Architecture CI/CD complète dans ADR-024 - Implémentation reportée (projet en phase documentation) - Métriques mises à jour : - MODERATE : 6/9 traités (4 résolus + 1 annulé + 1 documenté) - ADR à jour : 100% (19/19 avec ADR-024) ## Phase 3 : Validation - Structure features validée (api/ui/e2e, aucun répertoire restant) - Historique Git préservé (git mv, renommages détectés) - 83 features total (API: 53, UI: 22, E2E: 8) Closes: Point #10 (résolu), Point #11 (annulé), Point #12 (documenté) Co-Authored-By: Claude Sonnet 4.5 <noreply@anthropic.com>
225 lines
9.8 KiB
Gherkin
225 lines
9.8 KiB
Gherkin
# language: fr
|
|
|
|
@rgpd @geoip @degraded-mode
|
|
Fonctionnalité: Mode dégradé avec GeoIP (sans GPS précis)
|
|
|
|
# 13.5 - GeoIP par défaut, GPS optionnel (progressive disclosure)
|
|
|
|
Contexte:
|
|
Étant donné que je suis un nouvel utilisateur
|
|
Et que je lance l'application pour la première fois
|
|
|
|
# Niveaux de précision
|
|
|
|
Plan du Scénario: Trois niveaux de géolocalisation disponibles
|
|
Étant donné que j'utilise le niveau de géolocalisation "<niveau>"
|
|
Quand le système détermine ma position
|
|
Alors la technologie utilisée est "<technologie>"
|
|
Et les contenus accessibles sont "<contenus>"
|
|
Et le consentement RGPD est "<consentement>"
|
|
|
|
Exemples:
|
|
| niveau | technologie | contenus | consentement |
|
|
| Pays | Aucune géoloc | Contenus nationaux uniquement | Non requis |
|
|
| Ville | GeoIP (IP2Location) | Contenus régionaux/ville | Non requis |
|
|
| Précis | GPS | Tous contenus (hyperlocaux inclus) | Requis |
|
|
|
|
# Démarrage avec GeoIP automatique
|
|
|
|
Scénario: GeoIP activé par défaut au premier lancement
|
|
Étant donné que je lance l'application pour la première fois
|
|
Et que je n'ai pas encore accepté le GPS précis
|
|
Quand l'application démarre
|
|
Alors le système utilise automatiquement GeoIP basé sur mon adresse IP
|
|
Et ma position est détectée au niveau ville: "Paris, France"
|
|
Et aucun consentement n'est requis (GeoIP ne collecte pas de données personnelles)
|
|
Et je peux accéder aux contenus régionaux et de ville
|
|
|
|
Scénario: Détection de ville avec IP2Location Lite
|
|
Étant donné que mon adresse IP est 93.184.216.34
|
|
Quand le système utilise GeoIP IP2Location Lite
|
|
Alors ma ville est détectée: "Paris"
|
|
Et ma région est détectée: "Île-de-France"
|
|
Et mon pays est détecté: "France"
|
|
Et la précision est d'environ 80% au niveau ville
|
|
Et aucune coordonnée GPS précise n'est révélée
|
|
|
|
# Banner in-app pour upgrade vers GPS
|
|
|
|
Scénario: Banner d'invitation à activer le GPS
|
|
Étant donné que j'utilise l'application en mode GeoIP
|
|
Quand je suis sur l'écran principal
|
|
Alors un banner discret s'affiche en haut:
|
|
"""
|
|
Activez la géolocalisation pour découvrir du contenu près de chez vous
|
|
[Activer]
|
|
"""
|
|
Et le banner n'est pas intrusif (pas de popup modale)
|
|
Et je peux le fermer temporairement avec un bouton X
|
|
Et le banner réapparaît tous les 7 jours si je ne l'active pas
|
|
|
|
Scénario: Upgrade volontaire vers GPS depuis le banner
|
|
Étant donné que le banner d'invitation au GPS est affiché
|
|
Quand je clique sur "Activer"
|
|
Alors un écran de consentement GPS s'affiche
|
|
Et l'écran explique les avantages:
|
|
"""
|
|
En activant la géolocalisation précise, vous pouvez:
|
|
- Découvrir du contenu hyperlocal près de vous
|
|
- Accéder aux audio-guides géolocalisés
|
|
- Recevoir des notifications quand vous passez près de points d'intérêt
|
|
"""
|
|
Et je peux accepter ou refuser
|
|
Et si j'accepte, la permission OS est demandée
|
|
|
|
# Contenus accessibles selon le niveau
|
|
|
|
Scénario: Contenus disponibles en mode Pays (aucune géoloc)
|
|
Étant donné que je n'autorise aucune géolocalisation
|
|
Quand le système recherche du contenu à me proposer
|
|
Alors seuls les contenus "National" sont disponibles
|
|
Et les contenus géolocalisés (Ancré, Contextuel) ne sont pas proposés
|
|
Et je vois un message: "Activez la géolocalisation pour plus de contenu local"
|
|
|
|
Scénario: Contenus disponibles en mode Ville (GeoIP)
|
|
Étant donné que j'utilise le mode GeoIP et que je suis détecté à Paris
|
|
Quand le système recherche du contenu à me proposer
|
|
Alors les contenus suivants sont disponibles:
|
|
| type_contenu | disponible |
|
|
| National | oui |
|
|
| Région Île-de-France | oui |
|
|
| Ville Paris | oui |
|
|
| Hyperlocal (GPS) | non |
|
|
| Audio-guides | non |
|
|
Et je reçois des recommandations pertinentes pour Paris
|
|
|
|
Scénario: Tous contenus disponibles en mode Précis (GPS)
|
|
Étant donné que j'ai activé la géolocalisation précise
|
|
Quand le système recherche du contenu à me proposer
|
|
Alors tous les types de contenus sont disponibles:
|
|
| type_contenu | disponible |
|
|
| National | oui |
|
|
| Régional | oui |
|
|
| Ville | oui |
|
|
| Hyperlocal (Ancré) | oui |
|
|
| Contextuel | oui |
|
|
| Audio-guides | oui |
|
|
|
|
# Pas de consentement requis pour GeoIP
|
|
|
|
Scénario: GeoIP ne nécessite pas de consentement RGPD
|
|
Étant donné que j'utilise le mode GeoIP
|
|
Quand un auditeur CNIL vérifie la conformité
|
|
Alors GeoIP n'est pas considéré comme une donnée personnelle
|
|
Et l'adresse IP n'est pas conservée après détection de la ville
|
|
Et seule la ville est stockée (non identifiant)
|
|
Et aucun consentement n'est requis conformément au RGPD
|
|
|
|
# Implémentation IP2Location Lite
|
|
|
|
Scénario: Base de données IP2Location self-hosted
|
|
Étant donné que RoadWave utilise IP2Location Lite
|
|
Quand on analyse l'infrastructure
|
|
Alors la base de données IP2Location est hébergée sur les serveurs RoadWave
|
|
Et aucune requête n'est envoyée à un service tiers
|
|
Et la base de données est mise à jour automatiquement chaque mois
|
|
Et le coût est de 0€ (IP2Location Lite est gratuit)
|
|
|
|
Scénario: Mise à jour mensuelle de la base GeoIP
|
|
Étant donné que IP2Location publie des mises à jour mensuelles
|
|
Quand le 1er du mois arrive
|
|
Alors un job automatique télécharge la nouvelle base IP2Location Lite
|
|
Et la base est mise à jour sans interruption de service
|
|
Et un log est créé pour traçabilité
|
|
Et si la mise à jour échoue, une alerte est envoyée
|
|
|
|
# Progressive disclosure - UX dégradée acceptable
|
|
|
|
Scénario: UX acceptable en mode GeoIP
|
|
Étant donné que j'utilise le mode GeoIP à Paris
|
|
Quand je parcours l'application
|
|
Alors je peux écouter du contenu pertinent pour Paris et l'Île-de-France
|
|
Et l'expérience est satisfaisante même sans GPS précis
|
|
Et je ne suis pas bloqué dans l'utilisation de l'application
|
|
Et je peux choisir d'activer le GPS quand je le souhaite
|
|
|
|
Scénario: Incitation progressive à activer le GPS
|
|
Étant donné que j'utilise le mode GeoIP depuis 2 semaines
|
|
Et que je n'ai pas activé le GPS
|
|
Quand je consulte un audio-guide dans les résultats de recherche
|
|
Alors un message s'affiche:
|
|
"""
|
|
Cet audio-guide nécessite la géolocalisation précise pour fonctionner.
|
|
[Activer le GPS] [Plus tard]
|
|
"""
|
|
Et si je clique "Plus tard", je peux continuer à utiliser l'app normalement
|
|
Et l'incitation reste douce et non intrusive
|
|
|
|
# Passage d'un mode à l'autre
|
|
|
|
Scénario: Upgrade GeoIP vers GPS
|
|
Étant donné que j'utilise le mode GeoIP
|
|
Quand j'active la géolocalisation précise
|
|
Alors le système bascule immédiatement en mode GPS
|
|
Et les contenus hyperlocaux deviennent disponibles
|
|
Et mon feed se rafraîchit avec du contenu plus précis
|
|
Et un toast de confirmation s'affiche: "Géolocalisation activée"
|
|
|
|
Scénario: Downgrade GPS vers GeoIP
|
|
Étant donné que j'utilise le mode GPS précis
|
|
Quand je désactive la géolocalisation dans les paramètres OS
|
|
Alors le système bascule automatiquement en mode GeoIP
|
|
Et les contenus hyperlocaux ne sont plus proposés
|
|
Et un banner s'affiche: "Géolocalisation désactivée. Seul le contenu régional est disponible."
|
|
Et l'application continue de fonctionner normalement
|
|
|
|
# Détection automatique du mode
|
|
|
|
Scénario: Détection automatique au démarrage de l'app
|
|
Étant donné que j'ouvre l'application
|
|
Quand l'app vérifie les permissions de géolocalisation
|
|
Alors le système détecte automatiquement le mode disponible:
|
|
| permission GPS | consentement app | mode activé |
|
|
| Refusée | Non demandé | Pays |
|
|
| Refusée | Accepté | GeoIP |
|
|
| Accordée | Accepté | GPS précis |
|
|
Et le mode est appliqué sans interaction utilisateur
|
|
|
|
# Précision GeoIP ~80%
|
|
|
|
Scénario: Précision acceptable pour la plupart des cas
|
|
Étant donné que j'habite à Lyon
|
|
Et que mon IP est une IP résidentielle standard
|
|
Quand le système utilise GeoIP pour me localiser
|
|
Alors la ville détectée est "Lyon" (correct à 80%)
|
|
Et dans 20% des cas, la ville peut être légèrement erronée (banlieue proche)
|
|
Et cette précision est suffisante pour proposer du contenu régional pertinent
|
|
|
|
Scénario: GeoIP avec VPN ou proxy
|
|
Étant donné que j'utilise un VPN avec une IP sortante à Paris
|
|
Mais que je suis physiquement à Lyon
|
|
Quand le système utilise GeoIP
|
|
Alors la ville détectée est "Paris" (IP du VPN)
|
|
Et les contenus proposés sont pour Paris
|
|
Et je peux activer le GPS précis pour corriger la localisation
|
|
|
|
# Conformité RGPD
|
|
|
|
Scénario: Pas de donnée personnelle collectée avec GeoIP
|
|
Étant donné que j'utilise le mode GeoIP
|
|
Quand le système détermine ma ville via mon IP
|
|
Alors l'adresse IP n'est pas conservée après détection
|
|
Et seule la ville "Paris" est stockée en base de données
|
|
Et la ville seule n'est pas une donnée personnelle (RGPD)
|
|
Et aucun consentement n'est donc requis
|
|
|
|
# Coût de la solution: 0€
|
|
|
|
Scénario: Solution GeoIP gratuite et self-hosted
|
|
Étant donné que RoadWave utilise IP2Location Lite
|
|
Quand on calcule le coût de la solution
|
|
Alors le coût est de 0€
|
|
Et la solution est opensource
|
|
Et la base de données est hébergée sur les serveurs RoadWave
|
|
Et aucun coût SaaS tiers
|