61 lines
2.2 KiB
PL/PgSQL
61 lines
2.2 KiB
PL/PgSQL
CREATE INDEX IF NOT EXISTS channel_invites_channel_active_idx
|
|
ON public.channel_invites (channel_id)
|
|
WHERE NOT revoked;
|
|
|
|
CREATE OR REPLACE FUNCTION public.telesrv_notify_channel_invites_channel_base_read_model() RETURNS trigger
|
|
LANGUAGE plpgsql
|
|
AS $$
|
|
DECLARE
|
|
changed_id BIGINT;
|
|
BEGIN
|
|
IF TG_OP = 'DELETE' THEN
|
|
changed_id := OLD.channel_id;
|
|
ELSE
|
|
changed_id := NEW.channel_id;
|
|
END IF;
|
|
PERFORM telesrv_bump_read_model_version('channel_base', 0, 'channel', changed_id);
|
|
RETURN NULL;
|
|
END;
|
|
$$;
|
|
|
|
DROP TRIGGER IF EXISTS channel_invites_channel_base_read_model_changed ON public.channel_invites;
|
|
CREATE TRIGGER channel_invites_channel_base_read_model_changed
|
|
AFTER INSERT OR DELETE OR UPDATE OF channel_id, revoked ON public.channel_invites
|
|
FOR EACH ROW EXECUTE FUNCTION public.telesrv_notify_channel_invites_channel_base_read_model();
|
|
|
|
WITH missing AS (
|
|
SELECT
|
|
c.id AS channel_id,
|
|
COALESCE((
|
|
SELECT MAX(ci.invite_id) + 1
|
|
FROM public.channel_invites ci
|
|
WHERE ci.channel_id = c.id
|
|
), floor(random() * 9007199254740991)::bigint + 1) AS invite_id,
|
|
'automain_' || c.id::text || '_' || substr(md5(c.id::text || ':' || clock_timestamp()::text || ':' || random()::text), 1, 16) AS hash,
|
|
c.creator_user_id AS admin_user_id
|
|
FROM public.channels c
|
|
JOIN public.users u ON u.id = c.creator_user_id
|
|
WHERE NOT c.deleted
|
|
AND c.creator_user_id <> 0
|
|
AND NOT EXISTS (
|
|
SELECT 1
|
|
FROM public.channel_invites ci
|
|
WHERE ci.channel_id = c.id
|
|
AND NOT ci.revoked
|
|
)
|
|
), inserted AS (
|
|
INSERT INTO public.channel_invites (
|
|
channel_id, invite_id, hash, admin_user_id, permanent, revoked, request_needed, created_at, updated_at
|
|
)
|
|
SELECT channel_id, invite_id, hash, admin_user_id, true, false, false, now(), now()
|
|
FROM missing
|
|
ON CONFLICT (channel_id, invite_id) DO NOTHING
|
|
RETURNING channel_id, invite_id, hash
|
|
)
|
|
INSERT INTO public.channel_invite_hashes (hash, channel_id, invite_id)
|
|
SELECT hash, channel_id, invite_id
|
|
FROM inserted
|
|
ON CONFLICT (hash) DO UPDATE SET
|
|
channel_id = EXCLUDED.channel_id,
|
|
invite_id = EXCLUDED.invite_id,
|
|
updated_at = now();
|