diff --git a/supabase/migrations/0002_storage.sql b/supabase/migrations/0002_storage.sql index 46f8d60..ed8253b 100644 --- a/supabase/migrations/0002_storage.sql +++ b/supabase/migrations/0002_storage.sql @@ -26,34 +26,40 @@ on conflict (id) do nothing; -- RLS-Policies auf storage.objects -- ──────────────────────────────────────────────────────────────────────────── -- Prinzip: erste Pfad-Komponente ist studio_id; Zugriff nur wenn Member. --- `(storage.foldername(name))[1]` gibt die erste Pfad-Komponente zurück. +-- `split_part(name, '/', 1)` gibt die erste Pfad-Komponente zurück. +-- +-- Bewusst NICHT storage.foldername() benutzen: die Storage-API droppt/erstellt +-- diese Funktion bei ihren eigenen Boot-Migrations neu. Eine Policy-Abhängigkeit +-- darauf würde diesen Drop blockieren ("cannot drop function foldername") und +-- die Storage-API in eine Crash-Loop schicken. split_part ist ein eingebautes +-- Postgres-Builtin ohne diese Kopplung. create policy "rapport_storage_read" on storage.objects for select using ( bucket_id in ('receipts','logos') - and is_studio_member( (storage.foldername(name))[1]::uuid ) + and is_studio_member( split_part(name, '/', 1)::uuid ) ); create policy "rapport_storage_insert" on storage.objects for insert with check ( bucket_id in ('receipts','logos') - and is_studio_member( (storage.foldername(name))[1]::uuid ) + and is_studio_member( split_part(name, '/', 1)::uuid ) ); create policy "rapport_storage_update" on storage.objects for update using ( bucket_id in ('receipts','logos') - and is_studio_member( (storage.foldername(name))[1]::uuid ) + and is_studio_member( split_part(name, '/', 1)::uuid ) ); create policy "rapport_storage_delete" on storage.objects for delete using ( bucket_id in ('receipts','logos') - and is_studio_member( (storage.foldername(name))[1]::uuid ) + and is_studio_member( split_part(name, '/', 1)::uuid ) ); -- ────────────────────────────────────────────────────────────────────────────