La plateforme AprèsLeBuzz est un média d'investigation fondé sur l'Open Data. Son objectif est d'assurer un suivi temporel strict (J+30, J+90, J+365) des annonces publiques, promesses politiques et déclarations économiques afin de mesurer leur véracité dans le temps.
Le modèle de données garantit l'intégrité référentielle entre les déclarations initiales, les relevés d'indicateurs chiffrés et la modération des participations communautaires.
-- Extensions nécessaires
CREATE EXTENSION IF NOT EXISTS "uuid-ossp";
CREATE EXTENSION IF NOT EXISTS "pg_trgm";
-- Énumérations
CREATE TYPE role_utilisateur AS ENUM ('admin', 'redacteur_chef', 'redacteur', 'bot_ingestion');
CREATE TYPE categorie_domaine AS ENUM ('politique', 'economie', 'societal', 'plan_media', 'science', 'sport', 'high_tech');
CREATE TYPE type_verif AS ENUM ('promesse_non_tenue', 'affirmation_fausse', 'suivi_de_projet', 'fait_etabli');
CREATE TYPE statut_tracker AS ENUM ('non_tenue', 'partiellement_tenue', 'tenue', 'en_cours', 'invalidee');
CREATE TYPE statut_publication AS ENUM ('brouillon', 'en_relecture', 'planifie', 'publie', 'archive');
CREATE TYPE statut_commentaire AS ENUM ('en_attente', 'publie', 'rejete_censure', 'masque_signalement');
-- Utilisateurs & Rôles
CREATE TABLE utilisateurs (
id SERIAL PRIMARY KEY,
uuid UUID DEFAULT uuid_generate_v4() UNIQUE,
nom VARCHAR(100) NOT NULL,
email VARCHAR(255) UNIQUE NOT NULL,
password_hash VARCHAR(255) NOT NULL,
role role_utilisateur NOT NULL DEFAULT 'redacteur',
created_at TIMESTAMP WITH TIME ZONE DEFAULT CURRENT_TIMESTAMP
);
-- Dossiers / Trackers principaux
CREATE TABLE dossiers (
id SERIAL PRIMARY KEY,
uuid UUID DEFAULT uuid_generate_v4() UNIQUE,
titre VARCHAR(255) NOT NULL,
slug VARCHAR(255) UNIQUE NOT NULL,
domaine categorie_domaine NOT NULL,
type_verif type_verif NOT NULL,
declaration_origine TEXT NOT NULL,
auteur_declaration VARCHAR(255) NOT NULL,
date_declaration DATE NOT NULL,
statut statut_tracker DEFAULT 'en_cours',
statut_pub statut_publication DEFAULT 'brouillon',
auteur_id INT REFERENCES utilisateurs(id),
score_confiance INT DEFAULT 50,
created_at TIMESTAMP WITH TIME ZONE DEFAULT CURRENT_TIMESTAMP,
updated_at TIMESTAMP WITH TIME ZONE DEFAULT CURRENT_TIMESTAMP
);
-- Relevés temporels (Séries temporelles)
CREATE TABLE releves_indicateurs (
id SERIAL PRIMARY KEY,
dossier_id INT REFERENCES dossiers(id) ON DELETE CASCADE,
date_releve DATE NOT NULL,
valeur_mesuree NUMERIC(12, 2) NOT NULL,
valeur_cible NUMERIC(12, 2),
unite VARCHAR(50) NOT NULL,
source_nom VARCHAR(255) NOT NULL,
source_url VARCHAR(500) NOT NULL,
remarque_expert TEXT,
created_at TIMESTAMP WITH TIME ZONE DEFAULT CURRENT_TIMESTAMP
);
-- Commentaires & Modération (Conformité LCEN)
CREATE TABLE commentaires (
id SERIAL PRIMARY KEY,
dossier_id INT REFERENCES dossiers(id) ON DELETE CASCADE,
auteur_user_id INT REFERENCES utilisateurs(id) ON DELETE SET NULL,
pseudo_anonyme VARCHAR(100),
email_anonyme VARCHAR(255),
contenu TEXT NOT NULL,
est_signalement_data BOOLEAN DEFAULT FALSE,
url_source_proposee VARCHAR(500),
statut statut_commentaire DEFAULT 'en_attente',
score_toxicite INT DEFAULT 0,
ip_auteur VARCHAR(45) NOT NULL,
created_at TIMESTAMP WITH TIME ZONE DEFAULT CURRENT_TIMESTAMP
);
-- Vues Analytiques pour le Dashboard Front-Office
CREATE VIEW vw_dossiers_stats AS
SELECT
d.id,
d.titre,
d.statut,
COUNT(c.id) AS total_commentaires,
MAX(r.date_releve) AS derniere_mise_a_jour
FROM dossiers d
LEFT JOIN commentaires c ON c.dossier_id = d.id AND c.statut = 'publie'
LEFT JOIN releves_indicateurs r ON r.dossier_id = d.id
GROUP BY d.id;
Composants clés : Header de marque, filtres par statut (Tenue, Non tenue, En cours) et par horizon temporel (J+30, J+90, J+365).
Contenu : Grille de cartes dynamiques affichant le titre du dossier, l'auteur de la promesse, un mini-graphique de tendance et le badge de vérification Open Data.
Composants clés : Graphique interactif (Chart.js / Recharts) superposant la trajectoire réelle face à l'objectif annoncé.
Contenu : Historique chronologique des événements, sources primaires téléchargeables (CSV/JSON), et analyse synthétique signée par la rédaction.
Composants clés : Formulaire de commentaire sous double onglet : "Débat public" ou "Apport de source Open Data".
Contenu : Envoi de liens de preuve pour révision par l'équipe rédactionnelle. Système d'avertissement automatique contre la désinformation.
Composants clés : Tableau de bord synthétique affichant la file d'attente des buzzs détectés par les scripts Python d'ingestion.
Contenu : Alertes de variations statistiques anormales sur les jeux de données publics, volume de commentaires à modérer et métriques de fréquentation.
Composants clés : Interface de création de dossier. Formulaire à double entrée (rédaction textuelle + tableur d'injection d'indicateurs).
Contenu : Prévisualisation instantanée du graphique de tendance et validation des schémas d'unités avant publication.
Composants clés : Kanban de modération à trois colonnes (En attente, Validé, Rejeté).
Contenu : Filtrage assisté par score de toxicité NLP, validation en un clic des sources apportées par les lecteurs et conversion directe en relevé d'indicateur.