-- ============================================================================ -- RAPPORT — RPC-Funktionen für Sign-Up / Studio-Anlage -- ============================================================================ -- Zwei SECURITY-DEFINER-Funktionen, die der signUp-Flow im Frontend braucht: -- -- 1. `ensure_profile(username, display_name)` — legt für den eingeloggten User -- eine profiles-Zeile an (oder aktualisiert sie). Würde sonst an fehlender -- INSERT-Policy scheitern. -- -- 2. `create_studio_with_admin(name, slug)` — legt atomar Studio + Membership -- als Admin für den eingeloggten User an. Seed-Trigger füllt die Defaults. -- Liefert die studio_id zurück. -- -- Beide laufen mit Postgres-Owner-Rechten und sind explizit von einem -- authentifizierten User aufrufbar (Check via auth.uid()). -- ============================================================================ create or replace function ensure_profile(p_username text, p_display_name text) returns uuid language plpgsql security definer as $$ declare v_user_id uuid := auth.uid(); begin if v_user_id is null then raise exception 'Authentication required'; end if; insert into profiles (id, username, display_name) values (v_user_id, p_username, p_display_name) on conflict (id) do update set username = excluded.username, display_name = excluded.display_name; return v_user_id; end; $$; create or replace function create_studio_with_admin(p_name text, p_slug text) returns uuid language plpgsql security definer as $$ declare v_studio_id uuid; v_user_id uuid := auth.uid(); begin if v_user_id is null then raise exception 'Authentication required'; end if; insert into studios (name, slug) values (p_name, p_slug) returning id into v_studio_id; -- seed_studio_defaults-Trigger läuft hier automatisch und füllt Stammdaten insert into studio_members (studio_id, user_id, app_role_id) values (v_studio_id, v_user_id, 'r-admin'); return v_studio_id; end; $$; -- Sichtbarkeit: authentifizierte User dürfen diese Funktionen aufrufen. -- (`security definer` reicht — der Owner ist `postgres`, der hat überall Rechte.) grant execute on function ensure_profile(text, text) to authenticated; grant execute on function create_studio_with_admin(text, text) to authenticated;