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.
266 lines
11 KiB
Gherkin
266 lines
11 KiB
Gherkin
# language: fr
|
|
Fonctionnalité: Mode piéton - Notifications push et basculement automatique
|
|
En tant qu'utilisateur à pied
|
|
Je veux recevoir des notifications push pour audio-guides à proximité
|
|
Afin d'être alerté même avec l'application en arrière-plan
|
|
|
|
Contexte:
|
|
Étant donné que l'application RoadWave est installée
|
|
Et que l'utilisateur est connecté
|
|
|
|
# Détection automatique mode piéton
|
|
|
|
Scénario: Basculement automatique vers mode piéton (vitesse < 5 km/h)
|
|
Étant donné que je suis en mode voiture (vitesse 50 km/h)
|
|
Quand ma vitesse GPS moyenne passe à 3 km/h pendant 10 secondes
|
|
Alors l'application bascule automatiquement en mode piéton
|
|
Et aucune popup de confirmation n'est affichée
|
|
Et les notifications passent de "sonores + icône" à "push arrière-plan"
|
|
Et le rayon de détection passe de 7s ETA à 200 mètres
|
|
|
|
Scénario: Basculement automatique vers mode voiture (vitesse ≥ 5 km/h)
|
|
Étant donné que je suis en mode piéton (vitesse 3 km/h)
|
|
Quand ma vitesse GPS moyenne passe à 20 km/h pendant 10 secondes
|
|
Alors l'application bascule automatiquement en mode voiture
|
|
Et aucune popup de confirmation n'est affichée
|
|
Et les notifications passent de "push arrière-plan" à "sonores + icône"
|
|
Et le rayon de détection passe de 200m à 7s ETA
|
|
|
|
Scénario: Hysteresis pour éviter basculements intempestifs
|
|
Étant donné que je suis en mode piéton (vitesse 3 km/h)
|
|
Quand ma vitesse passe brièvement à 6 km/h pendant 2 secondes
|
|
Et qu'elle redescend à 3 km/h
|
|
Alors le mode piéton est conservé
|
|
Et aucun basculement n'a lieu
|
|
Car la durée de 10 secondes stables n'a pas été atteinte
|
|
|
|
Scénario: Vitesse moyenne calculée sur 30 secondes
|
|
Étant donné que je suis en mode voiture
|
|
Et que mes vitesses sur 30 secondes sont: [50, 48, 52, 3, 2, 4, 3, 2, ...]
|
|
Quand la vitesse moyenne sur 30s devient < 5 km/h
|
|
Et qu'elle reste stable pendant 10 secondes
|
|
Alors le basculement vers mode piéton s'effectue
|
|
|
|
# Permissions et activation
|
|
|
|
Scénario: Permission "While Using App" demandée au premier lancement
|
|
Étant donné que c'est le premier lancement de l'application
|
|
Quand j'arrive sur l'onboarding
|
|
Alors une demande de permission "Autoriser la localisation pendant l'utilisation" s'affiche
|
|
Et l'explication est: "RoadWave utilise votre position pour proposer des contenus audio géolocalisés adaptés à votre trajet"
|
|
Quand j'accepte
|
|
Alors le mode voiture est pleinement fonctionnel
|
|
Et le mode piéton notifications push n'est PAS encore activé
|
|
|
|
Scénario: Permission "Always" demandée uniquement si user active mode piéton
|
|
Étant donné que j'utilise RoadWave avec permission "While Using App"
|
|
Et que je vais dans Réglages > Notifications audio-guides piéton
|
|
Quand je clique sur le toggle "Activer notifications piéton"
|
|
Alors un écran d'éducation s'affiche:
|
|
"""
|
|
📍 Notifications audio-guides piéton
|
|
|
|
Pour vous alerter d'audio-guides à proximité même
|
|
quand vous marchez avec l'app fermée, RoadWave a
|
|
besoin de votre position en arrière-plan.
|
|
|
|
Votre position sera utilisée pour :
|
|
✅ Détecter monuments à 200m
|
|
✅ Vous envoyer une notification
|
|
|
|
Votre position ne sera jamais :
|
|
❌ Vendue à des tiers
|
|
❌ Utilisée pour de la publicité
|
|
|
|
Cette fonctionnalité est optionnelle.
|
|
Vous pouvez utiliser RoadWave sans cette permission.
|
|
|
|
[Continuer] [Non merci]
|
|
"""
|
|
Quand je clique sur "Continuer"
|
|
Alors la demande système "Autoriser toujours" (iOS) ou "Autoriser tout le temps" (Android) s'affiche
|
|
Et le mode piéton push est activé si j'accepte
|
|
|
|
Scénario: Permission arrière-plan refusée désactive mode piéton push
|
|
Étant donné que je refuse la permission "Autoriser toujours"
|
|
Quand je reviens dans l'application
|
|
Alors le toggle "Notifications piéton" est grisé et désactivé
|
|
Et un message s'affiche: "Permission refusée. Mode piéton désactivé."
|
|
Et le mode voiture reste pleinement fonctionnel
|
|
Et je peux toujours utiliser les audio-guides en mode manuel
|
|
|
|
Scénario: Permission arrière-plan peut être accordée plus tard
|
|
Étant donné que j'ai refusé la permission arrière-plan
|
|
Quand je vais dans Réglages de l'app
|
|
Alors un bouton "Activer notifications piéton" est disponible
|
|
Et un lien vers les réglages système iOS/Android est fourni
|
|
Quand j'accorde la permission dans les réglages système
|
|
Et que je reviens dans l'app
|
|
Alors le mode piéton push est automatiquement activé
|
|
|
|
# Notifications push en arrière-plan
|
|
|
|
Scénario: Notification push quand app en arrière-plan (mode piéton)
|
|
Étant donné que je suis en mode piéton
|
|
Et que l'application est en arrière-plan (fermée)
|
|
Et que je marche à proximité du Louvre
|
|
Quand je passe dans le rayon de 200 mètres d'un audio-guide
|
|
Alors une notification push système s'affiche:
|
|
"""
|
|
Audio-guide à proximité
|
|
Musée du Louvre : La Joconde - @paris_museum
|
|
"""
|
|
Et je reçois la notification même si l'app est fermée
|
|
|
|
Scénario: Tap sur notification ouvre app sur le contenu
|
|
Étant donné qu'une notification push "Audio-guide à proximité" s'affiche
|
|
Quand je tape sur la notification
|
|
Alors l'application s'ouvre
|
|
Et je suis redirigé vers la page du contenu audio-guide
|
|
Et je peux démarrer la lecture manuellement
|
|
Et je peux voir la description, le créateur, la durée, etc.
|
|
|
|
Scénario: Geofencing iOS/Android pour économie batterie
|
|
Étant donné que le mode piéton est activé
|
|
Et que l'application utilise geofencing natif
|
|
Quand je me déplace à pied
|
|
Alors l'OS iOS/Android gère la détection de proximité
|
|
Et l'application n'a pas besoin d'être constamment active
|
|
Et la batterie est préservée (< 5% consommation supplémentaire)
|
|
|
|
Scénario: Rayon de détection 200 mètres en mode piéton
|
|
Étant donné que je suis en mode piéton
|
|
Et qu'un audio-guide existe à 250 mètres
|
|
Quand je me déplace
|
|
Alors aucune notification n'est envoyée (hors rayon)
|
|
Quand je passe à 180 mètres
|
|
Alors une notification push est envoyée
|
|
Car je suis dans le rayon de 200m
|
|
|
|
# Quota anti-spam mode piéton
|
|
|
|
Scénario: Même quota 6 notifications/heure en mode piéton
|
|
Étant donné que je suis en mode piéton
|
|
Et que j'ai reçu 6 notifications push dans la dernière heure
|
|
Quand je passe près d'un 7ème audio-guide
|
|
Alors aucune notification n'est envoyée
|
|
Et le quota horaire est respecté
|
|
|
|
Scénario: Cooldown 10 min si notification ignorée (app pas ouverte)
|
|
Étant donné qu'une notification push a été envoyée
|
|
Et que je ne l'ai pas ouverte dans les 10 minutes
|
|
Quand le système détecte l'ignorance
|
|
Alors un cooldown de 10 minutes est activé
|
|
Et aucune nouvelle notification n'est envoyée pendant 10 min
|
|
|
|
# Basculement automatique
|
|
|
|
Scénario: Basculement transparent sans friction
|
|
Étant donné que je marche à 3 km/h (mode piéton)
|
|
Et que je monte dans ma voiture
|
|
Quand ma vitesse passe à 50 km/h (stable 10s)
|
|
Alors le basculement vers mode voiture s'effectue automatiquement
|
|
Et je n'ai rien à faire
|
|
Et aucune popup ne m'interrompt
|
|
Et l'expérience est transparente
|
|
|
|
Scénario: Notifications adaptées automatiquement
|
|
Étant donné que je passe de piéton (3 km/h) à voiture (50 km/h)
|
|
Quand le basculement s'effectue
|
|
Alors les notifications push arrière-plan sont désactivées
|
|
Et les notifications sonores + icône (app ouverte) sont activées
|
|
Et le rayon passe de 200m à ETA 7 secondes
|
|
Et l'adaptation est immédiate
|
|
|
|
# Garantie RGPD et fonctionnalité optionnelle
|
|
|
|
Scénario: Application utilisable sans permission arrière-plan
|
|
Étant donné que je refuse la permission "Autoriser toujours"
|
|
Quand j'utilise RoadWave
|
|
Alors le mode voiture fonctionne à 100%
|
|
Et je peux accéder à tous les audio-guides en mode manuel
|
|
Et je peux télécharger des contenus offline
|
|
Et seules les notifications push piéton sont désactivées
|
|
|
|
Scénario: Révocation permission arrière-plan désactive mode piéton
|
|
Étant donné que le mode piéton push était actif
|
|
Quand je révoque la permission dans les réglages iOS/Android
|
|
Et que j'ouvre l'application
|
|
Alors un message s'affiche: "Permission arrière-plan révoquée. Mode piéton désactivé."
|
|
Et le toggle est grisé dans les réglages
|
|
Et le mode voiture reste fonctionnel
|
|
|
|
Scénario: Désactivation mode piéton dans réglages
|
|
Étant donné que le mode piéton push est actif
|
|
Quand je vais dans Réglages > Notifications audio-guides piéton
|
|
Et que je désactive le toggle
|
|
Alors les notifications push sont arrêtées
|
|
Et le geofencing est désactivé
|
|
Et la permission arrière-plan reste accordée (mais non utilisée)
|
|
Et je peux réactiver plus tard
|
|
|
|
# Messages d'information
|
|
|
|
Scénario: Message clair sur usage permission arrière-plan
|
|
Étant donné que je consulte les réglages
|
|
Quand j'affiche les informations sur le mode piéton
|
|
Alors je vois:
|
|
"""
|
|
RoadWave utilise votre position en arrière-plan uniquement
|
|
pour vous alerter d'audio-guides à proximité quand vous
|
|
marchez. Cette fonctionnalité peut être désactivée à tout
|
|
moment. Votre position n'est jamais partagée avec des tiers.
|
|
"""
|
|
|
|
# Cas limites
|
|
|
|
Scénario: Mode indéterminé si vitesse exactement 5 km/h
|
|
Étant donné que ma vitesse moyenne est exactement 5.0 km/h
|
|
Quand le système vérifie le mode
|
|
Alors le mode actuel est conservé (pas de basculement)
|
|
Car le seuil est strict (< 5 km/h pour piéton, ≥ 5 km/h pour voiture)
|
|
|
|
Scénario: Basculement impossible si GPS désactivé
|
|
Étant donné que je désactive le GPS
|
|
Quand le système tente de détecter la vitesse
|
|
Alors aucun basculement automatique ne se produit
|
|
Et le mode actuel est conservé par défaut
|
|
Et un message "GPS désactivé" s'affiche si je tente de naviguer
|
|
|
|
Scénario: Notification push ignorée ne consomme pas de quota
|
|
Étant donné qu'une notification push est envoyée
|
|
Et que je ne l'ouvre pas (ignorée)
|
|
Quand je consulte mon quota
|
|
Alors cette notification compte quand même dans le quota 6/h
|
|
Et le cooldown 10 min est activé
|
|
|
|
Plan du Scénario: Basculement selon vitesse
|
|
Étant donné que ma vitesse moyenne est <vitesse> km/h pendant 10s
|
|
Et que je suis en mode <mode_initial>
|
|
Quand le système détecte la vitesse stable
|
|
Alors le mode devient <mode_final>
|
|
|
|
Exemples:
|
|
| vitesse | mode_initial | mode_final |
|
|
| 2 | voiture | piéton |
|
|
| 3 | voiture | piéton |
|
|
| 4 | voiture | piéton |
|
|
| 5 | piéton | voiture |
|
|
| 10 | piéton | voiture |
|
|
| 50 | piéton | voiture |
|
|
| 130 | piéton | voiture |
|
|
|
|
Plan du Scénario: Rayon de détection selon mode
|
|
Étant donné que je suis en mode <mode>
|
|
Quand un contenu géolocalisé existe à <distance>
|
|
Alors une notification est <decision>
|
|
|
|
Exemples:
|
|
| mode | distance | decision |
|
|
| piéton | 150m | envoyée |
|
|
| piéton | 199m | envoyée |
|
|
| piéton | 201m | non envoyée |
|
|
| piéton | 300m | non envoyée |
|
|
| voiture | 98m (ETA 7s) | envoyée |
|
|
| voiture | 150m (ETA 10s) | non envoyée |
|