refactor(docs): réorganiser la documentation selon principes DDD

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.
This commit is contained in:
jpgiannetti
2026-02-07 17:15:02 +01:00
parent 78422bb2c0
commit 5e5fcf4714
227 changed files with 1413 additions and 1967 deletions

View File

@@ -0,0 +1,286 @@
# language: fr
Fonctionnalité: Contenus Premium exclusifs
En tant que créateur monétisé
Je veux pouvoir rendre certains contenus exclusifs aux abonnés Premium
Afin d'inciter les utilisateurs à s'abonner
Contexte:
Étant donné que je suis un créateur avec la monétisation activée
Scénario: Toggle "Réservé Premium" lors de la création
Étant donné que je crée un nouveau contenu
Quand j'accède aux options de publication
Alors je vois un toggle "Réservé aux abonnés Premium 👑"
Et je peux l'activer ou le désactiver
Scénario: Contenu marqué Premium lors de la création
Étant donné que je crée un nouveau contenu
Quand j'active le toggle "Réservé Premium"
Et que je publie le contenu
Alors le champ `is_premium` en base est mis à `true`
Et le contenu est visible uniquement pour les utilisateurs Premium
Scénario: Contenu gratuit par défaut
Étant donné que je crée un nouveau contenu
Quand je ne touche pas au toggle "Réservé Premium"
Et que je publie le contenu
Alors le champ `is_premium` en base est mis à `false` (défaut)
Et le contenu est accessible à tous les utilisateurs
Scénario: Modification d'un contenu existant en Premium
Étant donné que j'ai publié un contenu gratuit il y a 2 jours
Quand je modifie le contenu et active le toggle "Réservé Premium"
Et que j'enregistre les modifications
Alors le contenu devient immédiatement Premium
Et les utilisateurs gratuits ne peuvent plus y accéder
Scénario: Passage d'un contenu Premium en gratuit
Étant donné que j'ai publié un contenu Premium il y a 1 mois
Quand je modifie le contenu et désactive le toggle "Réservé Premium"
Et que j'enregistre les modifications
Alors le contenu devient immédiatement gratuit
Et tous les utilisateurs peuvent maintenant y accéder
Scénario: Aucune limite sur pourcentage de contenus Premium
Étant donné que je publie 10 nouveaux contenus
Quand je décide de rendre les 10 contenus Premium (100%)
Alors le système accepte sans limitation
Et je peux avoir 100% de mon catalogue en Premium
Scénario: Stratégie freemium - Mix gratuit/premium
Étant donné que je publie 10 nouveaux contenus
Quand je décide de rendre 5 contenus Premium et 5 gratuits (50/50)
Alors le système accepte cette stratégie
Et je peux tester différents mix pour optimiser mes revenus
Scénario: Stratégie tout gratuit possible
Étant donné que je suis monétisé via publicités
Quand je décide de ne mettre aucun contenu en Premium (0%)
Alors le système accepte cette stratégie
Et je génère des revenus uniquement via les publicités
Scénario: Badge 👑 visible sur l'interface utilisateur
Étant donné qu'un utilisateur consulte ma liste de contenus
Quand il voit un contenu Premium
Alors un badge 👑 "Premium" est affiché
Et le contenu est clairement identifiable comme réservé
Scénario: Utilisateur gratuit voit les contenus Premium dans la liste
Étant donné que je suis un utilisateur gratuit
Quand je consulte les contenus d'un créateur
Alors je vois aussi les contenus Premium dans la liste
Et ils sont affichés avec un badge 👑
Mais je ne peux pas les lire
Scénario: Tentative de lecture Premium par utilisateur gratuit - Overlay bloquant
Étant donné que je suis un utilisateur gratuit
Quand je clique sur un contenu Premium pour le lire
Alors un overlay bloquant apparaît
Et je vois le message:
"""
👑 Ce contenu est réservé aux abonnés Premium
Passez Premium pour 4.99/mois et accédez à tous les contenus exclusifs !
"""
Et un bouton "Passer Premium" est affiché
Scénario: CTA "Passer Premium" redirige vers abonnement
Étant donné que je vois l'overlay de contenu Premium bloqué
Quand je clique sur "Passer Premium"
Alors je suis redirigé vers la page d'abonnement Premium
Et je peux m'abonner pour 4.99/mois
Scénario: Utilisateur Premium peut lire tous les contenus Premium
Étant donné que je suis un utilisateur Premium actif
Quand je clique sur un contenu Premium
Alors le contenu se lance immédiatement
Et je n'ai aucun overlay bloquant
Et je peux profiter pleinement du contenu exclusif
Scénario: Contenus Premium inclus dans les recommandations
Étant donné que l'algorithme génère ma file de 5 contenus
Quand je suis un utilisateur gratuit
Alors les contenus Premium peuvent apparaître dans les recommandations
Et cela me fait découvrir qu'il existe du contenu exclusif
Scénario: Contenu Premium skippé automatiquement pour utilisateur gratuit
Étant donné que je suis un utilisateur gratuit
Et qu'un contenu Premium apparaît dans ma file de recommandation
Quand j'écoute le contenu précédent jusqu'à la fin
Alors le contenu Premium est automatiquement skippé
Et le contenu suivant (gratuit) est lancé
Et le slot Premium ne compte pas dans ma file de 5 contenus
Scénario: Contenu Premium diffusé normalement pour utilisateur Premium
Étant donné que je suis un utilisateur Premium
Et qu'un contenu Premium apparaît dans ma file de recommandation
Quand j'écoute le contenu précédent jusqu'à la fin
Alors le contenu Premium est lancé normalement
Et je profite du contenu exclusif sans interruption
Scénario: Champ `is_premium` boolean en base PostgreSQL
Étant donné qu'un contenu est créé
Quand il est stocké en base de données
Alors la table `contents` contient un champ `is_premium BOOLEAN DEFAULT FALSE`
Et ce champ est indexé pour requêtes rapides
Scénario: Index PostgreSQL sur `is_premium`
Étant donné que l'algorithme doit filtrer les contenus selon le statut Premium
Quand une requête SQL est exécutée:
```sql
SELECT * FROM contents
WHERE creator_id = :creator_id
AND (is_premium = FALSE OR :user_is_premium = TRUE)
ORDER BY created_at DESC;
```
Alors l'index sur `is_premium` accélère la requête
Et le temps de réponse reste <20ms
Scénario: Cache Redis pour statut Premium
Étant donné qu'un contenu Premium est consulté fréquemment
Quand l'API vérifie le statut Premium
Alors la valeur est récupérée depuis Redis:
```
content:[content_id]:premium = true
```
Et le cache a un TTL de 1 heure
Et cela évite des requêtes SQL inutiles
Scénario: Invalidation cache lors de modification statut Premium
Étant donné qu'un contenu est passé de gratuit à Premium
Quand le créateur enregistre la modification
Alors le cache Redis `content:[id]:premium` est invalidé immédiatement
Et la nouvelle valeur est mise à jour
Et les utilisateurs voient le changement en temps réel
Scénario: Justification liberté créateur - Stratégie personnalisée
Étant donné que chaque créateur a une audience différente
Quand un créateur décide de sa stratégie Premium
Alors il peut tester différentes approches:
| stratégie | % Premium | objectif |
| Tout gratuit | 0% | Maximiser audience + revenus pub |
| Mix 50/50 | 50% | Équilibrer audience et exclusivité |
| Premium majoritaire | 80% | Cibler abonnés fidèles |
| 100% Premium | 100% | Contenu ultra-exclusif |
Scénario: Justification incitation Premium - Argument fort pour s'abonner
Étant donné qu'un utilisateur gratuit voit beaucoup de contenus Premium
Quand il consulte les profils de ses créateurs préférés
Alors il voit que 60% de leur contenu est réservé Premium
Et cela l'incite à s'abonner pour 4.99/mois
Et RoadWave augmente son taux de conversion vers Premium
Scénario: Justification équité - Petit créateur peut tout mettre en Premium
Étant donné que je suis un petit créateur avec 600 abonnés
Et que 50 sont abonnés Premium
Quand je mets 100% de mon contenu en Premium
Alors je génère des revenus uniquement via mes 50 abonnés Premium
Et cela me permet de vivre de mon contenu malgré une petite audience
Scénario: Justification équité - Gros créateur peut tout offrir gratuitement
Étant donné que je suis un gros créateur avec 50 000 abonnés
Et que je génère déjà beaucoup de revenus publicitaires
Quand je laisse 100% de mon contenu gratuit
Alors je maximise mon audience et mes revenus pub
Et je n'ai pas besoin de mettre du contenu en Premium
Scénario: Statistiques créateur - Ratio Premium/Gratuit
Étant donné que j'accède à mon tableau de bord créateur
Quand je consulte mes statistiques de contenus
Alors je vois:
| métrique | valeur |
| Contenus totaux | 47 |
| Contenus gratuits | 32 (68%) |
| Contenus Premium | 15 (32%) |
| Écoutes Premium ce mois | 12,345 |
| Écoutes gratuites ce mois | 28,901 |
Scénario: Statistiques créateur - Revenus par type
Étant donné que j'ai des contenus gratuits et Premium
Quand je consulte mes revenus détaillés
Alors je vois:
| source | montant |
| Revenus pub (gratuit) | 86.70 |
| Revenus Premium (exclusifs) | 34.20 |
| Revenus Premium (tout contenu)| 78.90 |
Et je peux comparer l'efficacité de chaque stratégie
Scénario: Notification créateur - Contenu Premium très écouté
Étant donné que j'ai publié un contenu Premium il y a 3 jours
Et qu'il a généré 5 000 écoutes Premium (très élevé)
Quand le système détecte cette performance
Alors je reçois une notification:
"""
🔥 Votre contenu Premium "[Titre]" cartonne !
5 000 écoutes en 3 jours. Continuez à créer du contenu exclusif de qualité !
"""
Scénario: A/B test utilisateur - Impact badge Premium sur conversion
Étant donné que RoadWave veut optimiser le taux de conversion Premium
Quand un A/B test est lancé
Alors groupe A voit le badge 👑 "Premium"
Et groupe B voit le badge 💎 "Exclusif"
Et les taux de clic et conversion sont mesurés
Et le badge le plus performant est déployé définitivement
Scénario: Analytics plateforme - Adoption fonctionnalité Premium
Étant donné que RoadWave suit l'adoption de la fonctionnalité
Quand un admin consulte les métriques
Alors il voit:
| métrique | valeur |
| Créateurs utilisant Premium | 847 (68%) |
| % moyen contenus Premium | 23% |
| Taux conversion vers Premium (users) | 8.5% |
| Revenus Premium/mois | 47,890 |
Scénario: Impact sur churn - Contenus Premium réduisent le churn Premium
Étant donné qu'un utilisateur Premium envisage de résilier
Mais qu'il a accès à 150 contenus Premium de ses créateurs préférés
Quand il voit la valeur exclusive qu'il perdrait
Alors il est moins susceptible de résilier (churn réduit de ~30%)
Et les contenus Premium augmentent la rétention
Scénario: Transparence - Créateur voit combien de contenus Premium il a
Étant donné que j'accède à mon profil créateur
Quand je consulte mes contenus
Alors je peux filtrer par statut:
| filtre | résultats |
| Tous | 47 |
| Gratuits | 32 |
| Premium 👑 | 15 |
Et je peux facilement gérer mon catalogue
Scénario: Export liste contenus avec statut Premium (RGPD)
Étant donné que je demande l'export de mes données
Quand l'export est généré
Alors la liste de mes contenus inclut le statut Premium:
```json
{
"contents": [
{
"title": "Mon épisode exclusif",
"is_premium": true,
"published_at": "2025-06-15T10:30:00Z"
},
{
"title": "Mon épisode gratuit",
"is_premium": false,
"published_at": "2025-06-14T08:15:00Z"
}
]
}
```
Scénario: Suppression compte créateur et contenus Premium
Étant donné que je supprime définitivement mon compte créateur
Quand la suppression est confirmée
Alors tous mes contenus (gratuits et Premium) sont supprimés
Et les utilisateurs Premium ne peuvent plus y accéder
Et les fichiers audio sont supprimés du CDN sous 7 jours
Scénario: Performance avec 1 million de contenus Premium
Étant donné que RoadWave a 1 million de contenus dont 300 000 Premium
Quand l'algorithme génère une recommandation
Alors la requête SQL filtre efficacement avec l'index `is_premium`
Et le temps de réponse reste <50ms
Et la scalabilité est garantie