40 lines
1.3 KiB
SQL
40 lines
1.3 KiB
SQL
-- Migration 001 : Système de rôles et notes d'articles
|
|
-- À exécuter une seule fois sur le serveur PostgreSQL
|
|
|
|
-- Rôles disponibles
|
|
CREATE TABLE IF NOT EXISTS roles (
|
|
id SERIAL PRIMARY KEY,
|
|
name VARCHAR(50) UNIQUE NOT NULL,
|
|
label TEXT NOT NULL
|
|
);
|
|
|
|
INSERT INTO roles (name, label) VALUES
|
|
('admin', 'Administrateur'),
|
|
('editor', 'Rédacteur'),
|
|
('reader', 'Lecteur')
|
|
ON CONFLICT (name) DO NOTHING;
|
|
|
|
-- Association utilisateur ↔ rôle (clé : email, pour compatibilité OIDC sans FK)
|
|
CREATE TABLE IF NOT EXISTS user_roles (
|
|
user_email TEXT NOT NULL,
|
|
role_id INTEGER NOT NULL REFERENCES roles(id) ON DELETE CASCADE,
|
|
granted_at TIMESTAMP DEFAULT NOW(),
|
|
granted_by TEXT,
|
|
PRIMARY KEY (user_email, role_id)
|
|
);
|
|
|
|
-- Seed : cedric@abonnel.fr → admin
|
|
INSERT INTO user_roles (user_email, role_id, granted_by)
|
|
SELECT 'cedric@abonnel.fr', id, 'migration'
|
|
FROM roles WHERE name = 'admin'
|
|
ON CONFLICT DO NOTHING;
|
|
|
|
-- Notes d'articles (1-5 étoiles, une note par utilisateur par article)
|
|
CREATE TABLE IF NOT EXISTS article_ratings (
|
|
article_uuid VARCHAR(36) NOT NULL,
|
|
user_email TEXT NOT NULL,
|
|
rating SMALLINT NOT NULL CHECK (rating BETWEEN 1 AND 5),
|
|
rated_at TIMESTAMP DEFAULT NOW(),
|
|
PRIMARY KEY (article_uuid, user_email)
|
|
);
|