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.
219 lines
12 KiB
Gherkin
219 lines
12 KiB
Gherkin
# language: fr
|
|
|
|
@ui @audio-guides @pedestrian @navigation @mvp
|
|
Fonctionnalité: Navigation libre complète en mode piéton
|
|
|
|
En tant qu'utilisateur piéton
|
|
Je veux naviguer librement dans un audio-guide sans contrainte d'ordre
|
|
Afin de découvrir les points d'intérêt selon mon itinéraire personnel
|
|
|
|
Contexte:
|
|
Étant donné un audio-guide "Visite du Quartier Latin" avec 8 séquences:
|
|
| Ordre | Nom | Position GPS | Rayon |
|
|
| 1 | Notre-Dame | 48.8534, 2.3488 | 100m |
|
|
| 2 | Sainte-Chapelle | 48.8555, 2.3450 | 80m |
|
|
| 3 | Panthéon | 48.8462, 2.3464 | 100m |
|
|
| 4 | Jardin du Luxembourg | 48.8462, 2.3371 | 150m |
|
|
| 5 | Sorbonne | 48.8487, 2.3431 | 70m |
|
|
| 6 | Musée de Cluny | 48.8505, 2.3434 | 60m |
|
|
| 7 | Rue Mouffetard | 48.8429, 2.3498 | 50m |
|
|
| 8 | Arènes de Lutèce | 48.8456, 2.3523 | 80m |
|
|
|
|
Scénario: Démarrage d'un audio-guide en mode piéton avec navigation libre
|
|
Étant donné un utilisateur "alice@roadwave.fr" en mode piéton
|
|
Et elle se trouve près de Notre-Dame
|
|
Quand elle lance l'audio-guide "Visite du Quartier Latin"
|
|
Alors l'écran principal affiche:
|
|
| Élément | Contenu |
|
|
| Carte interactive | Affichée avec 8 marqueurs |
|
|
| Position utilisateur | Marqueur bleu en temps réel |
|
|
| Points d'intérêt | Marqueurs numérotés 1-8 |
|
|
| Distances | Affichées sur chaque marqueur |
|
|
| Point le plus proche | Surligné en vert (Notre-Dame, 50m) |
|
|
| Mode de lecture | "Navigation libre" activé par défaut |
|
|
| Bouton "Liste" | Affiche la liste des séquences |
|
|
Et un événement "AUDIO_GUIDE_STARTED_FREE_NAVIGATION" est enregistré
|
|
Et la métrique "audio_guide.started.free_navigation" est incrémentée
|
|
|
|
Scénario: Déclenchement automatique au point d'intérêt le plus proche
|
|
Étant donné un utilisateur "bob@roadwave.fr" en mode piéton
|
|
Et il a lancé l'audio-guide "Visite du Quartier Latin"
|
|
Et il marche vers Notre-Dame
|
|
Quand il entre dans le rayon de 100m de Notre-Dame
|
|
Alors l'audio de la séquence #1 "Notre-Dame" démarre automatiquement
|
|
Et une notification s'affiche:
|
|
| Élément | Contenu |
|
|
| Titre | 1/8 - Cathédrale Notre-Dame |
|
|
| Distance | Vous êtes arrivé |
|
|
| Progression | Barre de lecture audio |
|
|
| Actions | [Pause] [Liste] [Carte] |
|
|
Et le marqueur Notre-Dame passe de vert à bleu (en cours)
|
|
Et un événement "SEQUENCE_AUTO_TRIGGERED" est enregistré
|
|
Et la métrique "audio_guide.sequence.auto_triggered" est incrémentée
|
|
|
|
Scénario: Écoute d'une séquence dans un ordre différent de l'ordre suggéré
|
|
Étant donné un utilisateur "charlie@roadwave.fr" en mode piéton
|
|
Et il a lancé l'audio-guide et écouté la séquence #1 "Notre-Dame"
|
|
Et il décide de se rendre directement au Panthéon (séquence #3)
|
|
Quand il marche vers le Panthéon en ignorant la séquence #2
|
|
Et entre dans le rayon de 100m du Panthéon
|
|
Alors l'audio de la séquence #3 "Panthéon" démarre automatiquement
|
|
Et la séquence #2 "Sainte-Chapelle" reste disponible et non écoutée
|
|
Et un événement "SEQUENCE_OUT_OF_ORDER" est enregistré
|
|
Et la métrique "audio_guide.sequence.out_of_order" est incrémentée
|
|
Et la progression affiche: 2/8 séquences écoutées
|
|
|
|
Scénario: Affichage de la carte avec points d'intérêt colorés par statut
|
|
Étant donné un utilisateur "david@roadwave.fr" en mode piéton
|
|
Et il a écouté 3 séquences sur 8
|
|
Quand il consulte la carte
|
|
Alors les marqueurs sont colorés selon leur statut:
|
|
| Séquence | Statut | Couleur | Icône |
|
|
| Notre-Dame | Écoutée | Bleu | ✓ |
|
|
| Sainte-Chapelle | Non écoutée | Gris | 2 |
|
|
| Panthéon | Écoutée | Bleu | ✓ |
|
|
| Jardin du Luxembourg| Non écoutée | Gris | 4 |
|
|
| Sorbonne | Écoutée | Bleu | ✓ |
|
|
| Musée de Cluny | Non écoutée | Gris | 6 |
|
|
| Rue Mouffetard | En cours | Orange | ▶ |
|
|
| Arènes de Lutèce | Non écoutée | Gris | 8 |
|
|
Et le point le plus proche est surligné avec un halo vert
|
|
Et les distances sont affichées en temps réel
|
|
|
|
Scénario: Consultation de la liste des séquences avec filtres
|
|
Étant donné un utilisateur "eve@roadwave.fr" en mode piéton
|
|
Quand elle clique sur le bouton "Liste"
|
|
Alors une liste des séquences s'affiche:
|
|
| Séquence | Distance | Statut | Actions |
|
|
| Notre-Dame | 50m | ✓ Écoutée | [Réécouter] |
|
|
| Sainte-Chapelle | 200m | Non écoutée | [Y aller] [Lire] |
|
|
| Panthéon | 350m | ✓ Écoutée | [Réécouter] |
|
|
| Jardin du Luxembourg| 450m | Non écoutée | [Y aller] [Lire] |
|
|
Et elle peut filtrer par:
|
|
| Filtre | Options |
|
|
| Statut | Toutes / Écoutées / Restantes |
|
|
| Tri | Distance / Ordre suggéré / Durée |
|
|
Et un compteur affiche: "3/8 séquences écoutées"
|
|
|
|
Scénario: Lecture manuelle d'une séquence depuis la liste
|
|
Étant donné un utilisateur "frank@roadwave.fr" en mode piéton
|
|
Et il consulte la liste des séquences
|
|
Quand il clique sur "Lire" pour la séquence #5 "Sorbonne"
|
|
Alors l'audio de la Sorbonne démarre immédiatement
|
|
Et peu importe la distance actuelle (peut être loin du point)
|
|
Et un événement "SEQUENCE_MANUAL_PLAY" est enregistré
|
|
Et la métrique "audio_guide.sequence.manual_play" est incrémentée
|
|
Et un message d'information s'affiche: "Vous écoutez cette séquence hors localisation"
|
|
|
|
Scénario: Navigation vers un point d'intérêt depuis la liste
|
|
Étant donné un utilisateur "grace@roadwave.fr" en mode piéton
|
|
Et elle consulte la liste des séquences
|
|
Quand elle clique sur "Y aller" pour la séquence #4 "Jardin du Luxembourg"
|
|
Alors l'application lance la navigation GPS vers le Jardin du Luxembourg
|
|
Et un itinéraire piéton est calculé et affiché sur la carte
|
|
Et la distance et le temps estimé sont affichés: "450m - 6 min"
|
|
Et des instructions de navigation vocales sont données:
|
|
| Instruction |
|
|
| Dirigez-vous vers le sud |
|
|
| Tournez à gauche dans 100 mètres |
|
|
| Vous arrivez à destination |
|
|
Et un événement "NAVIGATION_TO_POI_STARTED" est enregistré
|
|
Et la métrique "audio_guide.navigation.started" est incrémentée
|
|
|
|
Scénario: Réécoute d'une séquence déjà complétée
|
|
Étant donné un utilisateur "henry@roadwave.fr" en mode piéton
|
|
Et il a déjà écouté la séquence #1 "Notre-Dame" en entier
|
|
Quand il clique sur "Réécouter" depuis la liste
|
|
Alors l'audio de Notre-Dame redémarre depuis le début
|
|
Et un événement "SEQUENCE_REPLAYED" est enregistré
|
|
Et la métrique "audio_guide.sequence.replayed" est incrémentée
|
|
Et la séquence reste marquée comme "Écoutée" (pas de duplication)
|
|
|
|
Scénario: Pause et reprise d'une séquence en cours
|
|
Étant donné un utilisateur "iris@roadwave.fr" en mode piéton
|
|
Et elle écoute la séquence #3 "Panthéon" à la position 2min 30s
|
|
Quand elle clique sur le bouton "Pause"
|
|
Alors l'audio se met en pause
|
|
Et la position de lecture est sauvegardée: 2min 30s
|
|
Et un événement "SEQUENCE_PAUSED" est enregistré
|
|
Quand elle clique sur le bouton "Lecture"
|
|
Alors l'audio reprend exactement à 2min 30s
|
|
Et un événement "SEQUENCE_RESUMED" est enregistré
|
|
|
|
Scénario: Affichage de la progression globale de l'audio-guide
|
|
Étant donné un utilisateur "jack@roadwave.fr" en mode piéton
|
|
Et il a écouté 5 séquences sur 8
|
|
Quand il consulte l'écran principal
|
|
Alors il voit la progression:
|
|
| Élément | Contenu |
|
|
| Barre de progression | 5/8 (62%) |
|
|
| Séquences restantes | 3 points à découvrir |
|
|
| Temps écouté | 42 minutes |
|
|
| Distance parcourue | 2.8 km |
|
|
| Badge de complétion | Bronze (50%+) |
|
|
Et un bouton "Terminer l'audio-guide" est disponible si toutes les séquences sont écoutées
|
|
|
|
Scénario: Découverte d'un point bonus caché (Easter egg)
|
|
Étant donné un audio-guide avec un point bonus secret non listé
|
|
Et un utilisateur "kate@roadwave.fr" en mode piéton
|
|
Quand elle passe à proximité du point bonus caché (48.8470, 2.3450)
|
|
Alors une notification s'affiche: "🎉 Point bonus découvert !"
|
|
Et l'audio du point bonus démarre automatiquement
|
|
Et un badge "Explorateur" est débloqué
|
|
Et un événement "BONUS_POI_DISCOVERED" est enregistré
|
|
Et la métrique "audio_guide.bonus.discovered" est incrémentée
|
|
|
|
Scénario: Notifications de proximité pour les points à venir
|
|
Étant donné un utilisateur "luke@roadwave.fr" en mode piéton
|
|
Et il marche vers la Sainte-Chapelle
|
|
Quand il est à 150m de la Sainte-Chapelle
|
|
Alors une notification discrète s'affiche: "Sainte-Chapelle à 150m"
|
|
Et un son subtil de notification est joué
|
|
Quand il est à 50m
|
|
Alors une notification plus visible s'affiche: "Arrivée imminente - Sainte-Chapelle"
|
|
Et un événement "POI_PROXIMITY_NOTIFICATION" est enregistré
|
|
Et la métrique "audio_guide.proximity.notified" est incrémentée
|
|
|
|
Scénario: Mode hors ligne avec téléchargement préalable
|
|
Étant donné un utilisateur "mary@roadwave.fr" en mode piéton
|
|
Et elle a téléchargé l'audio-guide "Visite du Quartier Latin" avant de partir
|
|
Quand elle active le mode avion (hors connexion)
|
|
Alors la carte s'affiche en mode hors ligne (tiles pré-téléchargées)
|
|
Et tous les audios sont disponibles en local
|
|
Et la localisation GPS fonctionne normalement
|
|
Et les séquences se déclenchent automatiquement hors ligne
|
|
Et un événement "AUDIO_GUIDE_OFFLINE_MODE" est enregistré
|
|
Et la métrique "audio_guide.offline.used" est incrémentée
|
|
|
|
Scénario: Partage de la progression avec des amis
|
|
Étant donné un utilisateur "nathan@roadwave.fr" en mode piéton
|
|
Et il a écouté 4 séquences sur 8
|
|
Quand il clique sur "Partager ma progression"
|
|
Alors un écran de partage s'ouvre avec:
|
|
| Élément | Contenu |
|
|
| Message | Je suis en train de découvrir le Quartier Latin !|
|
|
| Progression | 4/8 points visités (50%) |
|
|
| Carte visuelle | Capture d'écran de la carte avec progression |
|
|
| Lien | https://roadwave.fr/share/abc123 |
|
|
Et le partage peut être envoyé via:
|
|
| Canal | Disponible |
|
|
| SMS | Oui |
|
|
| WhatsApp | Oui |
|
|
| Facebook | Oui |
|
|
| Twitter/X | Oui |
|
|
Et un événement "AUDIO_GUIDE_PROGRESS_SHARED" est enregistré
|
|
Et la métrique "audio_guide.shared" est incrémentée
|
|
|
|
Scénario: Métriques de performance de la navigation libre
|
|
Étant donné que 10 000 utilisateurs ont terminé l'audio-guide en mode navigation libre
|
|
Quand les métriques d'usage sont collectées
|
|
Alors les indicateurs suivants sont disponibles:
|
|
| Métrique | Valeur moyenne |
|
|
| Taux de complétion | 78% |
|
|
| Nombre de séquences écoutées | 6.5/8 |
|
|
| Temps moyen de visite | 2h 15min |
|
|
| Distance moyenne parcourue | 3.2 km |
|
|
| Pourcentage d'ordre non-suggéré | 42% |
|
|
| Nombre de réécoutes par séquence | 0.8 |
|
|
Et les métriques sont exportées vers le système de monitoring
|