-- R1 Basis: gemeinsame Hilfsfunktionen für alle Tabellen. -- Jede Tabelle hat: id (uuid, PK), created_at, updated_at. -- Setzt updated_at bei jeder Änderung und schützt id und created_at vor Änderungen. -- Der Client kann diese drei Spalten damit nie verfälschen. create or replace function public.set_updated_at() returns trigger language plpgsql set search_path = '' as $$ begin new.id := old.id; new.created_at := old.created_at; new.updated_at := now(); return new; end; $$; -- Admin-Rolle kommt aus app_metadata des JWT. Das kann nur serverseitig gesetzt werden, -- nie vom Client (anders als user_metadata). create or replace function public.is_admin() returns boolean language sql stable set search_path = '' as $$ select coalesce((select auth.jwt()) -> 'app_metadata' ->> 'role', '') = 'admin'; $$;