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.
224 lines
12 KiB
Gherkin
224 lines
12 KiB
Gherkin
# language: fr
|
|
|
|
@api @audio-guides @car-mode @geolocation @mvp
|
|
Fonctionnalité: Déclenchement GPS automatique des audio-guides en mode voiture
|
|
|
|
En tant qu'utilisateur en voiture
|
|
Je veux que les audio-guides se déclenchent automatiquement à l'approche des points d'intérêt
|
|
Afin de profiter d'une expérience guidée sans interaction manuelle pendant la conduite
|
|
|
|
Contexte:
|
|
Étant donné que le système de déclenchement en mode voiture respecte:
|
|
| Paramètre | Valeur |
|
|
| Rayon de déclenchement | 200-500m |
|
|
| Vitesse max pour déclenchement | 90 km/h |
|
|
| Ordre de séquences | Strict |
|
|
| Notification visuelle | Minimale |
|
|
| Notification audio | Prioritaire |
|
|
| Auto-play | Obligatoire |
|
|
|
|
Scénario: Démarrage d'un audio-guide en mode voiture
|
|
Étant donné un utilisateur "alice@roadwave.fr" en mode voiture
|
|
Et elle roule à 50 km/h sur l'autoroute A6
|
|
Quand elle lance l'audio-guide "Route des Châteaux de la Loire"
|
|
Alors l'audio de la séquence d'introduction démarre automatiquement
|
|
Et l'interface minimaliste en mode voiture s'affiche:
|
|
| Élément | État |
|
|
| Carte | Simplifiée, zoom automatique |
|
|
| Notifications visuelles | Minimales |
|
|
| Prochain point | Château de Chambord - 25 km |
|
|
| ETA | Arrivée dans 18 minutes |
|
|
| Contrôles audio | Gros boutons [Pause] [Skip] |
|
|
Et un événement "AUDIO_GUIDE_STARTED_CAR_MODE" est enregistré
|
|
Et la métrique "audio_guide.started.car_mode" est incrémentée
|
|
|
|
Scénario: Déclenchement automatique à l'approche d'un point d'intérêt
|
|
Étant donné un utilisateur "bob@roadwave.fr" en mode voiture à 60 km/h
|
|
Et il écoute l'audio-guide "Route des Châteaux de la Loire"
|
|
Et il approche du Château de Chambord
|
|
Quand il entre dans un rayon de 400m du château (configuré par le créateur)
|
|
Alors l'audio en cours se termine en fondu (3 secondes)
|
|
Et l'audio de la séquence "Château de Chambord" démarre automatiquement
|
|
Et une notification audio est jouée: "À votre droite, Château de Chambord"
|
|
Et une notification visuelle minimale s'affiche brièvement (2s):
|
|
| Élément | Contenu |
|
|
| Titre | Château de Chambord |
|
|
| Direction | → À droite |
|
|
| Distance | 400m |
|
|
Et un événement "SEQUENCE_AUTO_TRIGGERED_CAR" est enregistré
|
|
Et la métrique "audio_guide.sequence.car.triggered" est incrémentée
|
|
|
|
Scénario: Calcul de l'ETA dynamique basé sur la vitesse réelle
|
|
Étant donné un utilisateur "charlie@roadwave.fr" en mode voiture
|
|
Et il approche du prochain point d'intérêt à 15 km
|
|
Et il roule à 80 km/h
|
|
Quand le système calcule l'ETA
|
|
Alors l'ETA affiché est: "Arrivée dans 11 minutes"
|
|
Quand il ralentit à 50 km/h (bouchon)
|
|
Alors l'ETA est recalculé en temps réel: "Arrivée dans 18 minutes"
|
|
Et un événement "ETA_RECALCULATED" est enregistré
|
|
Et la métrique "audio_guide.eta.updated" est incrémentée
|
|
|
|
Scénario: Notification vocale d'approche 2km avant le point
|
|
Étant donné un utilisateur "david@roadwave.fr" en mode voiture à 70 km/h
|
|
Et il écoute l'audio-guide "Route des Châteaux de la Loire"
|
|
Quand il est à 2 km du Château de Chenonceau
|
|
Alors une notification vocale est jouée par-dessus l'audio actuel:
|
|
"Dans 2 kilomètres, vous découvrirez le Château de Chenonceau"
|
|
Et le volume de l'audio actuel est réduit de 50% pendant la notification (ducking audio)
|
|
Et après la notification, le volume reprend normalement
|
|
Et un événement "POI_ADVANCE_NOTIFICATION" est enregistré avec distance: 2000m
|
|
Et la métrique "audio_guide.advance_notification" est incrémentée
|
|
|
|
Scénario: Gestion du dépassement d'un point d'intérêt sans déclenchement
|
|
Étant donné un utilisateur "eve@roadwave.fr" en mode voiture à 90 km/h
|
|
Et elle approche du Château d'Amboise (séquence #3)
|
|
Mais elle a manqué la séquence #2 (Château de Chaumont)
|
|
Quand elle entre dans le rayon du Château d'Amboise
|
|
Alors l'audio de la séquence #2 est automatiquement joué d'abord
|
|
Et un message vocal indique: "Séquence précédente: Château de Chaumont"
|
|
Et après la fin de la séquence #2, la séquence #3 démarre
|
|
Et un événement "SEQUENCE_CATCH_UP" est enregistré
|
|
Et la métrique "audio_guide.sequence.catch_up" est incrémentée
|
|
|
|
Scénario: Marquage automatique d'une séquence comme "manquée"
|
|
Étant donné un utilisateur "frank@roadwave.fr" en mode voiture à 100 km/h
|
|
Et il a dépassé le Château de Chaumont sans entrer dans son rayon
|
|
Et il s'éloigne maintenant à plus de 5 km
|
|
Alors la séquence "Château de Chaumont" est marquée comme "Manquée"
|
|
Et elle reste disponible dans la liste pour écoute manuelle ultérieure
|
|
Et un événement "SEQUENCE_MISSED" est enregistré avec raison: "too_fast"
|
|
Et la métrique "audio_guide.sequence.missed" est incrémentée
|
|
|
|
Scénario: Pause automatique lors d'un appel téléphonique
|
|
Étant donné un utilisateur "grace@roadwave.fr" en mode voiture
|
|
Et elle écoute l'audio-guide à la position 3min 20s
|
|
Quand elle reçoit un appel téléphonique via CarPlay
|
|
Alors l'audio-guide se met automatiquement en pause
|
|
Et la position de lecture est sauvegardée: 3min 20s
|
|
Et un événement "AUDIO_PAUSED_PHONE_CALL" est enregistré
|
|
Quand l'appel se termine
|
|
Alors l'audio-guide reprend automatiquement à 3min 20s
|
|
Et un événement "AUDIO_RESUMED_AFTER_CALL" est enregistré
|
|
Et la métrique "audio_guide.interruption.phone" est incrémentée
|
|
|
|
Scénario: Intégration avec CarPlay pour affichage sur écran véhicule
|
|
Étant donné un utilisateur "henry@roadwave.fr" en mode voiture
|
|
Et son iPhone est connecté via CarPlay
|
|
Quand il lance l'audio-guide "Route des Châteaux de la Loire"
|
|
Alors l'interface CarPlay s'affiche sur l'écran du véhicule:
|
|
| Élément | Affichage |
|
|
| Carte simplifiée | Vue routière optimisée |
|
|
| Prochain point | Nom + distance + ETA |
|
|
| Contrôles audio | Gros boutons tactiles |
|
|
| Progression | Barre 3/10 séquences |
|
|
| Commandes vocales | "Dis Siri, suivant" |
|
|
Et les contrôles au volant du véhicule fonctionnent (lecture/pause)
|
|
Et un événement "CARPLAY_SESSION_STARTED" est enregistré
|
|
Et la métrique "audio_guide.carplay.used" est incrémentée
|
|
|
|
Scénario: Commandes vocales Siri pour contrôle sans les mains
|
|
Étant donné un utilisateur "iris@roadwave.fr" en mode voiture
|
|
Et elle écoute l'audio-guide via CarPlay
|
|
Quand elle dit "Dis Siri, mets en pause"
|
|
Alors l'audio-guide se met en pause
|
|
Quand elle dit "Dis Siri, reprends la lecture"
|
|
Alors l'audio-guide reprend
|
|
Quand elle dit "Dis Siri, séquence suivante"
|
|
Alors la séquence suivante démarre
|
|
Et un événement "VOICE_COMMAND_EXECUTED" est enregistré avec commande: "next"
|
|
Et la métrique "audio_guide.voice_commands.used" est incrémentée
|
|
|
|
Scénario: Adaptation du volume en fonction de la vitesse du véhicule
|
|
Étant donné un utilisateur "jack@roadwave.fr" en mode voiture
|
|
Et il écoute l'audio-guide avec volume configuré à 70%
|
|
Quand il roule à 50 km/h
|
|
Alors le volume reste à 70% (bruit ambiant faible)
|
|
Quand il accélère à 130 km/h sur autoroute
|
|
Alors le volume augmente automatiquement à 85% (compensation du bruit)
|
|
Et un événement "VOLUME_AUTO_ADJUSTED" est enregistré avec vitesse: 130, volume: 85
|
|
Et la métrique "audio_guide.volume.auto_adjusted" est incrémentée
|
|
|
|
Scénario: Désactivation temporaire en cas de vitesse excessive
|
|
Étant donné un utilisateur "kate@roadwave.fr" en mode voiture
|
|
Et elle écoute l'audio-guide sur autoroute
|
|
Quand elle dépasse les 110 km/h
|
|
Alors l'audio continue de jouer normalement
|
|
Mais aucune nouvelle séquence ne se déclenche automatiquement
|
|
Et un message vocal indique: "Déclenchements automatiques suspendus à haute vitesse"
|
|
Quand elle ralentit en dessous de 90 km/h
|
|
Alors les déclenchements automatiques sont réactivés
|
|
Et un événement "AUTO_TRIGGER_SPEED_LIMITED" est enregistré
|
|
Et la métrique "audio_guide.speed.limited" est incrémentée
|
|
|
|
Scénario: Mode nuit avec interface sombre automatique
|
|
Étant donné un utilisateur "luke@roadwave.fr" en mode voiture
|
|
Et il est 22h30 (nuit)
|
|
Quand il utilise l'audio-guide
|
|
Alors l'interface passe automatiquement en mode nuit:
|
|
| Élément | Mode nuit |
|
|
| Fond d'écran | Noir |
|
|
| Texte | Blanc/Gris clair |
|
|
| Carte | Thème sombre |
|
|
| Luminosité | Réduite de 40% |
|
|
Et les notifications visuelles sont encore plus discrètes
|
|
Et un événement "NIGHT_MODE_AUTO_ENABLED" est enregistré
|
|
Et la métrique "audio_guide.night_mode.enabled" est incrémentée
|
|
|
|
Scénario: Connexion automatique via Android Auto
|
|
Étant donné un utilisateur "mary@roadwave.fr" avec téléphone Android
|
|
Et son téléphone est connecté via Android Auto
|
|
Quand elle lance l'audio-guide "Route des Châteaux de la Loire"
|
|
Alors l'interface Android Auto s'affiche sur l'écran du véhicule
|
|
Et les fonctionnalités sont identiques à CarPlay:
|
|
| Fonctionnalité | Disponible |
|
|
| Carte simplifiée | Oui |
|
|
| Contrôles audio | Oui |
|
|
| Commandes vocales | Oui (Google Assistant) |
|
|
| Notifications | Oui |
|
|
Et un événement "ANDROID_AUTO_SESSION_STARTED" est enregistré
|
|
Et la métrique "audio_guide.android_auto.used" est incrémentée
|
|
|
|
Scénario: Gestion de la perte de signal GPS temporaire
|
|
Étant donné un utilisateur "nathan@roadwave.fr" en mode voiture
|
|
Et il écoute l'audio-guide dans un tunnel
|
|
Quand le signal GPS est perdu pendant 2 minutes
|
|
Alors l'audio en cours continue de jouer normalement
|
|
Et la position estimée est calculée selon la vitesse et direction précédentes
|
|
Et un message discret s'affiche: "Signal GPS perdu - Position estimée"
|
|
Quand le signal GPS est retrouvé
|
|
Alors la position est recalculée immédiatement
|
|
Et les déclenchements automatiques sont réactivés
|
|
Et un événement "GPS_SIGNAL_RESTORED" est enregistré
|
|
Et la métrique "audio_guide.gps.signal_lost" est incrémentée
|
|
|
|
Scénario: Statistiques de fin de parcours en mode voiture
|
|
Étant donné un utilisateur "olive@roadwave.fr" en mode voiture
|
|
Et elle vient de terminer l'audio-guide "Route des Châteaux de la Loire"
|
|
Quand elle arrive à destination
|
|
Alors un écran de statistiques s'affiche:
|
|
| Métrique | Valeur |
|
|
| Séquences écoutées | 9/10 |
|
|
| Séquences manquées | 1 (trop rapide) |
|
|
| Distance parcourue | 142 km |
|
|
| Temps total | 2h 15min |
|
|
| Temps d'écoute | 1h 05min |
|
|
| Vitesse moyenne | 63 km/h |
|
|
| Badge débloqué | Voyageur des châteaux |
|
|
Et un bouton "Partager mon voyage" est disponible
|
|
Et un événement "AUDIO_GUIDE_COMPLETED_CAR" est enregistré
|
|
Et la métrique "audio_guide.completed.car_mode" est incrémentée
|
|
|
|
Scénario: Métriques de performance du mode voiture
|
|
Étant donné que 50 000 utilisateurs ont utilisé l'audio-guide en mode voiture
|
|
Quand les métriques d'usage sont collectées
|
|
Alors les indicateurs suivants sont disponibles:
|
|
| Métrique | Valeur cible |
|
|
| Taux de déclenchement automatique | > 90% |
|
|
| Taux de séquences manquées | < 15% |
|
|
| Temps moyen entre déclenchements | 8 minutes |
|
|
| Précision du calcul ETA | ±3 minutes |
|
|
| Utilisation de CarPlay/Android Auto | 65% |
|
|
| Utilisation de commandes vocales | 45% |
|
|
Et les métriques sont exportées vers le système de monitoring
|