-- T0241: Create Role Management Database Models -- Create tables for roles, permissions, user_roles, and role_permissions -- Table roles CREATE TABLE IF NOT EXISTS roles ( id BIGSERIAL PRIMARY KEY, name VARCHAR(50) UNIQUE NOT NULL, display_name VARCHAR(100) NOT NULL, description TEXT, is_system BOOLEAN DEFAULT FALSE, is_active BOOLEAN DEFAULT TRUE, created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP, updated_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP ); -- Table permissions CREATE TABLE IF NOT EXISTS permissions ( id BIGSERIAL PRIMARY KEY, name VARCHAR(100) UNIQUE NOT NULL, resource VARCHAR(50) NOT NULL, action VARCHAR(50) NOT NULL, description TEXT, created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP ); -- Table user_roles CREATE TABLE IF NOT EXISTS user_roles ( id BIGSERIAL PRIMARY KEY, user_id BIGINT NOT NULL REFERENCES users(id) ON DELETE CASCADE, role_id BIGINT NOT NULL REFERENCES roles(id) ON DELETE CASCADE, assigned_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP, assigned_by BIGINT REFERENCES users(id), expires_at TIMESTAMP, is_active BOOLEAN DEFAULT TRUE, UNIQUE(user_id, role_id) ); -- Table role_permissions CREATE TABLE IF NOT EXISTS role_permissions ( role_id BIGINT NOT NULL REFERENCES roles(id) ON DELETE CASCADE, permission_id BIGINT NOT NULL REFERENCES permissions(id) ON DELETE CASCADE, PRIMARY KEY (role_id, permission_id) ); -- Indexes CREATE INDEX IF NOT EXISTS idx_user_roles_user_id ON user_roles(user_id); CREATE INDEX IF NOT EXISTS idx_user_roles_role_id ON user_roles(role_id); CREATE INDEX IF NOT EXISTS idx_role_permissions_role_id ON role_permissions(role_id); CREATE INDEX IF NOT EXISTS idx_role_permissions_permission_id ON role_permissions(permission_id); -- Seed system roles INSERT INTO roles (name, display_name, description, is_system) VALUES ('user', 'Utilisateur', 'Utilisateur standard avec accès de base', true), ('artist', 'Artiste', 'Créateur de contenu musical', true), ('producer', 'Producteur', 'Producteur musical', true), ('label', 'Label', 'Label de musique', true), ('moderator', 'Modérateur', 'Modération du contenu', true), ('admin', 'Administrateur', 'Administration complète', true) ON CONFLICT (name) DO NOTHING;