refactor(docs): réorganiser la documentation selon principes DDD

Réorganise la documentation du projet selon les principes du Domain-Driven Design (DDD) pour améliorer la cohésion, la maintenabilité et l'alignement avec l'architecture modulaire du backend.

**Structure cible:**
```
docs/domains/
├── README.md (Context Map)
├── _shared/ (Core Domain)
├── recommendation/ (Supporting Subdomain)
├── content/ (Supporting Subdomain)
├── moderation/ (Supporting Subdomain)
├── advertising/ (Generic Subdomain)
├── premium/ (Generic Subdomain)
└── monetization/ (Generic Subdomain)
```

**Changements effectués:**

Phase 1: Création de l'arborescence des 7 bounded contexts
Phase 2: Déplacement des règles métier (01-19) vers domains/*/rules/
Phase 3: Déplacement des diagrammes d'entités vers domains/*/entities/
Phase 4: Déplacement des diagrammes flux/états/séquences vers domains/*/
Phase 5: Création des README.md pour chaque domaine
Phase 6: Déplacement des features Gherkin vers domains/*/features/
Phase 7: Création du Context Map (domains/README.md)
Phase 8: Mise à jour de mkdocs.yml pour la nouvelle navigation
Phase 9: Correction automatique des liens internes (script fix-markdown-links.sh)
Phase 10: Nettoyage de l'ancienne structure (regles-metier/, diagrammes/, features/)

**Configuration des tests:**
- Makefile: godog run docs/domains/*/features/
- scripts/generate-bdd-docs.py: features_dir → docs/domains

**Avantages:**
 Cohésion forte: toute la doc d'un domaine au même endroit
 Couplage faible: domaines indépendants, dépendances explicites
 Navigabilité améliorée: README par domaine = entrée claire
 Alignement code/docs: miroir de backend/internal/
 Onboarding facilité: exploration domaine par domaine
 Tests BDD intégrés: features au plus près des règles métier

Voir docs/REFACTOR-DDD.md pour le plan complet.
This commit is contained in:
jpgiannetti
2026-02-07 17:15:02 +01:00
parent 78422bb2c0
commit 5e5fcf4714
227 changed files with 1413 additions and 1967 deletions

View File

@@ -0,0 +1,224 @@
# 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