# Account Deletions 📖 Suppressions de compte avec grace period 30 jours (Article 17 RGPD) ## Diagramme ```kroki-dbml Table users { id uuid [primary key] email varchar(255) status varchar(20) } Table account_deletions { id uuid [primary key] user_id uuid [not null, unique, ref: - users.id, note: 'One-to-one: un user ne peut avoir qu une seule demande active'] status deletion_status_enum [not null, default: 'pending'] cancellation_token varchar(64) [unique, note: 'Token dans email pour annuler (expire après 30j)'] requested_at timestamp [not null, default: `now()`] effective_at timestamp [not null, note: 'Auto-calculated: requested_at + 30 days'] cancelled_at timestamp [note: 'Timestamp annulation via lien email (NULL si non annulé)'] deleted_at timestamp [note: 'Timestamp suppression effective (NULL si pending/cancelled)'] deletion_reason text [note: 'Raison optionnelle fournie par l utilisateur'] deleted_data_summary jsonb [note: 'Résumé des données supprimées (audit trail)'] indexes { (user_id) [unique] (status, effective_at) [note: 'Daily cron job: WHERE status = pending AND effective_at < NOW()'] (cancellation_token) [unique] } } Enum deletion_status_enum { pending [note: 'Grace period actif (30j), compte désactivé, annulation possible'] cancelled [note: 'Utilisateur a annulé via lien email'] completed [note: 'Suppression effective réalisée après 30j'] } ``` ## Légende **Statuts** : - `pending`: Grace period actif (30j), compte désactivé, annulation possible - `cancelled`: Utilisateur a annulé via lien email - `completed`: Suppression effective réalisée après 30j **Processus** : 1. Demande → compte désactivé, contenus cachés 2. Email avec `cancellation_token` (valide 30j) 3. Si annulation → `status = cancelled`, compte réactivé 4. Si 30j écoulés → job cron supprime données, anonymise contenus **Données supprimées** : - Profil utilisateur, historique GPS/écoute, sessions - Contenus créés : anonymisés (`créateur = "Utilisateur supprimé"`)