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:
@@ -0,0 +1,254 @@
|
||||
# language: fr
|
||||
|
||||
@rgpd @account-deletion
|
||||
Fonctionnalité: Suppression du compte utilisateur (Article 17 RGPD - Droit à l'effacement)
|
||||
|
||||
# 13.4 - Grace period 30j + anonymisation contenus
|
||||
|
||||
Contexte:
|
||||
Étant donné que je suis un utilisateur connecté
|
||||
Et que j'ai utilisé l'application depuis plusieurs mois
|
||||
|
||||
Scénario: Demande de suppression depuis les paramètres
|
||||
Étant donné que je suis dans "Paramètres > Compte"
|
||||
Quand je clique sur "Supprimer mon compte"
|
||||
Alors une page d'avertissement s'affiche avec le message:
|
||||
"""
|
||||
Attention: La suppression de votre compte est définitive.
|
||||
|
||||
Que se passe-t-il lors de la suppression?
|
||||
- Votre compte sera désactivé immédiatement (connexion impossible)
|
||||
- Vos données personnelles seront supprimées dans 30 jours
|
||||
- Vos contenus créés resteront disponibles de manière anonyme
|
||||
- Vous pouvez annuler la suppression dans les 30 jours
|
||||
|
||||
Voulez-vous vraiment continuer?
|
||||
"""
|
||||
Et deux boutons sont disponibles: "Annuler" et "Confirmer la suppression"
|
||||
|
||||
Scénario: Confirmation de suppression avec mot de passe
|
||||
Étant donné que je clique sur "Confirmer la suppression"
|
||||
Quand un formulaire de confirmation s'affiche
|
||||
Alors je dois entrer mon mot de passe pour confirmer
|
||||
Et je dois cocher "Je comprends que cette action est définitive"
|
||||
Et un captcha peut être requis pour éviter les suppressions automatisées
|
||||
Quand je valide le formulaire
|
||||
Alors la suppression est initiée
|
||||
|
||||
# Désactivation immédiate
|
||||
|
||||
Scénario: Compte désactivé immédiatement après confirmation
|
||||
Étant donné que j'ai confirmé la suppression de mon compte
|
||||
Quand la demande est traitée
|
||||
Alors mon compte est désactivé immédiatement
|
||||
Et je suis déconnecté de toutes mes sessions
|
||||
Et je ne peux plus me reconnecter
|
||||
Et si j'essaie de me connecter, je reçois le message:
|
||||
"""
|
||||
Votre compte est en cours de suppression. Si vous souhaitez annuler, cliquez sur le lien reçu par email.
|
||||
"""
|
||||
|
||||
Scénario: Contenus cachés pendant le grace period
|
||||
Étant donné que mon compte est en cours de suppression
|
||||
Quand un autre utilisateur recherche mes contenus
|
||||
Alors mes contenus ne sont plus diffusés dans l'application
|
||||
Et mes contenus n'apparaissent plus dans les recherches
|
||||
Et mes contenus ne sont plus recommandés
|
||||
Mais mes contenus ne sont pas encore supprimés définitivement
|
||||
|
||||
# Email de confirmation avec lien d'annulation
|
||||
|
||||
Scénario: Email de confirmation envoyé immédiatement
|
||||
Étant donné que j'ai confirmé la suppression de mon compte
|
||||
Quand la demande est traitée
|
||||
Alors je reçois un email avec le sujet "Confirmation de suppression de votre compte RoadWave"
|
||||
Et l'email contient:
|
||||
"""
|
||||
Bonjour,
|
||||
|
||||
Votre compte RoadWave est en cours de suppression. Vos données seront définitivement supprimées le [date + 30j].
|
||||
|
||||
Si vous changez d'avis, vous pouvez annuler la suppression en cliquant sur le lien ci-dessous (valide 30 jours):
|
||||
|
||||
[Annuler la suppression]
|
||||
|
||||
Que se passe-t-il ensuite?
|
||||
- Votre compte est désactivé immédiatement
|
||||
- Vos contenus sont masqués de l'application
|
||||
- Vos données seront supprimées dans 30 jours
|
||||
- Vous pouvez annuler à tout moment pendant ces 30 jours
|
||||
|
||||
Pour toute question: dpo@roadwave.fr
|
||||
"""
|
||||
Et le lien d'annulation est valide 30 jours
|
||||
|
||||
# Grace period de 30 jours
|
||||
|
||||
Scénario: Annulation de la suppression dans les 30 jours
|
||||
Étant donné que j'ai demandé la suppression de mon compte le 2025-01-20
|
||||
Et que je reçois l'email de confirmation
|
||||
Quand je clique sur le lien "Annuler la suppression" le 2025-02-05 (16 jours plus tard)
|
||||
Alors mon compte est réactivé immédiatement
|
||||
Et je peux me reconnecter normalement
|
||||
Et mes contenus redeviennent visibles dans l'application
|
||||
Et toutes mes données sont restaurées
|
||||
Et je reçois un email de confirmation: "Votre compte a été réactivé"
|
||||
|
||||
Scénario: Lien d'annulation expire après 30 jours
|
||||
Étant donné que j'ai demandé la suppression de mon compte le 2025-01-20
|
||||
Quand j'essaie de cliquer sur le lien d'annulation le 2025-02-25 (36 jours plus tard)
|
||||
Alors le lien est expiré
|
||||
Et je reçois un message "Ce lien a expiré. Votre compte a été définitivement supprimé."
|
||||
Et la suppression effective a déjà eu lieu
|
||||
|
||||
# Suppression effective après 30 jours
|
||||
|
||||
Scénario: Suppression effective sans annulation
|
||||
Étant donné que j'ai demandé la suppression de mon compte le 2025-01-20
|
||||
Et que je n'ai pas cliqué sur le lien d'annulation
|
||||
Quand la date atteint le 2025-02-19 (30 jours plus tard)
|
||||
Alors un job automatique exécute la suppression définitive
|
||||
Et toutes mes données personnelles sont supprimées
|
||||
|
||||
# Données supprimées
|
||||
|
||||
Scénario: Liste des données supprimées définitivement
|
||||
Étant donné que la suppression effective est exécutée
|
||||
Quand le job de suppression se termine
|
||||
Alors les données suivantes sont supprimées:
|
||||
| données | supprimé |
|
||||
| Compte utilisateur (email, mdp) | oui |
|
||||
| Profil (pseudo, bio, avatar) | oui |
|
||||
| Historique d'écoute | oui |
|
||||
| Historique GPS | oui |
|
||||
| Centres d'intérêt (jauges) | oui |
|
||||
| Sessions et tokens | oui |
|
||||
| Likes et abonnements | oui |
|
||||
| Notifications non lues | oui |
|
||||
| Historique consentements | oui |
|
||||
| Données de paiement | oui |
|
||||
Et ces suppressions sont irréversibles
|
||||
|
||||
# Contenus conservés anonymement
|
||||
|
||||
Scénario: Anonymisation des contenus créés
|
||||
Étant donné que j'ai créé 10 contenus audio
|
||||
Quand la suppression effective est exécutée
|
||||
Alors mes contenus audio restent disponibles dans l'application
|
||||
Et le nom du créateur devient "Utilisateur supprimé"
|
||||
Et mon pseudo n'est plus visible
|
||||
Et les métadonnées (titre, description, tags, géolocalisation) sont conservées
|
||||
Et les fichiers audio restent sur le CDN
|
||||
Et les statistiques d'écoute sont conservées
|
||||
|
||||
Scénario: Justification de l'anonymisation (intérêt légitime)
|
||||
Étant donné que mes contenus sont conservés anonymement
|
||||
Quand un auditeur RGPD vérifie la conformité
|
||||
Alors la conservation est justifiée par l'intérêt légitime de la communauté
|
||||
Et les contenus ne contiennent plus de données personnelles identifiables
|
||||
Et la suppression complète nuirait à l'expérience des autres utilisateurs
|
||||
Et cette pratique est conforme au RGPD si anonymisation réelle
|
||||
|
||||
Scénario: Contenu anonymisé visible pour les autres utilisateurs
|
||||
Étant donné que mon compte a été supprimé
|
||||
Et que mes contenus ont été anonymisés
|
||||
Quand un utilisateur consulte un de mes anciens contenus
|
||||
Alors le créateur affiché est "Utilisateur supprimé"
|
||||
Et le profil du créateur n'est plus accessible
|
||||
Et le contenu reste écoutable normalement
|
||||
Et les likes et statistiques sont conservés
|
||||
|
||||
# Likes et abonnements supprimés
|
||||
|
||||
Scénario: Suppression de mes likes avec conservation des compteurs
|
||||
Étant donné que j'avais liké 50 contenus
|
||||
Quand la suppression effective est exécutée
|
||||
Alors mes likes sont supprimés de la base de données
|
||||
Mais les compteurs de likes sur les contenus sont préservés
|
||||
Et les créateurs ne perdent pas leurs statistiques
|
||||
Et seule la relation "user X a liké content Y" est supprimée
|
||||
|
||||
Scénario: Suppression de mes abonnements
|
||||
Étant donné que je suivais 20 créateurs
|
||||
Quand la suppression effective est exécutée
|
||||
Alors mes abonnements sont supprimés
|
||||
Et les compteurs d'abonnés des créateurs sont décrémentés de 1
|
||||
Et les créateurs ne reçoivent pas de notification de désabonnement
|
||||
|
||||
# Sessions et tokens révoqués
|
||||
|
||||
Scénario: Révocation de tous les tokens immédiatement
|
||||
Étant donné que je suis connecté sur 3 appareils (mobile, tablette, web)
|
||||
Quand je demande la suppression de mon compte
|
||||
Alors tous mes tokens d'authentification sont révoqués immédiatement
|
||||
Et je suis déconnecté de tous mes appareils
|
||||
Et toute tentative de reconnexion échoue
|
||||
|
||||
# Notifications avant suppression
|
||||
|
||||
Scénario: Rappels par email pendant le grace period
|
||||
Étant donné que j'ai demandé la suppression de mon compte le 2025-01-20
|
||||
Quand le grace period s'écoule
|
||||
Alors je reçois des emails de rappel:
|
||||
| date | jours restants | sujet email |
|
||||
| 2025-02-04 | 15 jours | Plus que 15 jours pour annuler la suppression |
|
||||
| 2025-02-12 | 7 jours | Dernière semaine pour annuler la suppression |
|
||||
| 2025-02-17 | 2 jours | Attention: suppression définitive dans 2 jours |
|
||||
Et chaque email contient le lien d'annulation
|
||||
|
||||
# Conformité RGPD Article 17
|
||||
|
||||
Scénario: Conformité droit à l'effacement
|
||||
Étant donné que la suppression de mon compte est complète
|
||||
Quand un auditeur RGPD vérifie la conformité
|
||||
Alors le processus respecte l'article 17 du RGPD:
|
||||
| exigence RGPD | respecté |
|
||||
| Suppression de toutes les données personnelles | oui |
|
||||
| Délai raisonnable (30j grace period acceptable)| oui |
|
||||
| Possibilité d'annulation (bonne pratique) | oui |
|
||||
| Anonymisation des contenus (intérêt légitime) | oui |
|
||||
| Révocation des tokens et sessions | oui |
|
||||
| Suppression irréversible | oui |
|
||||
|
||||
# Cas particuliers
|
||||
|
||||
Scénario: Suppression d'un compte Premium
|
||||
Étant donné que j'ai un abonnement Premium actif
|
||||
Quand je demande la suppression de mon compte
|
||||
Alors mon abonnement est annulé immédiatement
|
||||
Et aucun remboursement n'est effectué (conformément aux CGV)
|
||||
Et je reçois un email de confirmation d'annulation de l'abonnement
|
||||
Et le reste du processus de suppression se déroule normalement
|
||||
|
||||
Scénario: Suppression d'un compte créateur avec revenus en attente
|
||||
Étant donné que je suis un créateur avec 75€ de revenus en attente de paiement
|
||||
Quand je demande la suppression de mon compte
|
||||
Alors un message m'informe:
|
||||
"""
|
||||
Vous avez 75€ de revenus en attente. Souhaitez-vous recevoir ce paiement avant suppression?
|
||||
"""
|
||||
Et je peux choisir "Recevoir le paiement et attendre" ou "Renoncer au paiement"
|
||||
Et si je choisis "Recevoir le paiement", la suppression est repoussée de 7 jours
|
||||
|
||||
Scénario: Suppression avec signalements de modération en cours
|
||||
Étant donné que j'ai 2 signalements en cours de traitement
|
||||
Quand je demande la suppression de mon compte
|
||||
Alors les signalements sont automatiquement clôturés
|
||||
Et les contenus signalés sont masqués immédiatement
|
||||
Et aucune sanction n'est appliquée (compte déjà en suppression)
|
||||
|
||||
# Traçabilité pour audit
|
||||
|
||||
Scénario: Log de la suppression pour traçabilité
|
||||
Étant donné que la suppression effective est exécutée
|
||||
Quand le job de suppression se termine
|
||||
Alors un log est créé avec:
|
||||
| champ | valeur |
|
||||
| user_id | [ID anonymisé] |
|
||||
| deletion_requested_at | 2025-01-20T10:00:00Z |
|
||||
| deletion_executed_at | 2025-02-19T02:00:00Z |
|
||||
| deletion_cancelled | false |
|
||||
| data_deleted | [liste des tables] |
|
||||
| contents_anonymized | 10 |
|
||||
Et ce log est conservé 5 ans pour audit RGPD
|
||||
Et l'user_id est pseudonymisé pour anonymat
|
||||
Reference in New Issue
Block a user