68 lines
2.3 KiB
PL/PgSQL
68 lines
2.3 KiB
PL/PgSQL
-- 20260901000014 seeded only the peers that existed when that migration ran. Real account
|
|
-- provisioning and channel creation after deployment therefore had no durable
|
|
-- token, so their empty username/verification facts were deliberately
|
|
-- uncacheable. Maintain the token at the peer lifecycle boundary instead.
|
|
|
|
CREATE OR REPLACE FUNCTION public.telesrv_seed_peer_identity_on_insert()
|
|
RETURNS trigger
|
|
LANGUAGE plpgsql
|
|
AS $$
|
|
BEGIN
|
|
IF TG_TABLE_NAME = 'users' THEN
|
|
PERFORM public.telesrv_bump_peer_identity('user', NEW.id);
|
|
ELSIF TG_TABLE_NAME = 'channels' THEN
|
|
PERFORM public.telesrv_bump_peer_identity('channel', NEW.id);
|
|
ELSE
|
|
RAISE EXCEPTION 'unsupported peer identity seed table: %', TG_TABLE_NAME;
|
|
END IF;
|
|
RETURN NEW;
|
|
END;
|
|
$$;
|
|
|
|
DROP TRIGGER IF EXISTS users_peer_identity_created ON public.users;
|
|
CREATE TRIGGER users_peer_identity_created
|
|
AFTER INSERT ON public.users
|
|
FOR EACH ROW EXECUTE FUNCTION public.telesrv_seed_peer_identity_on_insert();
|
|
|
|
DROP TRIGGER IF EXISTS channels_peer_identity_created ON public.channels;
|
|
CREATE TRIGGER channels_peer_identity_created
|
|
AFTER INSERT ON public.channels
|
|
FOR EACH ROW EXECUTE FUNCTION public.telesrv_seed_peer_identity_on_insert();
|
|
|
|
-- Use the same bump helper rather than a silent INSERT so already-running
|
|
-- instances that cached a missing/zero token receive exact-key invalidation.
|
|
DO $$
|
|
DECLARE
|
|
peer_row record;
|
|
BEGIN
|
|
FOR peer_row IN
|
|
SELECT u.id
|
|
FROM public.users u
|
|
WHERE NOT EXISTS (
|
|
SELECT 1 FROM public.read_model_versions v
|
|
WHERE v.model = 'peer_identity'
|
|
AND v.owner_user_id = 0
|
|
AND v.peer_type = 'user'
|
|
AND v.peer_id = u.id
|
|
)
|
|
ORDER BY u.id
|
|
LOOP
|
|
PERFORM public.telesrv_bump_peer_identity('user', peer_row.id);
|
|
END LOOP;
|
|
|
|
FOR peer_row IN
|
|
SELECT c.id
|
|
FROM public.channels c
|
|
WHERE NOT EXISTS (
|
|
SELECT 1 FROM public.read_model_versions v
|
|
WHERE v.model = 'peer_identity'
|
|
AND v.owner_user_id = 0
|
|
AND v.peer_type = 'channel'
|
|
AND v.peer_id = c.id
|
|
)
|
|
ORDER BY c.id
|
|
LOOP
|
|
PERFORM public.telesrv_bump_peer_identity('channel', peer_row.id);
|
|
END LOOP;
|
|
END;
|
|
$$;
|