Files
Omika/infra/postgresql/012_diagnostics_tasks.sql
2026-10-23 18:46:50 +02:00

91 lines
4.9 KiB
SQL

-- ============================================================
-- Omika Diagnostic Center -- 012_diagnostics_tasks.sql
-- T25 : tâches de traitement des bugs récurrents.
-- ============================================================
-- TO RUN ON SRV-OMIKA as PostgreSQL superuser (e.g. psql -U postgres -d <base> -f 012_...),
-- AFTER 003 (rôles owner/worker/web) and 010 (diagnostics_users).
--
-- Guarantees :
-- - PostgreSQL 18 compatible.
-- - Idempotent : re-running is a no-op (CREATE ... IF NOT EXISTS + GRANT idempotent).
-- - Non destructive : NO DROP, NO DELETE/TRUNCATE, no data removal.
-- - NO password, NO secret.
--
-- Une ligne = une TÂCHE de traitement liée à un « type de bug », c'est-à-dire une
-- signature d'erreur (code événement + code erreur + exception + composant normalisés).
-- La signature est stockée sous sa forme URL-safe (DiagnosticErrorGroup.UrlIdentifier),
-- identique à celle utilisée par la page /Erreurs/{id}. Une seule tâche par signature
-- (unicité) : toutes les occurrences du même type de bug sont couvertes par la tâche.
--
-- group_url_identifier : identifiant URL-safe du groupe d'erreurs lié (unique, immuable).
-- title : intitulé de la tâche.
-- description : description libre du bug (nullable).
-- cause : cause de l'erreur / analyse root cause (nullable).
-- status : 'Todo' | 'InProgress' | 'Resolved' | 'Rejected' (liste fermée,
-- validée par le code, pas de CHECK arbitraire).
-- created_by_username : username de l'auteur (immuable, jamais renommé en V1).
-- assignee_username : username du responsable (nullable, optionnel).
-- created_at_utc : création.
-- updated_at_utc : dernière mutation.
-- resolved_at_utc : date de résolution/rejet ; NULL si statut non terminal.
--
-- CHOIX DE TYPE : aligné sur diagnostics_clients / diagnostics_users (TEXT, TIMESTAMPTZ,
-- BOOLEAN). Aucun VARCHAR, aucun CHECK de longueur (validation portée par le code).
-- Aucune colonne secret. Aucune colonne « password ».
-- ============================================================
CREATE TABLE IF NOT EXISTS diagnostics_tasks (
id BIGSERIAL PRIMARY KEY,
group_url_identifier TEXT NOT NULL,
title TEXT NOT NULL,
description TEXT,
cause TEXT,
status TEXT NOT NULL,
created_by_username TEXT NOT NULL,
assignee_username TEXT,
created_at_utc TIMESTAMPTZ NOT NULL,
updated_at_utc TIMESTAMPTZ NOT NULL,
resolved_at_utc TIMESTAMPTZ
);
-- Une seule tâche par signature d'erreur (T25 §4).
CREATE UNIQUE INDEX IF NOT EXISTS ux_diagnostics_tasks_group_url_identifier
ON diagnostics_tasks (group_url_identifier);
-- ------------------------------------------------------------
-- Ownership : omika_diagnostics_owner (comme 003/008/010).
-- ------------------------------------------------------------
ALTER TABLE diagnostics_tasks OWNER TO omika_diagnostics_owner;
ALTER SEQUENCE diagnostics_tasks_id_seq OWNER TO omika_diagnostics_owner;
-- ------------------------------------------------------------
-- Défense PUBLIC (ceinture + bretelles, idempotent).
-- ------------------------------------------------------------
REVOKE ALL ON TABLE diagnostics_tasks FROM PUBLIC;
-- ------------------------------------------------------------
-- Web (Omika.Diagnostics.Web) : SELECT + INSERT + UPDATE
-- colonne-ciblé (moindre privilège) + USAGE séquence.
-- - INSERT : création d'une tâche (id BIGSERIAL).
-- - UPDATE (title, description, cause, status, assignee_username,
-- updated_at_utc, resolved_at_utc) : édition de la tâche.
-- - group_url_identifier et created_by_username ne sont JAMAIS mis à jour.
-- - AUCUN DELETE (aucune suppression physique en V1).
-- ------------------------------------------------------------
GRANT SELECT ON TABLE diagnostics_tasks TO omika_diagnostics_web;
GRANT INSERT ON TABLE diagnostics_tasks TO omika_diagnostics_web;
GRANT UPDATE (title, description, cause, status, assignee_username, updated_at_utc, resolved_at_utc)
ON TABLE diagnostics_tasks TO omika_diagnostics_web;
GRANT USAGE ON SEQUENCE diagnostics_tasks_id_seq TO omika_diagnostics_web;
-- ------------------------------------------------------------
-- API (omika_diagnostics_api) : AUCUN droit sur diagnostics_tasks.
-- Worker (omika_diagnostics_worker) : AUCUN droit sur diagnostics_tasks.
-- Aucun GRANT accordé ; les rôles n'ont aucun privilège par défaut.
-- (Aucun REVOKE nécessaire : aucun privilège n'a été accordé.)
-- ------------------------------------------------------------
-- ============================================================
-- END 012. Ordre serveur : 001 -> 002 -> ... -> 011 -> 012.
-- ============================================================