68 lines
2.5 KiB
PL/PgSQL
68 lines
2.5 KiB
PL/PgSQL
-- Viewer-independent peer decorations are projected on every peer-bearing RPC
|
|
-- response. Keep one durable version token for username registry vectors and
|
|
-- third-party bot-verification marks so positive and negative L1 entries can be
|
|
-- reused without one PostgreSQL query per response page.
|
|
|
|
CREATE OR REPLACE FUNCTION public.telesrv_bump_peer_identity(
|
|
p_peer_type text,
|
|
p_peer_id bigint
|
|
) RETURNS void
|
|
LANGUAGE plpgsql
|
|
AS $$
|
|
BEGIN
|
|
IF COALESCE(p_peer_id, 0) = 0 OR p_peer_type NOT IN ('user', 'channel') THEN
|
|
RETURN;
|
|
END IF;
|
|
|
|
PERFORM public.telesrv_bump_read_model_version(
|
|
'peer_identity', 0, p_peer_type, p_peer_id
|
|
);
|
|
END;
|
|
$$;
|
|
|
|
CREATE OR REPLACE FUNCTION public.telesrv_notify_peer_identity_row()
|
|
RETURNS trigger
|
|
LANGUAGE plpgsql
|
|
AS $$
|
|
BEGIN
|
|
IF TG_OP = 'DELETE' THEN
|
|
PERFORM public.telesrv_bump_peer_identity(OLD.peer_type, OLD.peer_id);
|
|
RETURN OLD;
|
|
END IF;
|
|
|
|
IF TG_OP = 'UPDATE'
|
|
AND (OLD.peer_type, OLD.peer_id) IS DISTINCT FROM (NEW.peer_type, NEW.peer_id) THEN
|
|
PERFORM public.telesrv_bump_peer_identity(OLD.peer_type, OLD.peer_id);
|
|
END IF;
|
|
PERFORM public.telesrv_bump_peer_identity(NEW.peer_type, NEW.peer_id);
|
|
RETURN NEW;
|
|
END;
|
|
$$;
|
|
|
|
DROP TRIGGER IF EXISTS peer_usernames_peer_identity_changed ON public.peer_usernames;
|
|
CREATE TRIGGER peer_usernames_peer_identity_changed
|
|
AFTER INSERT OR UPDATE OR DELETE ON public.peer_usernames
|
|
FOR EACH ROW EXECUTE FUNCTION public.telesrv_notify_peer_identity_row();
|
|
|
|
DROP TRIGGER IF EXISTS custom_verifications_peer_identity_changed ON public.custom_verifications;
|
|
CREATE TRIGGER custom_verifications_peer_identity_changed
|
|
AFTER INSERT OR UPDATE OR DELETE ON public.custom_verifications
|
|
FOR EACH ROW EXECUTE FUNCTION public.telesrv_notify_peer_identity_row();
|
|
|
|
-- Seed every durable peer, including peers with no registry row/mark. This is
|
|
-- what makes an empty result a versioned negative fact rather than a TTL guess.
|
|
INSERT INTO public.read_model_versions (
|
|
model, owner_user_id, peer_type, peer_id, version, hash, updated_at
|
|
)
|
|
SELECT 'peer_identity', 0, 'user', u.id, 1,
|
|
public.telesrv_random_read_model_hash(), now()
|
|
FROM public.users u
|
|
ON CONFLICT (model, owner_user_id, peer_type, peer_id) DO NOTHING;
|
|
|
|
INSERT INTO public.read_model_versions (
|
|
model, owner_user_id, peer_type, peer_id, version, hash, updated_at
|
|
)
|
|
SELECT 'peer_identity', 0, 'channel', c.id, 1,
|
|
public.telesrv_random_read_model_hash(), now()
|
|
FROM public.channels c
|
|
ON CONFLICT (model, owner_user_id, peer_type, peer_id) DO NOTHING;
|