fix(evidence): isolate vectors by workspace
This commit is contained in:
@@ -40,14 +40,18 @@ begin
|
||||
end;
|
||||
$$;
|
||||
|
||||
create or replace function public.list_evidence_generations(table_name text, kind text)
|
||||
drop function if exists public.list_evidence_generations(text, text);
|
||||
|
||||
create or replace function public.list_evidence_generations(
|
||||
table_name text, kind text, workspace_id text
|
||||
)
|
||||
returns table(generation text)
|
||||
language plpgsql
|
||||
security definer
|
||||
set search_path = public, vectors, extensions
|
||||
as $$
|
||||
begin
|
||||
if table_name <> 'evidence' or kind <> 'evidence' then
|
||||
if table_name <> 'evidence' or kind <> 'evidence' or workspace_id !~ '^[a-z][a-z0-9_-]{0,63}$' then
|
||||
raise exception 'only exact Evidence generations may be listed';
|
||||
end if;
|
||||
return query
|
||||
@@ -55,6 +59,7 @@ begin
|
||||
from vectors.evidence e
|
||||
where e.kind = 'evidence'
|
||||
and e.metadata->>'vector_generation' ~ '^gen:[0-9a-f]{32}$'
|
||||
and e.metadata->>'workspace_id' = workspace_id
|
||||
order by 1;
|
||||
end;
|
||||
$$;
|
||||
@@ -120,8 +125,10 @@ begin
|
||||
end;
|
||||
$$;
|
||||
|
||||
drop function if exists public.delete_vector_generation(text, text, text);
|
||||
|
||||
create or replace function public.delete_vector_generation(
|
||||
table_name text, kind text, generation text
|
||||
table_name text, kind text, generation text, workspace_id text
|
||||
)
|
||||
returns jsonb
|
||||
language plpgsql
|
||||
@@ -130,11 +137,13 @@ set search_path = public, vectors, extensions
|
||||
as $$
|
||||
declare affected integer;
|
||||
begin
|
||||
if table_name <> 'evidence' or kind <> 'evidence' or generation !~ '^gen:[0-9a-f]{32}$' then
|
||||
if table_name <> 'evidence' or kind <> 'evidence' or generation !~ '^gen:[0-9a-f]{32}$'
|
||||
or workspace_id !~ '^[a-z][a-z0-9_-]{0,63}$' then
|
||||
raise exception 'only an exact Evidence generation may be deleted';
|
||||
end if;
|
||||
delete from vectors.evidence e
|
||||
where e.kind = 'evidence' and e.metadata->>'vector_generation' = generation;
|
||||
where e.kind = 'evidence' and e.metadata->>'vector_generation' = generation
|
||||
and e.metadata->>'workspace_id' = workspace_id;
|
||||
get diagnostics affected = row_count;
|
||||
return jsonb_build_object('deleted', affected);
|
||||
end;
|
||||
@@ -143,8 +152,8 @@ $$;
|
||||
revoke all on function public._assert_vector_write_table(text, text[]) from public;
|
||||
revoke all on function public.existing_vector_hashes(text, text[]) from public;
|
||||
revoke all on function public.upsert_vector_records(text, jsonb) from public;
|
||||
revoke all on function public.delete_vector_generation(text, text, text) from public;
|
||||
revoke all on function public.list_evidence_generations(text, text) from public;
|
||||
revoke all on function public.delete_vector_generation(text, text, text, text) from public;
|
||||
revoke all on function public.list_evidence_generations(text, text, text) from public;
|
||||
|
||||
-- Su alcuni progetti Supabase le funzioni in `public` ricevono grant automatici: revoca
|
||||
-- esplicitamente dai ruoli client generici, poi abilita solo il writer dedicato.
|
||||
@@ -153,20 +162,20 @@ begin
|
||||
if exists (select 1 from pg_roles where rolname = 'anon') then
|
||||
revoke all on function public.existing_vector_hashes(text, text[]) from anon;
|
||||
revoke all on function public.upsert_vector_records(text, jsonb) from anon;
|
||||
revoke all on function public.delete_vector_generation(text, text, text) from anon;
|
||||
revoke all on function public.list_evidence_generations(text, text) from anon;
|
||||
revoke all on function public.delete_vector_generation(text, text, text, text) from anon;
|
||||
revoke all on function public.list_evidence_generations(text, text, text) from anon;
|
||||
end if;
|
||||
if exists (select 1 from pg_roles where rolname = 'authenticated') then
|
||||
revoke all on function public.existing_vector_hashes(text, text[]) from authenticated;
|
||||
revoke all on function public.upsert_vector_records(text, jsonb) from authenticated;
|
||||
revoke all on function public.delete_vector_generation(text, text, text) from authenticated;
|
||||
revoke all on function public.list_evidence_generations(text, text) from authenticated;
|
||||
revoke all on function public.delete_vector_generation(text, text, text, text) from authenticated;
|
||||
revoke all on function public.list_evidence_generations(text, text, text) from authenticated;
|
||||
end if;
|
||||
if exists (select 1 from pg_roles where rolname = 'vector_writer') then
|
||||
grant execute on function public.existing_vector_hashes(text, text[]) to vector_writer;
|
||||
grant execute on function public.upsert_vector_records(text, jsonb) to vector_writer;
|
||||
grant execute on function public.delete_vector_generation(text, text, text) to vector_writer;
|
||||
grant execute on function public.list_evidence_generations(text, text) to vector_writer;
|
||||
grant execute on function public.delete_vector_generation(text, text, text, text) to vector_writer;
|
||||
grant execute on function public.list_evidence_generations(text, text, text) to vector_writer;
|
||||
end if;
|
||||
end $$;
|
||||
|
||||
|
||||
Reference in New Issue
Block a user