# User Profile History 📖 Audit trail modifications profil (Article 16 RGPD - Droit de rectification) ## Diagramme ```kroki-dbml Table users { id uuid [primary key] email varchar(255) username varchar(50) bio text } Table user_profile_history { id uuid [primary key] user_id uuid [not null, ref: > users.id] field_name profile_field_enum [not null, note: 'Champ modifié (email, username, bio, etc.)'] old_value text [note: 'Valeur avant modification (NULL si création)'] new_value text [not null, note: 'Nouvelle valeur'] change_reason change_reason_enum [not null] ip_address inet [not null, note: 'IP de l origine du changement'] changed_at timestamp [not null, default: `now()`] indexes { (user_id, changed_at) [note: 'Timeline modifications user (ordre chronologique)'] (field_name, changed_at) [note: 'Track modifications par type de champ'] (user_id, field_name) [note: 'Historique d un champ spécifique'] } } Enum profile_field_enum { email [note: 'Re-vérification requise après changement'] username [note: 'Limite: 1 changement/30j'] bio [note: 'Biographie utilisateur'] avatar_url [note: 'URL de l avatar'] date_of_birth [note: 'Date de naissance'] } Enum change_reason_enum { user_edit [note: 'Modification self-service utilisateur'] admin_correction [note: 'Correction par admin (via backoffice)'] gdpr_request [note: 'Suite demande RGPD formelle (droit de rectification)'] } ``` ## Légende **Champs trackés** : - `email`: Re-vérification requise - `username`: Limite 1 changement/30j - `bio`, `avatar_url`, `date_of_birth` **Change reasons** : - `user_edit`: Modification self-service utilisateur - `admin_correction`: Correction par admin - `gdpr_request`: Suite demande RGPD formelle **Audit** : - Historique complet conservé (preuve légale) - Accessible utilisateur : "Historique de mes modifications" - Accessible DPO : investigations