patchcenter/migrate_teams_rules_v2_20260506.sql
Admin MPCZ 060af01db9 feat(teams): fan-out multi-recipient + flag is_database_server + multi-referents
- Migration v2: ajoute teams_channel_rules.match_is_database_server (NULL=any/TRUE=DB only/FALSE=non-DB only),
  servers.is_database_server boolean (default false), table server_additional_referents pour multi-referents
- Service teams_service.py: resolve_channel_for_server -> resolve_channels_for_server (pluriel, retourne LIST)
  * msg_type=reboot: 1 seul canal (canal flagge is_reboot_channel)
  * server.teams_channel_id override: 1 seul canal
  * sinon FAN-OUT: TOUTES les regles actives qui matchent contribuent un canal
  * dynamic_to_email calcule selon nature de la regle (responsable / DBA pool / referents)
- send_notification: boucle sur les canaux resultants, ecrit 1 fichier SP par destination
- UI settings.html: nouveau filtre 'Match serveur DB' dans formulaire regle, badge dans tableau
- Compat: resolve_channel_for_server (singulier) conserve comme wrapper qui retourne le 1er canal

Permet le scenario: serveur DB avec responsable=Delcour -> notif a la fois dans conv Delcour
ET dans conv DBA (Nadine+Cedric), via 2 regles qui matchent en parallele.
2026-05-06 10:33:12 +02:00

40 lines
2.0 KiB
SQL

-- Migration v2 routing Teams : multi-match (fan-out), serveurs DB, référents additionnels
-- - teams_channel_rules.match_is_database_server : nouvelle condition (matcher uniquement les DB)
-- - servers.is_database_server : flag manuel (default false)
-- - server_additional_referents : table additive pour multi-référents par serveur (cas DB Nadine+Cedric)
-- Le moteur de résolution passe en mode "toutes les règles qui matchent contribuent" (cf code service).
-- Idempotent.
-- ─── 1) Condition is_database_server sur les règles ───────────
ALTER TABLE public.teams_channel_rules
ADD COLUMN IF NOT EXISTS match_is_database_server boolean;
-- NULL = pas de filtre ; true = ne matcher que les DB ; false = ne matcher que les non-DB
-- ─── 2) Flag is_database_server sur servers ───────────────────
ALTER TABLE public.servers
ADD COLUMN IF NOT EXISTS is_database_server boolean NOT NULL DEFAULT false;
CREATE INDEX IF NOT EXISTS idx_servers_is_db
ON public.servers(is_database_server)
WHERE is_database_server = true;
-- ─── 3) Référents additionnels (multi-référents) ──────────────
CREATE TABLE IF NOT EXISTS public.server_additional_referents (
server_id integer NOT NULL REFERENCES public.servers(id) ON DELETE CASCADE,
contact_id integer NOT NULL REFERENCES public.contacts(id) ON DELETE CASCADE,
role text NOT NULL DEFAULT 'referent_technique',
-- 'referent_technique' (par défaut) | extensible (DBA, sécu, ...)
created_at timestamptz NOT NULL DEFAULT now(),
PRIMARY KEY (server_id, contact_id, role)
);
CREATE INDEX IF NOT EXISTS idx_server_additional_referents_contact
ON public.server_additional_referents(contact_id);
-- ─── 4) GRANTs ────────────────────────────────────────────────
GRANT SELECT, INSERT, UPDATE, DELETE ON public.server_additional_referents TO patchcenter;