From 4c04f1cb56234fb3282592e24110b301dbff4c29 Mon Sep 17 00:00:00 2001 From: karim Date: Sat, 30 May 2026 14:18:01 +0200 Subject: [PATCH] fix(storage): split_part statt storage.foldername in Policies Die Storage-API droppt/erstellt storage.foldername() bei ihren Boot- Migrations neu. Policies, die davon abhingen, blockierten den Drop ('cannot drop function foldername') und schickten die Storage-API in eine Crash-Loop. split_part(name,'/',1) liefert dieselbe erste Pfad-Komponente (studio_id) ohne diese Kopplung. Co-Authored-By: Claude Opus 4.8 --- supabase/migrations/0002_storage.sql | 16 +++++++++++----- 1 file changed, 11 insertions(+), 5 deletions(-) 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 ) ); -- ────────────────────────────────────────────────────────────────────────────