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:
jpgiannetti
2026-02-01 11:31:41 +01:00
parent 841028d1b2
commit 37c62206ad
88 changed files with 625 additions and 67 deletions

View File

@@ -0,0 +1,245 @@
# 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