# Reports 📖 Signalements de contenu et workflow de modération ## Diagramme ```kroki-dbml Table users { id uuid [primary key] username varchar(50) } Table contents { id uuid [primary key] title varchar(255) user_id uuid [not null] } Table reports { id uuid [primary key] content_id uuid [not null, ref: > contents.id, note: 'Content being reported'] reporter_id uuid [not null, ref: > users.id, note: 'User who filed the report'] moderator_id uuid [ref: > users.id, note: 'Moderator assigned to review (NULL if pending)'] category report_category_enum [not null] status report_status_enum [not null, default: 'pending'] comment text [note: 'Reporter explanation (mandatory for "other" category)'] evidence_url varchar(512) [note: 'Screenshot or additional proof URL'] reported_at timestamp [not null, default: `now()`] reviewed_at timestamp [note: 'When moderator reviewed the report'] moderator_notes text [note: 'Internal moderator notes'] action_taken report_action_enum [note: 'Action decided by moderator'] indexes { (content_id, status) [note: 'Find all reports for a content'] (status, reported_at) [note: 'Queue for moderators (pending first)'] (reporter_id) [note: 'User report history (detect abuse)'] (moderator_id) [note: 'Reports assigned to moderator'] } } Enum report_category_enum { spam [note: 'Contenu publicitaire non sollicité'] hate_speech [note: 'Discours haineux, discrimination'] violence [note: 'Violence explicite'] sexual_content [note: 'Contenu sexuel inapproprié'] misinformation [note: 'Désinformation, fake news'] copyright [note: 'Violation de droits d auteur'] wrong_age_rating [note: 'Classification d âge incorrecte'] other [note: 'Autre raison (commentaire obligatoire)'] } Enum report_status_enum { pending [note: 'En attente de revue'] under_review [note: 'En cours d examen par modérateur'] actioned [note: 'Action prise (contenu retiré/édité)'] dismissed [note: 'Signalement rejeté (contenu valide)'] duplicate [note: 'Doublon d un signalement existant'] } Enum report_action_enum { content_removed [note: 'Contenu supprimé'] content_edited [note: 'Métadonnées modifiées (âge, tags)'] warning_sent [note: 'Avertissement au créateur'] strike_issued [note: 'Strike ajouté au créateur'] account_suspended [note: 'Compte créateur suspendu'] no_action [note: 'Aucune action (signalement infondé)'] } ``` ## Légende **Catégories de signalement** : - `spam` : Contenu publicitaire non sollicité - `hate_speech` : Discours haineux, discrimination - `violence` : Violence explicite - `sexual_content` : Contenu sexuel inapproprié - `misinformation` : Désinformation, fake news - `copyright` : Violation de droits d'auteur - `wrong_age_rating` : Classification d'âge incorrecte - `other` : Autre raison (commentaire obligatoire) **Statuts** : - `pending` : En attente de revue - `under_review` : En cours d'examen par modérateur - `actioned` : Action prise (contenu retiré/édité) - `dismissed` : Signalement rejeté (contenu valide) - `duplicate` : Doublon d'un signalement existant **Actions possibles** : - `content_removed` : Contenu supprimé - `content_edited` : Métadonnées modifiées (âge, tags) - `warning_sent` : Avertissement au créateur - `strike_issued` : Strike ajouté au créateur - `account_suspended` : Compte créateur suspendu - `no_action` : Aucune action (signalement infondé) **Workflow modération** : - **3 premiers contenus** : Modération préalable obligatoire - **Après validation** : Modération a posteriori (signalements) - **Priorisation** : Nombre de signalements (>3 = urgent) - **Délai de traitement** : <48h pour signalements critiques