feat(schema): add notify_pbi_change trigger so PBI INSERT/UPDATE/DELETE emits NOTIFY on scrum4me_changes (#58)

Co-authored-by: Scrum4Me Agent <30029041+madhura68@users.noreply.github.com>
This commit is contained in:
Janpeter Visser 2026-05-02 21:10:03 +02:00 committed by GitHub
parent 6375ed6949
commit dc3832ad54
No known key found for this signature in database
GPG key ID: B5690EEEBB952194

View file

@ -0,0 +1,53 @@
-- Add notify_pbi_change() function and pbis_notify_change trigger so that
-- INSERT/UPDATE/DELETE on pbis emits a pg_notify on 'scrum4me_changes'.
-- Payload field names match BacklogPbi directly (no client-side rename needed).
CREATE OR REPLACE FUNCTION notify_pbi_change() RETURNS trigger AS $$
DECLARE
rec record;
payload jsonb;
BEGIN
IF TG_OP = 'DELETE' THEN
rec := OLD;
ELSE
rec := NEW;
END IF;
payload := jsonb_build_object(
'op', CASE TG_OP
WHEN 'INSERT' THEN 'I'
WHEN 'UPDATE' THEN 'U'
WHEN 'DELETE' THEN 'D'
END,
'entity', 'pbi',
'id', rec.id,
'product_id', rec.product_id,
'title', rec.title,
'code', rec.code,
'priority', rec.priority,
'status', rec.status,
'sort_order', rec.sort_order,
'created_at', rec.created_at
);
IF TG_OP = 'UPDATE' THEN
payload := payload || jsonb_build_object(
'changed_fields',
COALESCE((
SELECT jsonb_agg(n.key)
FROM jsonb_each(to_jsonb(NEW)) n
JOIN jsonb_each(to_jsonb(OLD)) o USING (key)
WHERE n.value IS DISTINCT FROM o.value
), '[]'::jsonb)
);
END IF;
PERFORM pg_notify('scrum4me_changes', payload::text);
RETURN rec;
END;
$$ LANGUAGE plpgsql;
DROP TRIGGER IF EXISTS pbis_notify_change ON pbis;
CREATE TRIGGER pbis_notify_change
AFTER INSERT OR UPDATE OR DELETE ON pbis
FOR EACH ROW EXECUTE FUNCTION notify_pbi_change();