91 lines
4.9 KiB
SQL
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.
|
|
-- ============================================================
|