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.
236 lines
10 KiB
Gherkin
236 lines
10 KiB
Gherkin
# language: fr
|
||
Fonctionnalité: Modification et suppression de contenu
|
||
En tant que créateur
|
||
Je veux pouvoir modifier ou supprimer mes contenus
|
||
Afin de garder le contrôle sur mes publications
|
||
|
||
Contexte:
|
||
Étant donné que l'API RoadWave est disponible
|
||
Et que je suis un créateur connecté
|
||
Et que j'ai publié un contenu
|
||
|
||
Scénario: Modifier le titre d'un contenu
|
||
Étant donné que mon contenu a le titre "Histoire de Paris"
|
||
Quand je modifie le titre en "Histoire fascinante de Paris"
|
||
Alors la modification est enregistrée immédiatement
|
||
Et je vois le message "Titre modifié avec succès"
|
||
|
||
Scénario: Correction de coquilles dans le titre
|
||
Étant donné que mon titre contient une faute "Histoore de Paris"
|
||
Quand je corrige en "Histoire de Paris"
|
||
Alors la modification est acceptée
|
||
Et le titre corrigé est affiché
|
||
|
||
Scénario: Ajouter une description ultérieurement
|
||
Étant donné que j'ai publié sans description
|
||
Quand j'ajoute une description "Découvrez l'histoire de la capitale"
|
||
Alors la description est enregistrée
|
||
Et elle est visible sur la page du contenu
|
||
|
||
Scénario: Modifier la description existante
|
||
Étant donné que mon contenu a déjà une description
|
||
Quand je modifie la description
|
||
Alors la nouvelle description remplace l'ancienne
|
||
Et la modification est immédiate
|
||
|
||
Scénario: Modifier les tags pour ajuster pertinence
|
||
Étant donné que mon contenu est tagué "Sport", "Musique"
|
||
Quand je change les tags en "Sport", "Santé"
|
||
Alors les nouveaux tags sont appliqués
|
||
Et l'algorithme utilise les nouveaux tags pour recommandations
|
||
|
||
Scénario: Personnaliser l'image de couverture
|
||
Étant donné que mon contenu a une image auto-générée
|
||
Quand j'uploade une image personnalisée 800×800px
|
||
Alors l'image personnalisée remplace l'image par défaut
|
||
Et elle est visible sur le contenu
|
||
|
||
Scénario: Impossible de modifier l'audio
|
||
Étant donné que mon contenu audio est publié
|
||
Quand j'essaie de remplacer le fichier audio
|
||
Alors la modification est refusée
|
||
Et je vois le message "L'audio ne peut pas être modifié après publication"
|
||
|
||
Scénario: Raison - Éviter fraude audio
|
||
Étant donné que je veux changer l'audio après validation
|
||
Quand j'essaie de modifier
|
||
Alors le système refuse pour éviter:
|
||
| risque |
|
||
| Uploader contenu validé puis remplacer spam |
|
||
| Fraude sur l'intégrité du contenu |
|
||
|
||
Scénario: Impossible de modifier la zone de diffusion
|
||
Étant donné que mon contenu est diffusé à Paris
|
||
Quand j'essaie de changer la zone en "National"
|
||
Alors la modification est refusée
|
||
Et je vois le message "La zone de diffusion ne peut pas être modifiée"
|
||
|
||
Scénario: Raison - Éviter manipulation algorithme
|
||
Étant donné que je veux changer ma zone
|
||
Quand j'essaie de modifier
|
||
Alors le système refuse pour éviter:
|
||
| manipulation |
|
||
| Créer "Local Paris" puis changer en "National" |
|
||
| Boost artificiel de visibilité |
|
||
|
||
Scénario: Impossible de modifier le type géo
|
||
Étant donné que mon contenu est type "Neutre" (pondération 0.2)
|
||
Quand j'essaie de changer en "Ancré" (pondération 0.7)
|
||
Alors la modification est refusée
|
||
Et je vois le message "Le type géographique ne peut pas être modifié"
|
||
|
||
Scénario: Raison - Éviter abus de pondération
|
||
Étant donné que je veux changer le type géo
|
||
Quand j'essaie de modifier
|
||
Alors le système refuse pour éviter:
|
||
| abus |
|
||
| Créer "Neutre" puis passer en "Ancré" |
|
||
| Manipulation de la pondération algorithme |
|
||
|
||
Scénario: Impossible de modifier la classification âge
|
||
Étant donné que mon contenu est classé "Tout public"
|
||
Quand j'essaie de changer en "18+"
|
||
Alors la modification est refusée
|
||
Et je vois le message "La classification d'âge ne peut pas être modifiée"
|
||
|
||
Scénario: Raison - Sécurité mineurs
|
||
Étant donné que je veux changer la classification
|
||
Quand j'essaie de modifier
|
||
Alors le système refuse pour garantir:
|
||
| protection |
|
||
| Classification vérifiée en modération |
|
||
| Pas de contournement validation |
|
||
| Sécurité des mineurs |
|
||
|
||
Scénario: Solution si besoin de changer audio/zone/classification
|
||
Étant donné que je veux absolument changer l'audio
|
||
Quand je consulte les options
|
||
Alors je vois "Supprimer et republier le contenu"
|
||
Et c'est la seule solution disponible
|
||
|
||
Scénario: Republication après suppression - créateur <3 validations
|
||
Étant donné que je suis un nouveau créateur (2 contenus validés)
|
||
Et que je supprime puis republie un contenu
|
||
Quand je republie avec les modifications
|
||
Alors le contenu repasse en file de validation
|
||
Et une nouvelle validation est effectuée
|
||
|
||
Scénario: Republication après suppression - créateur vérifié
|
||
Étant donné que je suis créateur vérifié (≥3 contenus validés)
|
||
Et que je supprime puis republie un contenu
|
||
Quand je republie avec les modifications
|
||
Alors le contenu est publié immédiatement
|
||
Et aucune validation préalable n'est requise
|
||
|
||
Scénario: Suppression de contenu immédiate
|
||
Quand je clique sur "Supprimer le contenu"
|
||
Et que je confirme la suppression
|
||
Alors le contenu est supprimé immédiatement
|
||
Et disparaît de la liste publique
|
||
|
||
Scénario: Confirmation avant suppression
|
||
Quand je clique sur "Supprimer"
|
||
Alors je vois un message de confirmation:
|
||
| titre | Êtes-vous sûr ? |
|
||
| message | Cette action est définitive |
|
||
| warning | Le contenu sera supprimé définitivement |
|
||
| actions | Confirmer / Annuler |
|
||
|
||
Scénario: Suppression définitive et non réversible
|
||
Étant donné que j'ai supprimé un contenu
|
||
Quand j'essaie de le récupérer
|
||
Alors la récupération est impossible
|
||
Et le contenu est définitivement perdu
|
||
|
||
Scénario: Suppression BDD + Cache sous 5 minutes
|
||
Quand je supprime un contenu
|
||
Alors l'entrée en base de données est marquée "deleted"
|
||
Et les fichiers sont marqués pour suppression
|
||
Et la suppression effective a lieu sous 5 minutes
|
||
|
||
Scénario: Historique auditeurs conservé anonymisé
|
||
Étant donné que 1000 personnes ont écouté mon contenu
|
||
Quand je supprime le contenu
|
||
Alors leur historique est conservé
|
||
Mais marqué "Contenu supprimé par créateur"
|
||
Et la durée d'écoute est conservée pour leurs stats
|
||
|
||
Scénario: Analytics plateforme anonymisées conservées
|
||
Étant donné que mon contenu a généré 10K écoutes
|
||
Quand je supprime le contenu
|
||
Alors les métriques globales sont conservées anonymement:
|
||
| métrique | conservée |
|
||
| Total écoutes | ✅ (anonyme) |
|
||
| Durée totale | ✅ (anonyme) |
|
||
| Catégorie | ✅ (anonyme) |
|
||
| Auteur | ❌ (anonymisé) |
|
||
Et c'est conforme RGPD
|
||
|
||
Scénario: Fichiers Cache + Storage supprimés sous 24h
|
||
Étant donné que mon contenu est supprimé
|
||
Quand 24 heures s'écoulent
|
||
Alors tous les fichiers audio sont purgés du NGINX Cache
|
||
Et tous les fichiers sont supprimés de OVH Object Storage
|
||
Et l'espace de stockage est libéré
|
||
|
||
Scénario: Pas de notification aux auditeurs
|
||
Étant donné que 500 utilisateurs ont écouté mon contenu
|
||
Quand je supprime le contenu
|
||
Alors aucune notification n'est envoyée aux auditeurs
|
||
Et il n'y a pas d'effet Streisand
|
||
|
||
Scénario: Auditeur tente de réécouter contenu supprimé
|
||
Étant donné qu'un auditeur a écouté mon contenu
|
||
Et que j'ai supprimé ce contenu
|
||
Quand l'auditeur tente de le réécouter depuis son historique
|
||
Alors il voit le message "Ce contenu n'est plus disponible"
|
||
Et la lecture est impossible
|
||
|
||
Scénario: Historique auditeur conserve trace
|
||
Étant donné qu'un auditeur a écouté mon contenu le 15 janvier
|
||
Et que je supprime le contenu le 20 janvier
|
||
Quand l'auditeur consulte son historique
|
||
Alors il voit "Vous avez écouté ce contenu le 15 janvier 2026"
|
||
Et le titre est remplacé par "Contenu supprimé"
|
||
Et la date d'écoute est conservée
|
||
|
||
Scénario: Statistiques créateur après suppression
|
||
Étant donné que j'ai publié 10 contenus
|
||
Et que je supprime 2 contenus
|
||
Quand je consulte mes statistiques globales
|
||
Alors je vois:
|
||
| métrique | valeur |
|
||
| Contenus publiés | 8 (actifs) |
|
||
| Total historique | 10 |
|
||
| Suppressions | 2 |
|
||
Et l'historique des suppressions est visible
|
||
|
||
Scénario: Limite de modifications par contenu
|
||
Étant donné que j'ai modifié un titre 10 fois
|
||
Quand j'essaie de modifier une 11ème fois
|
||
Alors la modification est acceptée
|
||
Car il n'y a pas de limite de modifications pour champs autorisés
|
||
|
||
Scénario: Historique des modifications visible
|
||
Étant donné que j'ai modifié un contenu plusieurs fois
|
||
Quand je consulte l'historique
|
||
Alors je vois:
|
||
| date | modification |
|
||
| 21/01/2026 | Titre changé |
|
||
| 20/01/2026 | Tags modifiés |
|
||
| 19/01/2026 | Description ajoutée |
|
||
Et je peux tracer toutes les modifications
|
||
|
||
Scénario: Suppression d'un contenu en cours d'encodage
|
||
Étant donné que mon contenu est en cours d'encodage (50%)
|
||
Quand je supprime le contenu
|
||
Alors l'encodage est annulé immédiatement
|
||
Et le fichier temporaire est supprimé
|
||
Et je vois le message "Contenu et encodage supprimés"
|
||
|
||
Scénario: Impossible de modifier un contenu en cours de validation
|
||
Étant donné que mon contenu est en file de validation
|
||
Quand j'essaie de modifier le titre
|
||
Alors la modification est refusée
|
||
Et je vois le message "Impossible de modifier pendant la validation"
|