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.
334 lines
14 KiB
Gherkin
334 lines
14 KiB
Gherkin
# language: fr
|
||
|
||
Fonctionnalité: Création d'audio-guide multi-séquences
|
||
En tant que créateur de contenu
|
||
Je veux créer des audio-guides avec plusieurs séquences géolocalisées
|
||
Afin d'offrir des expériences guidées adaptées aux différents modes de déplacement
|
||
|
||
Contexte:
|
||
Étant donné que l'application RoadWave est démarrée
|
||
Et que le créateur "guide@example.com" est connecté
|
||
Et que son compte est vérifié
|
||
|
||
# 16.1 - Types d'audio-guides et modes de déplacement
|
||
|
||
Plan du Scénario: Détection automatique du mode selon la vitesse
|
||
Étant donné que l'utilisateur se déplace à <vitesse> km/h
|
||
Quand la vitesse est calculée sur 30 secondes
|
||
Alors le mode <mode> est suggéré automatiquement
|
||
|
||
Exemples:
|
||
| vitesse | mode |
|
||
| 3 | Piéton |
|
||
| 15 | Vélo |
|
||
| 35 | Voiture |
|
||
| 50 | Voiture |
|
||
|
||
Scénario: Suggestion de mode au démarrage avec confirmation
|
||
Étant donné qu'un audio-guide "Safari du Paugre" est disponible
|
||
Et que l'utilisateur se déplace à 35 km/h
|
||
Quand l'audio-guide démarre
|
||
Alors une popup s'affiche:
|
||
"""
|
||
Détection : 🚗 Voiture. Est-ce correct ?
|
||
[Oui] [Changer]
|
||
"""
|
||
|
||
Scénario: Changement manuel du mode détecté
|
||
Étant donné que le mode "Voiture" est suggéré automatiquement
|
||
Quand l'utilisateur clique sur "Changer"
|
||
Alors les 4 modes sont proposés:
|
||
| mode | emoji |
|
||
| Piéton | 🚶 |
|
||
| Voiture | 🚗 |
|
||
| Vélo | 🚴 |
|
||
| Transport | 🚌 |
|
||
|
||
Plan du Scénario: Caractéristiques par mode de déplacement
|
||
Étant donné un audio-guide configuré en mode <mode>
|
||
Alors les paramètres suivants sont appliqués:
|
||
| paramètre | valeur |
|
||
| Vitesse détection | <vitesse_detection> |
|
||
| Déclenchement | <declenchement> |
|
||
|
||
Exemples:
|
||
| mode | vitesse_detection | declenchement |
|
||
| Piéton | <5 km/h | Manuel (bouton Suivant) |
|
||
| Voiture | >10 km/h | Auto GPS + Manuel |
|
||
| Vélo | 5-25 km/h | Auto GPS + Manuel |
|
||
| Transport | Variable | Auto GPS + Manuel |
|
||
|
||
# 16.1.2 - Création d'un audio-guide (côté créateur)
|
||
|
||
Scénario: Accès au formulaire de création d'audio-guide
|
||
Étant donné que le créateur est sur son dashboard
|
||
Quand il clique sur "Créer un audio-guide"
|
||
Alors le formulaire de création s'affiche
|
||
Et le wizard guidé en 4 étapes est visible:
|
||
| étape | description |
|
||
| 1 | Infos générales |
|
||
| 2 | Ajout séquences |
|
||
| 3 | Preview carte |
|
||
| 4 | Validation modération |
|
||
|
||
Scénario: Étape 1 - Informations générales obligatoires
|
||
Étant donné que le créateur est sur l'étape 1 du wizard
|
||
Quand il complète le formulaire
|
||
Alors les champs suivants sont obligatoires:
|
||
| champ | contrainte |
|
||
| Titre | 5-100 caractères |
|
||
| Description | 10-500 caractères |
|
||
| Mode de déplacement | Choix parmi 4 |
|
||
| Tags | 1-3 tags |
|
||
| Classification âge | Tout public/13+/16+/18+ |
|
||
|
||
Scénario: Sélection du mode de déplacement
|
||
Étant donné que le créateur crée un audio-guide
|
||
Quand il sélectionne le mode "🚗 Voiture (GPS auto + manuel)"
|
||
Alors le champ "Vitesse recommandée" s'affiche
|
||
Et la plage suggérée est "30-50 km/h"
|
||
|
||
Scénario: Validation du titre
|
||
Étant donné que le créateur entre un titre
|
||
Quand le titre contient moins de 5 caractères
|
||
Alors un message d'erreur "Minimum 5 caractères" s'affiche
|
||
Et le bouton "Suivant" est désactivé
|
||
|
||
Scénario: Validation de la description
|
||
Étant donné que le créateur entre une description
|
||
Quand la description contient 520 caractères
|
||
Alors un message d'erreur "Maximum 500 caractères" s'affiche
|
||
Et les 20 caractères en trop sont surlignés en rouge
|
||
|
||
Scénario: Étape 2 - Ajout de la première séquence
|
||
Étant donné que le créateur est sur l'étape 2 "Ajout séquences"
|
||
Quand il clique sur "Ajouter séquence"
|
||
Alors le formulaire de séquence s'affiche avec:
|
||
| champ | requis | note |
|
||
| Titre séquence | ✅ | 5-80 caractères |
|
||
| Audio | ✅ | Upload MP3/AAC, max 200 MB |
|
||
| Point GPS | ✅* | *Sauf mode piéton |
|
||
| Rayon déclenchement | ✅* | *Sauf mode piéton, 10-200m |
|
||
|
||
Scénario: Ajout du point GPS pour une séquence
|
||
Étant donné que le créateur ajoute une séquence en mode "Voiture"
|
||
Quand il clique sur "📍 Ajouter point GPS"
|
||
Alors une carte s'affiche
|
||
Et il peut:
|
||
| action |
|
||
| Cliquer sur la carte |
|
||
| Entrer coordonnées manuelles |
|
||
| Utiliser sa position actuelle |
|
||
|
||
Scénario: Configuration du rayon de déclenchement avec preview
|
||
Étant donné qu'un point GPS est défini à (43.1234, 2.5678)
|
||
Quand le créateur ajuste le curseur de rayon
|
||
Alors le rayon varie de 10m à 200m
|
||
Et un cercle visuel est affiché sur la carte
|
||
Et la valeur actuelle s'affiche "30m"
|
||
|
||
Plan du Scénario: Rayon par défaut selon le mode
|
||
Étant donné un audio-guide en mode <mode>
|
||
Quand le créateur ajoute un point GPS
|
||
Alors le rayon par défaut est <rayon_defaut>
|
||
|
||
Exemples:
|
||
| mode | rayon_defaut |
|
||
| Voiture | 30m |
|
||
| Vélo | 50m |
|
||
| Transport | 100m |
|
||
|
||
Scénario: Suggestion intelligente du rayon
|
||
Étant donné un audio-guide en mode "Voiture" avec vitesse recommandée 30 km/h
|
||
Quand le créateur ajoute un point GPS
|
||
Alors une suggestion s'affiche: "Recommandé : 30m pour voiture à 30 km/h"
|
||
|
||
Scénario: Upload audio pour une séquence
|
||
Étant donné que le créateur crée une séquence "Introduction"
|
||
Quand il upload un fichier audio de 5 MB
|
||
Alors le fichier est vérifié:
|
||
| vérification | règle |
|
||
| Format | MP3, AAC, M4A |
|
||
| Taille max | 200 MB |
|
||
| Durée max | 15 minutes |
|
||
|
||
Scénario: Ordre des séquences modifiable
|
||
Étant donné un audio-guide avec 5 séquences:
|
||
| ordre | titre |
|
||
| 1 | Introduction |
|
||
| 2 | Les lions |
|
||
| 3 | Les girafes |
|
||
| 4 | Les éléphants |
|
||
| 5 | Conclusion |
|
||
Quand le créateur glisse "Les éléphants" en position 2
|
||
Alors l'ordre devient:
|
||
| ordre | titre |
|
||
| 1 | Introduction |
|
||
| 2 | Les éléphants |
|
||
| 3 | Les lions |
|
||
| 4 | Les girafes |
|
||
| 5 | Conclusion |
|
||
|
||
Scénario: Nombre minimum de séquences requis
|
||
Étant donné un audio-guide avec seulement 1 séquence
|
||
Quand le créateur tente de passer à l'étape suivante
|
||
Alors un message d'erreur s'affiche: "Minimum 2 séquences requis"
|
||
Et le bouton "Suivant" est désactivé
|
||
|
||
Scénario: Nombre maximum de séquences
|
||
Étant donné un audio-guide avec 50 séquences
|
||
Quand le créateur tente d'ajouter une 51ème séquence
|
||
Alors un message d'erreur s'affiche: "Maximum 50 séquences par audio-guide"
|
||
Et le bouton "+ Ajouter séquence" est désactivé
|
||
|
||
Scénario: Étape 3 - Preview carte avec tracé et points
|
||
Étant donné un audio-guide avec 5 séquences géolocalisées
|
||
Quand le créateur accède à l'étape 3 "Preview carte"
|
||
Alors une carte Leaflet s'affiche
|
||
Et les éléments suivants sont visibles:
|
||
| élément | description |
|
||
| Markers numérotés | 1, 2, 3, 4, 5 sur chaque point |
|
||
| Tracé entre points | Ligne pointillée connectant les points |
|
||
| Cercles de déclenchement | Rayon visuel autour de chaque point |
|
||
|
||
Scénario: Statistiques du parcours
|
||
Étant donné un audio-guide avec les séquences suivantes:
|
||
| séquence | durée | distance_au_suivant |
|
||
| 1 | 2:15 | 150m |
|
||
| 2 | 3:42 | 200m |
|
||
| 3 | 4:10 | 320m |
|
||
Quand les statistiques sont calculées
|
||
Alors le résumé suivant est affiché:
|
||
| métrique | valeur |
|
||
| Séquences | 3 complètes |
|
||
| Durée totale | 10:07 |
|
||
| Distance totale | 670m |
|
||
|
||
Scénario: Modification d'une séquence depuis la carte
|
||
Étant donné que la preview carte est affichée
|
||
Quand le créateur clique sur le marker "2"
|
||
Alors une popup s'affiche avec:
|
||
| information |
|
||
| Titre: "Les lions" |
|
||
| Durée: 3:42 |
|
||
| Rayon: 30m |
|
||
| [✏️ Modifier] |
|
||
| [🗑️ Supprimer] |
|
||
|
||
Scénario: Zone de diffusion géographique
|
||
Étant donné un audio-guide avec des points dans Paris
|
||
Quand le créateur définit la zone de diffusion
|
||
Alors il peut choisir:
|
||
| type | exemple |
|
||
| Polygon | Tracé manuel sur carte |
|
||
| Ville | Paris (API Nominatim) |
|
||
| Département | 75 - Paris |
|
||
| Région | Île-de-France |
|
||
|
||
Scénario: Étape 4 - Publication et validation modération
|
||
Étant donné un créateur qui publie ses 3 premiers audio-guides
|
||
Quand il clique sur "✅ Publier audio-guide"
|
||
Alors un message s'affiche:
|
||
"""
|
||
Votre audio-guide est en cours de validation.
|
||
Notre équipe le vérifiera sous 24-48h.
|
||
Vous recevrez une notification dès validation.
|
||
"""
|
||
|
||
Scénario: Publication directe pour créateurs expérimentés
|
||
Étant donné un créateur ayant publié 5 audio-guides validés
|
||
Et aucun strike actif
|
||
Quand il publie un nouvel audio-guide
|
||
Alors l'audio-guide est publié immédiatement
|
||
Et il devient visible pour les utilisateurs
|
||
Et aucune validation manuelle n'est requise
|
||
|
||
Scénario: Mode piéton sans points GPS obligatoires
|
||
Étant donné un audio-guide en mode "🚶 Piéton"
|
||
Quand le créateur ajoute une séquence
|
||
Alors le champ "Point GPS" est optionnel
|
||
Et le champ "Rayon déclenchement" est masqué
|
||
Et un message info s'affiche: "Mode manuel : les séquences se déclenchent au clic utilisateur"
|
||
|
||
Scénario: Sauvegarde brouillon automatique
|
||
Étant donné que le créateur édite un audio-guide depuis 5 minutes
|
||
Quand il ajoute une nouvelle séquence
|
||
Alors l'audio-guide est sauvegardé en brouillon automatiquement
|
||
Et un toast "Brouillon sauvegardé" s'affiche brièvement
|
||
|
||
Scénario: Reprise d'un brouillon
|
||
Étant donné un audio-guide en brouillon "Safari du Paugre"
|
||
Et qu'il contient 3 séquences complètes
|
||
Quand le créateur retourne sur son dashboard
|
||
Alors le brouillon est visible avec le statut "📝 Brouillon"
|
||
Et un bouton "Continuer" est disponible
|
||
Et la progression "3/5 séquences" est affichée
|
||
|
||
Scénario: Suppression d'un brouillon
|
||
Étant donné un audio-guide en brouillon
|
||
Quand le créateur clique sur "🗑️ Supprimer"
|
||
Alors une confirmation s'affiche:
|
||
"""
|
||
Supprimer ce brouillon ?
|
||
Toutes les séquences seront perdues.
|
||
[Annuler] [Supprimer définitivement]
|
||
"""
|
||
|
||
Scénario: Modification d'un audio-guide publié
|
||
Étant donné un audio-guide publié "Safari du Paugre"
|
||
Quand le créateur clique sur "✏️ Modifier"
|
||
Alors il peut modifier:
|
||
| élément modifiable | élément non modifiable |
|
||
| Titre | Mode de déplacement |
|
||
| Description | Points GPS |
|
||
| Tags | Rayons déclenchement |
|
||
| Séquences (ordre) | |
|
||
Et un avertissement s'affiche: "Les modifications structurelles nécessitent une nouvelle publication"
|
||
|
||
Scénario: Duplication d'un audio-guide existant
|
||
Étant donné un audio-guide publié "Visite Paris"
|
||
Quand le créateur clique sur "📋 Dupliquer"
|
||
Alors une copie est créée avec le titre "Visite Paris (copie)"
|
||
Et toutes les séquences sont copiées
|
||
Et le statut est "📝 Brouillon"
|
||
Et le créateur peut modifier avant publication
|
||
|
||
# Cas d'erreur
|
||
|
||
Scénario: Upload audio échoue (format non supporté)
|
||
Étant donné que le créateur upload un fichier "audio.wav"
|
||
Quand le format est vérifié
|
||
Alors un message d'erreur s'affiche: "Format non supporté. Utilisez MP3, AAC ou M4A"
|
||
Et le fichier est rejeté
|
||
|
||
Scénario: Upload audio échoue (taille trop grande)
|
||
Étant donné que le créateur upload un fichier de 250 MB
|
||
Quand la taille est vérifiée
|
||
Alors un message d'erreur s'affiche: "Fichier trop volumineux. Maximum 200 MB"
|
||
Et le fichier est rejeté
|
||
|
||
Scénario: Points GPS trop éloignés (alerte cohérence)
|
||
Étant donné un audio-guide en mode "Piéton"
|
||
Et une séquence au Louvre (Paris)
|
||
Quand le créateur ajoute une séquence à Lyon
|
||
Alors un avertissement s'affiche:
|
||
"""
|
||
⚠️ Attention : distance importante entre points (465 km)
|
||
Vérifiez que le mode "Piéton" est approprié.
|
||
[Modifier le mode] [Continuer]
|
||
"""
|
||
|
||
Scénario: Pas de connexion lors de la sauvegarde
|
||
Étant donné que le créateur édite un audio-guide
|
||
Et que la connexion réseau est perdue
|
||
Quand il tente de sauvegarder
|
||
Alors le brouillon est sauvegardé localement
|
||
Et un message s'affiche: "Sauvegarde locale. Sera synchronisée à la reconnexion"
|
||
Et une icône "☁️ Hors ligne" s'affiche
|
||
|
||
Scénario: Reprise après perte de connexion
|
||
Étant donné un brouillon sauvegardé localement
|
||
Quand la connexion réseau est rétablie
|
||
Alors le brouillon est synchronisé automatiquement
|
||
Et un toast "✅ Audio-guide synchronisé" s'affiche
|