-- ============================================================ -- 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 -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. -- ============================================================