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.
246 lines
12 KiB
Gherkin
246 lines
12 KiB
Gherkin
# language: fr
|
|
|
|
@rgpd @data-retention
|
|
Fonctionnalité: Durée de conservation des données et purge automatique
|
|
|
|
# 13.6 - 5 ans inactivité → purge automatique (principe de minimisation RGPD)
|
|
|
|
Contexte:
|
|
Étant donné que le système de purge automatique est actif
|
|
|
|
# Règles de conservation
|
|
|
|
Scénario: Auditeur inactif depuis 5 ans - suppression automatique
|
|
Étant donné que je suis un auditeur (sans contenu créé)
|
|
Et que je ne me suis pas connecté depuis le 2020-01-01
|
|
Et que la date actuelle est 2025-01-02 (>5 ans)
|
|
Quand le job de purge automatique s'exécute
|
|
Alors mon compte est automatiquement supprimé
|
|
Et toutes mes données personnelles sont effacées
|
|
Et aucune trace ne subsiste dans la base de données
|
|
|
|
Scénario: Créateur avec contenus actifs - conservation indéfinie
|
|
Étant donné que je suis un créateur
|
|
Et que j'ai créé 10 contenus qui reçoivent encore des écoutes
|
|
Et que je ne me suis pas connecté depuis 6 ans
|
|
Quand le job de purge automatique s'exécute
|
|
Alors mon compte n'est pas supprimé
|
|
Et mes données personnelles sont conservées tant que mes contenus sont écoutés
|
|
Et mes contenus continuent d'être diffusés normalement
|
|
|
|
Scénario: Créateur inactif sans écoutes - suppression automatique
|
|
Étant donné que je suis un créateur
|
|
Et que j'ai créé 5 contenus
|
|
Et que je ne me suis pas connecté depuis 5 ans (depuis 2020-01-01)
|
|
Et que mes contenus n'ont reçu aucune écoute depuis 2 ans (depuis 2023-01-01)
|
|
Et que la date actuelle est 2025-01-02
|
|
Quand le job de purge automatique s'exécute
|
|
Alors mon compte est automatiquement supprimé
|
|
Et mes contenus sont anonymisés (créateur = "Utilisateur supprimé")
|
|
Et les fichiers audio restent disponibles mais anonymisés
|
|
|
|
# Notifications avant suppression
|
|
|
|
Scénario: Notifications par email avant purge
|
|
Étant donné que je suis inactif depuis 4 ans et 9 mois
|
|
Quand le système détecte que je suis éligible à la purge dans 90 jours
|
|
Alors je reçois un email avec le sujet "Votre compte RoadWave sera supprimé dans 90 jours"
|
|
Et l'email contient:
|
|
"""
|
|
Bonjour,
|
|
|
|
Votre compte RoadWave n'a pas été utilisé depuis plus de 4 ans.
|
|
Conformément à notre politique de conservation des données, votre compte sera automatiquement supprimé dans 90 jours si vous ne vous connectez pas.
|
|
|
|
Pour conserver votre compte, il suffit de vous connecter avant le [date limite].
|
|
|
|
Date de dernière connexion: [date]
|
|
Date de suppression prévue: [date + 90j]
|
|
|
|
Si vous ne souhaitez pas conserver ce compte, aucune action n'est requise.
|
|
"""
|
|
Et un lien de connexion est inclus dans l'email
|
|
|
|
Scénario: Rappels à 90j, 30j et 7j avant suppression
|
|
Étant donné que je suis éligible à la purge automatique
|
|
Quand les délais s'écoulent
|
|
Alors je reçois les emails suivants:
|
|
| délai | sujet email |
|
|
| 90 jours | Votre compte sera supprimé dans 90 jours |
|
|
| 30 jours | Rappel: Votre compte sera supprimé dans 30 jours |
|
|
| 7 jours | Dernière alerte: suppression dans 7 jours |
|
|
Et chaque email contient un lien de connexion pour réactiver le compte
|
|
Et les notifications push sont également envoyées si activées
|
|
|
|
Scénario: Connexion annule la suppression programmée
|
|
Étant donné que je suis éligible à la purge dans 15 jours
|
|
Et que j'ai reçu plusieurs emails d'avertissement
|
|
Quand je me connecte à mon compte
|
|
Alors la suppression programmée est annulée immédiatement
|
|
Et le compteur d'inactivité est remis à zéro
|
|
Et je reçois un email de confirmation: "Votre compte a été réactivé"
|
|
Et je peux continuer à utiliser l'application normalement
|
|
|
|
# Job de purge automatique
|
|
|
|
Scénario: Exécution quotidienne du job de purge
|
|
Étant donné que le système est en production
|
|
Quand on consulte les jobs planifiés
|
|
Alors un job "purge_inactive_accounts" est configuré
|
|
Et le job s'exécute tous les jours à 03:00 (heure creuse)
|
|
Et le job identifie les comptes éligibles à la purge
|
|
Et le job traite les suppressions automatiques
|
|
|
|
Scénario: Critères d'éligibilité à la purge
|
|
Étant donné que le job de purge s'exécute
|
|
Quand le système identifie les comptes éligibles
|
|
Alors les critères suivants sont appliqués:
|
|
| type_compte | critères |
|
|
| Auditeur uniquement | 5 ans sans connexion |
|
|
| Créateur avec contenus actifs| Jamais (tant qu'écoutes) |
|
|
| Créateur inactif | 5 ans sans connexion + 2 ans sans écoute |
|
|
Et seuls les comptes remplissant tous les critères sont supprimés
|
|
|
|
Scénario: Métriques du job de purge
|
|
Étant donné que le job de purge s'exécute le 2025-01-15
|
|
Quand le job se termine
|
|
Alors un rapport est généré avec:
|
|
| métrique | exemple |
|
|
| Comptes analysés | 150 000 |
|
|
| Comptes éligibles à la purge | 350 |
|
|
| Auditeurs supprimés | 300 |
|
|
| Créateurs inactifs supprimés | 50 |
|
|
| Créateurs conservés (actifs) | 0 |
|
|
| Erreurs | 0 |
|
|
| Durée d'exécution | 45s |
|
|
Et le rapport est loggé pour audit
|
|
|
|
# Contenus conservés après purge
|
|
|
|
Scénario: Contenus de comptes purgés conservés anonymement
|
|
Étant donné que mon compte créateur est purgé automatiquement
|
|
Quand la suppression est effective
|
|
Alors mes contenus créés sont conservés indéfiniment
|
|
Et les contenus sont anonymisés (créateur = "Utilisateur supprimé")
|
|
Et les fichiers audio restent sur le CDN
|
|
Et les statistiques d'écoute sont préservées
|
|
Et les utilisateurs peuvent toujours écouter mes contenus
|
|
|
|
# Exception: créateurs avec écoutes régulières
|
|
|
|
Scénario: Créateur inactif mais contenus populaires - pas de purge
|
|
Étant donné que je suis un créateur inactif depuis 6 ans
|
|
Mais que mes contenus reçoivent 500+ écoutes par mois
|
|
Quand le job de purge s'exécute
|
|
Alors mon compte n'est pas supprimé
|
|
Et je continue de recevoir les emails d'avertissement tous les 6 mois
|
|
Et mes contenus continuent d'être diffusés
|
|
Et je peux me reconnecter à tout moment
|
|
|
|
# Définition de "écoute" pour les créateurs
|
|
|
|
Scénario: Qu'est-ce qu'une "écoute" pour le calcul d'inactivité
|
|
Étant donné que je suis un créateur
|
|
Quand le système calcule si mes contenus sont "actifs"
|
|
Alors une "écoute" est comptabilisée si:
|
|
| condition | comptabilisée |
|
|
| Écoute complète (>80%) | oui |
|
|
| Écoute partielle (>30%) | oui |
|
|
| Skip rapide (<30%) | non |
|
|
| Écoute par un bot (détecté) | non |
|
|
Et au moins 1 écoute valide dans les 2 dernières années maintient le compte actif
|
|
|
|
# Principe de minimisation RGPD
|
|
|
|
Scénario: Conformité principe de minimisation
|
|
Étant donné que le système de purge automatique est en place
|
|
Quand un auditeur RGPD vérifie la conformité
|
|
Alors le système respecte le principe de minimisation:
|
|
| principe | respecté |
|
|
| Conservation limitée dans le temps | oui |
|
|
| Suppression automatique après inactivité | oui |
|
|
| Délai raisonnable (5 ans) | oui |
|
|
| Notifications préalables | oui |
|
|
| Exception justifiée (contenus actifs) | oui |
|
|
Et le délai de 5 ans est conforme aux standards de l'industrie
|
|
|
|
# Reset du compteur d'inactivité
|
|
|
|
Scénario: Actions qui réinitialisent le compteur d'inactivité
|
|
Étant donné que je suis inactif depuis 4 ans
|
|
Quand j'effectue l'une des actions suivantes:
|
|
| action |
|
|
| Connexion à l'application |
|
|
| Publication d'un nouveau contenu |
|
|
| Like d'un contenu |
|
|
| Abonnement à un créateur |
|
|
| Modification de mon profil |
|
|
Alors le compteur d'inactivité est remis à zéro
|
|
Et la suppression programmée est annulée
|
|
Et je ne suis plus éligible à la purge pour 5 ans
|
|
|
|
# Logs d'audit
|
|
|
|
Scénario: Traçabilité des suppressions automatiques
|
|
Étant donné qu'un compte est supprimé automatiquement
|
|
Quand la suppression est effective
|
|
Alors un log d'audit est créé avec:
|
|
| champ | valeur |
|
|
| user_id | [ID anonymisé] |
|
|
| account_type | auditeur / créateur |
|
|
| last_login | 2020-01-15T10:00:00Z |
|
|
| last_content_listen | 2023-06-01T14:30:00Z |
|
|
| purge_date | 2025-01-15T03:00:00Z |
|
|
| notifications_sent | 3 (90j, 30j, 7j) |
|
|
| reason | 5_years_inactivity |
|
|
Et le log est conservé 5 ans pour audit RGPD
|
|
Et l'user_id est pseudonymisé pour anonymat
|
|
|
|
# Cas particuliers
|
|
|
|
Scénario: Compte Premium inactif - pas de privilège spécial
|
|
Étant donné que je suis un utilisateur Premium
|
|
Et que je suis inactif depuis 5 ans
|
|
Quand le job de purge s'exécute
|
|
Alors mon compte est supprimé comme un compte gratuit
|
|
Et l'abonnement Premium ne prolonge pas la durée de conservation
|
|
Et aucun remboursement n'est effectué (compte inactif depuis 5 ans)
|
|
|
|
Scénario: Compte avec signalements de modération - purge différée
|
|
Étant donné que je suis éligible à la purge
|
|
Mais que j'ai des signalements de modération en cours
|
|
Quand le job de purge s'exécute
|
|
Alors ma purge est différée de 90 jours
|
|
Et les signalements sont traités en priorité
|
|
Et si les signalements aboutissent à un ban, le compte est supprimé immédiatement
|
|
Et si les signalements sont infondés, la purge automatique reprend son cours
|
|
|
|
# Durée de 5 ans - justification
|
|
|
|
Scénario: Pourquoi 5 ans d'inactivité
|
|
Étant donné que le délai de purge est fixé à 5 ans
|
|
Quand on justifie ce choix
|
|
Alors les raisons suivantes sont avancées:
|
|
| justification |
|
|
| Standard de l'industrie (Google, Facebook: 2-3 ans) |
|
|
| Équilibre raisonnable entre minimisation et utilité |
|
|
| Conforme aux recommandations CNIL |
|
|
| Laisse une marge de réactivation pour utilisateurs |
|
|
| Exception pour créateurs = intérêt légitime communauté |
|
|
|
|
# Communication transparente
|
|
|
|
Scénario: Politique de conservation visible dans les CGU
|
|
Étant donné que je consulte les CGU de RoadWave
|
|
Quand je lis la section "Conservation des données"
|
|
Alors la politique de purge automatique est clairement expliquée:
|
|
"""
|
|
Conservation des données:
|
|
- Comptes auditeurs: suppression automatique après 5 ans d'inactivité
|
|
- Comptes créateurs: suppression après 5 ans d'inactivité + 2 ans sans écoute de leurs contenus
|
|
- Exception: créateurs dont les contenus sont encore écoutés régulièrement
|
|
- Notifications: 90j, 30j et 7j avant suppression
|
|
- Contenus créés: conservés de manière anonyme après suppression du compte
|
|
"""
|
|
Et les utilisateurs sont informés dès l'inscription
|