transfer from private server/git server
This commit is contained in:
101
web/init.sql
Normal file
101
web/init.sql
Normal file
@@ -0,0 +1,101 @@
|
||||
-- =============================================================================
|
||||
-- init.sql — Script de création du schéma GestHub (MariaDB / InnoDB)
|
||||
-- =============================================================================
|
||||
-- Respecte la 3ème forme normale (3NF) : aucune donnée redondante, toutes les
|
||||
-- dépendances transitives éliminées. La référence aux utilisateurs se fait
|
||||
-- uniquement via `sub` (identifiant OIDC Keycloak), sans duplication des
|
||||
-- données du fournisseur d'identité (Bloc 2 - C4).
|
||||
--
|
||||
-- Moteur InnoDB : transactions ACID, contraintes de clé étrangère.
|
||||
-- Exécuté automatiquement au premier démarrage du conteneur MariaDB
|
||||
-- (monté sur /docker-entrypoint-initdb.d/init.sql, voir docker-compose.yml).
|
||||
-- =============================================================================
|
||||
|
||||
SET NAMES utf8mb4;
|
||||
SET FOREIGN_KEY_CHECKS = 1;
|
||||
|
||||
-- -----------------------------------------------------------------------------
|
||||
-- Table : annonces
|
||||
-- -----------------------------------------------------------------------------
|
||||
CREATE TABLE IF NOT EXISTS annonces (
|
||||
id INT UNSIGNED AUTO_INCREMENT PRIMARY KEY,
|
||||
titre VARCHAR(150) NOT NULL,
|
||||
contenu TEXT NOT NULL,
|
||||
epinglee TINYINT(1) NOT NULL DEFAULT 0,
|
||||
auteur_sub VARCHAR(64) NOT NULL, -- sub OIDC Keycloak (pas de FK vers Keycloak)
|
||||
created_at DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP,
|
||||
updated_at DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP,
|
||||
INDEX idx_annonces_auteur (auteur_sub),
|
||||
INDEX idx_annonces_created (created_at)
|
||||
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4;
|
||||
|
||||
-- -----------------------------------------------------------------------------
|
||||
-- Table : fichiers
|
||||
-- -----------------------------------------------------------------------------
|
||||
CREATE TABLE IF NOT EXISTS fichiers (
|
||||
id INT UNSIGNED AUTO_INCREMENT PRIMARY KEY,
|
||||
nom_original VARCHAR(255) NOT NULL,
|
||||
nom_stocke VARCHAR(64) NOT NULL UNIQUE, -- nom UUID sur disque (anti path traversal)
|
||||
mime_type VARCHAR(127) NOT NULL,
|
||||
taille_octets BIGINT UNSIGNED NOT NULL, -- BIGINT : fichiers volumineux possibles
|
||||
uploader_sub VARCHAR(64) NOT NULL,
|
||||
created_at DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP,
|
||||
INDEX idx_fichiers_uploader (uploader_sub)
|
||||
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4;
|
||||
|
||||
-- -----------------------------------------------------------------------------
|
||||
-- Table : evenements (module planning)
|
||||
-- -----------------------------------------------------------------------------
|
||||
CREATE TABLE IF NOT EXISTS evenements (
|
||||
id INT UNSIGNED AUTO_INCREMENT PRIMARY KEY,
|
||||
titre VARCHAR(150) NOT NULL,
|
||||
description TEXT NULL,
|
||||
date_debut DATETIME NOT NULL,
|
||||
date_fin DATETIME NOT NULL,
|
||||
createur_sub VARCHAR(64) NOT NULL,
|
||||
created_at DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP,
|
||||
CONSTRAINT chk_evenements_dates CHECK (date_fin >= date_debut),
|
||||
INDEX idx_evenements_dates (date_debut, date_fin)
|
||||
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4;
|
||||
|
||||
-- -----------------------------------------------------------------------------
|
||||
-- Table : blocks (widgets du tableau de bord — module historique, conservé)
|
||||
-- -----------------------------------------------------------------------------
|
||||
CREATE TABLE IF NOT EXISTS blocks (
|
||||
id INT UNSIGNED AUTO_INCREMENT PRIMARY KEY,
|
||||
block_type VARCHAR(50) NOT NULL, -- 'iframe' | 'buttons' | 'html'
|
||||
column_name VARCHAR(20) NOT NULL, -- 'left' | 'center' | 'right'
|
||||
position INT UNSIGNED NOT NULL DEFAULT 0,
|
||||
data TEXT NULL, -- JSON sérialisé (url, titre, liens...)
|
||||
created_at DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP
|
||||
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4;
|
||||
|
||||
-- -----------------------------------------------------------------------------
|
||||
-- Table : audit_log (traçabilité des actions sensibles — Bloc 1 - C10)
|
||||
-- -----------------------------------------------------------------------------
|
||||
CREATE TABLE IF NOT EXISTS audit_log (
|
||||
id INT UNSIGNED AUTO_INCREMENT PRIMARY KEY,
|
||||
action VARCHAR(50) NOT NULL, -- CREATE_ANNONCE, DELETE_FILE, LOGIN, LOGOUT, REFUSE...
|
||||
ressource VARCHAR(150) NULL, -- ex. 'annonce:42', 'fichier:uuid'
|
||||
statut VARCHAR(20) NOT NULL, -- SUCCESS | REFUSED | ERROR
|
||||
utilisateur_sub VARCHAR(64) NULL,
|
||||
ip_address VARCHAR(45) NULL, -- IPv4 ou IPv6
|
||||
created_at DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP,
|
||||
INDEX idx_audit_action (action),
|
||||
INDEX idx_audit_created (created_at)
|
||||
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4;
|
||||
|
||||
-- -----------------------------------------------------------------------------
|
||||
-- Projection méthodologique (non implémentée) : trigger de traçabilité des
|
||||
-- modifications directes en base, hors application (voir Bloc 1 - C10) :
|
||||
--
|
||||
-- DELIMITER $$
|
||||
-- CREATE TRIGGER trg_annonces_after_update
|
||||
-- AFTER UPDATE ON annonces
|
||||
-- FOR EACH ROW
|
||||
-- BEGIN
|
||||
-- INSERT INTO audit_log (action, ressource, statut, utilisateur_sub)
|
||||
-- VALUES ('DIRECT_UPDATE', CONCAT('annonce:', NEW.id), 'SUCCESS', NULL);
|
||||
-- END$$
|
||||
-- DELIMITER ;
|
||||
-- -----------------------------------------------------------------------------
|
||||
Reference in New Issue
Block a user