feat(bdd): réorganiser features en catégories api/ui/e2e et créer ADR-024
Résolution des incohérences #10, #11, et #12 de l'analyse d'architecture. ## Phase 1 : Réorganisation Features BDD (Point #10 - RÉSOLU) - Créer structure features/{api,ui,e2e} - Déplacer 83 features en 3 catégories via git mv (historique préservé) - features/api/ : 53 features (tests API backend) - features/ui/ : 22 features (tests UI mobile) - features/e2e/ : 8 features (tests end-to-end) Domaines déplacés : - API : authentication, recommendation, rgpd-compliance, content-creation, moderation, monetisation, premium, radio-live, publicites - UI : audio-guides, navigation, interest-gauges, mode-offline, partage, profil, recherche - E2E : abonnements, error-handling ## Phase 2 : Mise à jour Documentation ### ADR-007 - Tests BDD - Ajouter section "Convention de Catégorisation des Features" - Documenter règles api/ui/e2e avec exemples concrets - Spécifier step definitions (backend Go, mobile Dart) ### ADR-024 - Stratégie CI/CD Monorepo (NOUVEAU) - Créer ADR dédié pour stratégie CI/CD avec path filters - Architecture workflows séparés (backend.yml, mobile.yml, shared.yml) - Configuration path filters détaillée avec exemples YAML - Matrice de déclenchement et optimisations (~70% gain temps CI) - Plan d'implémentation (~2h, reporté jusqu'au développement) ### ADR-016 - Organisation Monorepo - Simplifier en retirant section CI/CD détaillée - Ajouter référence vers ADR-024 pour stratégie CI/CD ### INCONSISTENCIES-ANALYSIS.md - Point #10 (Tests BDD synchronisés) : ✅ RÉSOLU - Catégorisation features implémentée - ADR-007 mis à jour avec convention complète - Point #11 (70/30 Split paiements) : ✅ ANNULÉ (faux problème) - ADR-009 et Règle 18 parfaitement cohérents - Documentation exhaustive existante (formule, SQL, comparaisons) - Point #12 (Monorepo path filters) : ⏸️ DOCUMENTÉ - Architecture CI/CD complète dans ADR-024 - Implémentation reportée (projet en phase documentation) - Métriques mises à jour : - MODERATE : 6/9 traités (4 résolus + 1 annulé + 1 documenté) - ADR à jour : 100% (19/19 avec ADR-024) ## Phase 3 : Validation - Structure features validée (api/ui/e2e, aucun répertoire restant) - Historique Git préservé (git mv, renommages détectés) - 83 features total (API: 53, UI: 22, E2E: 8) Closes: Point #10 (résolu), Point #11 (annulé), Point #12 (documenté) Co-Authored-By: Claude Sonnet 4.5 <noreply@anthropic.com>
This commit is contained in:
221
features/api/content-creation/modification-suppression.feature
Normal file
221
features/api/content-creation/modification-suppression.feature
Normal file
@@ -0,0 +1,221 @@
|
||||
# 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 + CDN sous 5 minutes
|
||||
Quand je supprime un contenu
|
||||
Alors l'entrée en base de données est marquée "deleted"
|
||||
Et les fichiers CDN 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 CDN 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 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
|
||||
Reference in New Issue
Block a user