@@ -0,0 +1,51 @@
|
||||
-- SPDX-License-Identifier: LicenseRef-ConusAI-Template-1.0
|
||||
create table "kit_live_change_log" (
|
||||
"org_id" uuid not null,
|
||||
"txid" xid8 not null default pg_current_xact_id(),
|
||||
"seq" bigint generated always as identity,
|
||||
"entity" text not null,
|
||||
"entity_id" text not null,
|
||||
"op" "char" not null,
|
||||
"version" bigint,
|
||||
"workspace_id" uuid,
|
||||
"project_id" uuid,
|
||||
"at" timestamptz not null default now(),
|
||||
constraint "kit_live_change_log_op_known" check ("op" in ('u', 'd')),
|
||||
primary key ("org_id", "txid", "seq")
|
||||
);
|
||||
|
||||
create index "kit_live_change_log_at_idx" on "kit_live_change_log" ("at");
|
||||
|
||||
alter table "kit_live_change_log" enable row level security;
|
||||
|
||||
alter table "kit_live_change_log" force row level security;
|
||||
|
||||
create policy "kit_live_change_log_tenant" on "kit_live_change_log" using ("org_id" = nullif(current_setting('app.org_id', true), '')::uuid) with check ("org_id" = nullif(current_setting('app.org_id', true), '')::uuid);
|
||||
|
||||
create function "kit_live_capture"() returns trigger language plpgsql as $$
|
||||
begin
|
||||
if TG_OP = 'DELETE' then
|
||||
insert into "kit_live_change_log" ("org_id", "entity", "entity_id", "op", "version", "workspace_id", "project_id")
|
||||
select (r->>'org_id')::uuid, TG_ARGV[0], r->>'id', 'd', null,
|
||||
nullif(r->>'workspace_id', '')::uuid, nullif(r->>'project_id', '')::uuid
|
||||
from (select to_jsonb(o) as r from old_rows o) changed;
|
||||
perform pg_notify('kit_live', org) from (select distinct to_jsonb(o)->>'org_id' as org from old_rows o) orgs;
|
||||
else
|
||||
insert into "kit_live_change_log" ("org_id", "entity", "entity_id", "op", "version", "workspace_id", "project_id")
|
||||
select (r->>'org_id')::uuid, TG_ARGV[0], r->>'id', 'u', (r->>'version')::bigint,
|
||||
nullif(r->>'workspace_id', '')::uuid, nullif(r->>'project_id', '')::uuid
|
||||
from (select to_jsonb(n) as r from new_rows n) changed;
|
||||
perform pg_notify('kit_live', org) from (select distinct to_jsonb(n)->>'org_id' as org from new_rows n) orgs;
|
||||
end if;
|
||||
return null;
|
||||
end
|
||||
$$;
|
||||
|
||||
do $$ begin execute format('create policy "kit_live_change_log_prune" on "kit_live_change_log" for delete to %I using (true)', current_user); end $$;
|
||||
|
||||
do $$ begin execute format('create policy "kit_live_change_log_prune_read" on "kit_live_change_log" for select to %I using (true)', current_user); end $$;
|
||||
|
||||
create function "kit_live_prune"(hours integer) returns bigint language sql security definer set search_path = public as $$
|
||||
with gone as (delete from "kit_live_change_log" where "at" < now() - make_interval(hours => hours) returning 1)
|
||||
select count(*) from gone
|
||||
$$;
|
||||
Reference in New Issue
Block a user