339 lines
11 KiB
PL/PgSQL
339 lines
11 KiB
PL/PgSQL
grant delete on table "auth"."audit_log_entries" to "prisma";
|
|
|
|
grant select on table "auth"."audit_log_entries" to "prisma";
|
|
|
|
grant delete on table "auth"."flow_state" to "prisma";
|
|
|
|
grant select on table "auth"."flow_state" to "prisma";
|
|
|
|
grant delete on table "auth"."identities" to "prisma";
|
|
|
|
grant select on table "auth"."identities" to "prisma";
|
|
|
|
grant delete on table "auth"."instances" to "prisma";
|
|
|
|
grant select on table "auth"."instances" to "prisma";
|
|
|
|
grant delete on table "auth"."mfa_amr_claims" to "prisma";
|
|
|
|
grant select on table "auth"."mfa_amr_claims" to "prisma";
|
|
|
|
grant delete on table "auth"."mfa_challenges" to "prisma";
|
|
|
|
grant select on table "auth"."mfa_challenges" to "prisma";
|
|
|
|
grant delete on table "auth"."mfa_factors" to "prisma";
|
|
|
|
grant select on table "auth"."mfa_factors" to "prisma";
|
|
|
|
grant delete on table "auth"."one_time_tokens" to "prisma";
|
|
|
|
grant select on table "auth"."one_time_tokens" to "prisma";
|
|
|
|
grant delete on table "auth"."refresh_tokens" to "prisma";
|
|
|
|
grant select on table "auth"."refresh_tokens" to "prisma";
|
|
|
|
grant delete on table "auth"."saml_providers" to "prisma";
|
|
|
|
grant select on table "auth"."saml_providers" to "prisma";
|
|
|
|
grant delete on table "auth"."saml_relay_states" to "prisma";
|
|
|
|
grant select on table "auth"."saml_relay_states" to "prisma";
|
|
|
|
grant delete on table "auth"."schema_migrations" to "prisma";
|
|
|
|
grant select on table "auth"."schema_migrations" to "prisma";
|
|
|
|
grant delete on table "auth"."sessions" to "prisma";
|
|
|
|
grant select on table "auth"."sessions" to "prisma";
|
|
|
|
grant delete on table "auth"."sso_domains" to "prisma";
|
|
|
|
grant select on table "auth"."sso_domains" to "prisma";
|
|
|
|
grant delete on table "auth"."sso_providers" to "prisma";
|
|
|
|
grant select on table "auth"."sso_providers" to "prisma";
|
|
|
|
grant delete on table "auth"."users" to "prisma";
|
|
|
|
grant select on table "auth"."users" to "prisma";
|
|
|
|
CREATE TRIGGER on_auth_user_created AFTER INSERT ON auth.users FOR EACH ROW EXECUTE FUNCTION handle_new_user();
|
|
|
|
CREATE TRIGGER on_auth_user_deleted BEFORE DELETE ON auth.users FOR EACH ROW EXECUTE FUNCTION handle_user_delete();
|
|
|
|
CREATE TRIGGER on_auth_user_updated AFTER UPDATE ON auth.users FOR EACH ROW EXECUTE FUNCTION handle_user_update();
|
|
|
|
drop trigger if exists "objects_delete_delete_prefix" on "storage"."objects";
|
|
|
|
drop trigger if exists "objects_insert_create_prefix" on "storage"."objects";
|
|
|
|
drop trigger if exists "objects_update_create_prefix" on "storage"."objects";
|
|
|
|
DO $$
|
|
BEGIN
|
|
IF EXISTS (SELECT FROM pg_catalog.pg_tables
|
|
WHERE schemaname = 'storage'
|
|
AND tablename = 'prefixes') THEN
|
|
|
|
EXECUTE 'drop trigger if exists "prefixes_create_hierarchy" on "storage"."prefixes"';
|
|
EXECUTE 'drop trigger if exists "prefixes_delete_hierarchy" on "storage"."prefixes"';
|
|
|
|
EXECUTE 'revoke delete on table "storage"."prefixes" from "anon"';
|
|
EXECUTE 'revoke insert on table "storage"."prefixes" from "anon"';
|
|
EXECUTE 'revoke references on table "storage"."prefixes" from "anon"';
|
|
EXECUTE 'revoke select on table "storage"."prefixes" from "anon"';
|
|
EXECUTE 'revoke trigger on table "storage"."prefixes" from "anon"';
|
|
EXECUTE 'revoke truncate on table "storage"."prefixes" from "anon"';
|
|
EXECUTE 'revoke update on table "storage"."prefixes" from "anon"';
|
|
|
|
EXECUTE 'revoke delete on table "storage"."prefixes" from "authenticated"';
|
|
EXECUTE 'revoke insert on table "storage"."prefixes" from "authenticated"';
|
|
EXECUTE 'revoke references on table "storage"."prefixes" from "authenticated"';
|
|
EXECUTE 'revoke select on table "storage"."prefixes" from "authenticated"';
|
|
EXECUTE 'revoke trigger on table "storage"."prefixes" from "authenticated"';
|
|
EXECUTE 'revoke truncate on table "storage"."prefixes" from "authenticated"';
|
|
EXECUTE 'revoke update on table "storage"."prefixes" from "authenticated"';
|
|
|
|
EXECUTE 'revoke delete on table "storage"."prefixes" from "service_role"';
|
|
EXECUTE 'revoke insert on table "storage"."prefixes" from "service_role"';
|
|
EXECUTE 'revoke references on table "storage"."prefixes" from "service_role"';
|
|
EXECUTE 'revoke select on table "storage"."prefixes" from "service_role"';
|
|
EXECUTE 'revoke trigger on table "storage"."prefixes" from "service_role"';
|
|
EXECUTE 'revoke truncate on table "storage"."prefixes" from "service_role"';
|
|
EXECUTE 'revoke update on table "storage"."prefixes" from "service_role"';
|
|
|
|
EXECUTE 'alter table "storage"."prefixes" drop constraint if exists "prefixes_bucketId_fkey"';
|
|
EXECUTE 'alter table "storage"."prefixes" drop constraint if exists "prefixes_pkey"';
|
|
|
|
EXECUTE 'drop table "storage"."prefixes"';
|
|
END IF;
|
|
END $$;
|
|
|
|
drop function if exists "storage"."add_prefixes"(_bucket_id text, _name text);
|
|
|
|
drop function if exists "storage"."delete_prefix"(_bucket_id text, _name text);
|
|
|
|
drop function if exists "storage"."delete_prefix_hierarchy_trigger"();
|
|
|
|
drop function if exists "storage"."get_level"(name text);
|
|
|
|
drop function if exists "storage"."get_prefix"(name text);
|
|
|
|
drop function if exists "storage"."get_prefixes"(name text);
|
|
|
|
drop function if exists "storage"."objects_insert_prefix_trigger"();
|
|
|
|
drop function if exists "storage"."objects_update_prefix_trigger"();
|
|
|
|
drop function if exists "storage"."prefixes_insert_trigger"();
|
|
|
|
drop function if exists "storage"."search_legacy_v1"(prefix text, bucketname text, limits integer, levels integer, offsets integer, search text, sortcolumn text, sortorder text);
|
|
|
|
drop function if exists "storage"."search_v1_optimised"(prefix text, bucketname text, limits integer, levels integer, offsets integer, search text, sortcolumn text, sortorder text);
|
|
|
|
drop function if exists "storage"."search_v2"(prefix text, bucket_name text, limits integer, levels integer, start_after text);
|
|
|
|
DO $$
|
|
BEGIN
|
|
IF EXISTS (SELECT 1 FROM pg_indexes WHERE schemaname = 'storage' AND indexname = 'idx_name_bucket_level_unique') THEN
|
|
EXECUTE 'drop index "storage"."idx_name_bucket_level_unique"';
|
|
END IF;
|
|
|
|
IF EXISTS (SELECT 1 FROM pg_indexes WHERE schemaname = 'storage' AND indexname = 'idx_objects_lower_name') THEN
|
|
EXECUTE 'drop index "storage"."idx_objects_lower_name"';
|
|
END IF;
|
|
|
|
IF EXISTS (SELECT 1 FROM pg_indexes WHERE schemaname = 'storage' AND indexname = 'idx_prefixes_lower_name') THEN
|
|
EXECUTE 'drop index "storage"."idx_prefixes_lower_name"';
|
|
END IF;
|
|
|
|
IF EXISTS (SELECT 1 FROM pg_indexes WHERE schemaname = 'storage' AND indexname = 'objects_bucket_id_level_idx') THEN
|
|
EXECUTE 'drop index "storage"."objects_bucket_id_level_idx"';
|
|
END IF;
|
|
|
|
IF EXISTS (SELECT 1 FROM pg_indexes WHERE schemaname = 'storage' AND indexname = 'prefixes_pkey') THEN
|
|
EXECUTE 'drop index "storage"."prefixes_pkey"';
|
|
END IF;
|
|
END $$;
|
|
|
|
DO $$
|
|
BEGIN
|
|
IF EXISTS (
|
|
SELECT 1
|
|
FROM information_schema.columns
|
|
WHERE table_schema = 'storage'
|
|
AND table_name = 'objects'
|
|
AND column_name = 'level'
|
|
) THEN
|
|
EXECUTE 'alter table "storage"."objects" drop column "level"';
|
|
END IF;
|
|
END $$;
|
|
|
|
set check_function_bodies = off;
|
|
|
|
CREATE OR REPLACE FUNCTION storage.extension(name text)
|
|
RETURNS text
|
|
LANGUAGE plpgsql
|
|
AS $function$
|
|
DECLARE
|
|
_parts text[];
|
|
_filename text;
|
|
BEGIN
|
|
select string_to_array(name, '/') into _parts;
|
|
select _parts[array_length(_parts,1)] into _filename;
|
|
-- @todo return the last part instead of 2
|
|
return reverse(split_part(reverse(_filename), '.', 1));
|
|
END
|
|
$function$
|
|
;
|
|
|
|
CREATE OR REPLACE FUNCTION storage.foldername(name text)
|
|
RETURNS text[]
|
|
LANGUAGE plpgsql
|
|
AS $function$
|
|
DECLARE
|
|
_parts text[];
|
|
BEGIN
|
|
select string_to_array(name, '/') into _parts;
|
|
return _parts[1:array_length(_parts,1)-1];
|
|
END
|
|
$function$
|
|
;
|
|
|
|
CREATE OR REPLACE FUNCTION storage.get_size_by_bucket()
|
|
RETURNS TABLE(size bigint, bucket_id text)
|
|
LANGUAGE plpgsql
|
|
AS $function$
|
|
BEGIN
|
|
return query
|
|
select sum((metadata->>'size')::int) as size, obj.bucket_id
|
|
from "storage".objects as obj
|
|
group by obj.bucket_id;
|
|
END
|
|
$function$
|
|
;
|
|
|
|
CREATE OR REPLACE FUNCTION storage.search(prefix text, bucketname text, limits integer DEFAULT 100, levels integer DEFAULT 1, offsets integer DEFAULT 0, search text DEFAULT ''::text, sortcolumn text DEFAULT 'name'::text, sortorder text DEFAULT 'asc'::text)
|
|
RETURNS TABLE(name text, id uuid, updated_at timestamp with time zone, created_at timestamp with time zone, last_accessed_at timestamp with time zone, metadata jsonb)
|
|
LANGUAGE plpgsql
|
|
STABLE
|
|
AS $function$
|
|
declare
|
|
v_order_by text;
|
|
v_sort_order text;
|
|
begin
|
|
case
|
|
when sortcolumn = 'name' then
|
|
v_order_by = 'name';
|
|
when sortcolumn = 'updated_at' then
|
|
v_order_by = 'updated_at';
|
|
when sortcolumn = 'created_at' then
|
|
v_order_by = 'created_at';
|
|
when sortcolumn = 'last_accessed_at' then
|
|
v_order_by = 'last_accessed_at';
|
|
else
|
|
v_order_by = 'name';
|
|
end case;
|
|
|
|
case
|
|
when sortorder = 'asc' then
|
|
v_sort_order = 'asc';
|
|
when sortorder = 'desc' then
|
|
v_sort_order = 'desc';
|
|
else
|
|
v_sort_order = 'asc';
|
|
end case;
|
|
|
|
v_order_by = v_order_by || ' ' || v_sort_order;
|
|
|
|
return query execute
|
|
'with folders as (
|
|
select path_tokens[$1] as folder
|
|
from storage.objects
|
|
where objects.name ilike $2 || $3 || ''%''
|
|
and bucket_id = $4
|
|
and array_length(objects.path_tokens, 1) <> $1
|
|
group by folder
|
|
order by folder ' || v_sort_order || '
|
|
)
|
|
(select folder as "name",
|
|
null as id,
|
|
null as updated_at,
|
|
null as created_at,
|
|
null as last_accessed_at,
|
|
null as metadata from folders)
|
|
union all
|
|
(select path_tokens[$1] as "name",
|
|
id,
|
|
updated_at,
|
|
created_at,
|
|
last_accessed_at,
|
|
metadata
|
|
from storage.objects
|
|
where objects.name ilike $2 || $3 || ''%''
|
|
and bucket_id = $4
|
|
and array_length(objects.path_tokens, 1) = $1
|
|
order by ' || v_order_by || ')
|
|
limit $5
|
|
offset $6' using levels, prefix, search, bucketname, limits, offsets;
|
|
end;
|
|
$function$
|
|
;
|
|
|
|
create policy "Anyone can update their own avatar."
|
|
on "storage"."objects"
|
|
as permissive
|
|
for update
|
|
to public
|
|
using ((( SELECT auth.uid() AS uid) = owner))
|
|
with check ((bucket_id = 'avatars'::text));
|
|
|
|
|
|
create policy "allow all 1oj01fe_0"
|
|
on "storage"."objects"
|
|
as permissive
|
|
for delete
|
|
to authenticated
|
|
using ((bucket_id = 'avatars'::text));
|
|
|
|
|
|
create policy "allow all 1oj01fe_1"
|
|
on "storage"."objects"
|
|
as permissive
|
|
for update
|
|
to authenticated
|
|
using ((bucket_id = 'avatars'::text));
|
|
|
|
|
|
create policy "allow all 1oj01fe_2"
|
|
on "storage"."objects"
|
|
as permissive
|
|
for insert
|
|
to authenticated
|
|
with check ((bucket_id = 'avatars'::text));
|
|
|
|
|
|
create policy "allow all 1oj01fe_3"
|
|
on "storage"."objects"
|
|
as permissive
|
|
for select
|
|
to authenticated
|
|
using ((bucket_id = 'avatars'::text));
|
|
|
|
|
|
|
|
-- drop type "gis"."geometry_dump";
|
|
|
|
-- drop type "gis"."valid_detail";
|
|
|
|
-- create type "gis"."geometry_dump" as ("path" integer[], "geom" geometry);
|
|
|
|
-- create type "gis"."valid_detail" as ("valid" boolean, "reason" character varying, "location" geometry);
|
|
|
|
|