-- =====================================================================
--  TeeCup — dedikert applikasjonsrolle + grants  (migrasjon 002)
-- =====================================================================
--  Kjøres av en admin/superbruker (f.eks. teeoff_admin).
--
--  HVORFOR: RLS beskytter IKKE mot en superbruker. Postgres lar superuser og
--  roller med BYPASSRLS hoppe fullstendig over alle policyer. Runtime-appen MÅ
--  derfor koble til med en rolle som verken er superuser eller har BYPASSRLS.
--  Denne rollen eier heller ikke tabellene (tabellene har dessuten FORCE RLS),
--  så den er alltid underlagt policyene.
--
--  Passord: sett det utenfra, ikke i denne fila. Kjør f.eks.:
--    psql -d teecup_db -v teecup_app_password="$(cat /path/to/secret)" \
--         -f 002_roles_and_grants.sql
--  (Aldri sjekk inn et ekte passord i git.)
-- =====================================================================

\set ON_ERROR_STOP on

-- --- Rolle (cluster-nivå: opprett bare hvis den ikke finnes) ----------
-- Eksplisitt NOSUPERUSER / NOBYPASSRLS — dette er hele poenget.
-- MERK: dette var opprinnelig en DO $$ ... $$-blokk med
-- "PASSWORD :'teecup_app_password'" inni. psql interpolerer ikke :'var'
-- inne i dollar-quoted strenger, så det feilet alltid med
-- "syntax error at or near ':'". Erstattet med \if/\else slik at
-- PASSWORD-linjen står som vanlig SQL utenfor $$ $$ (verifisert mot
-- scratch-database, se test_isolation.sql-kjøringen).
SELECT EXISTS (SELECT 1 FROM pg_roles WHERE rolname = 'teecup_app') AS teecup_app_exists \gset
\if :teecup_app_exists
    \echo 'teecup_app finnes allerede, hopper over CREATE ROLE'
\else
    CREATE ROLE teecup_app
        LOGIN
        PASSWORD :'teecup_app_password'
        NOSUPERUSER
        NOCREATEDB
        NOCREATEROLE
        NOBYPASSRLS
        INHERIT;
\endif

-- --- Grants (kjøres mens du er koblet til teecup_db) ------------------
GRANT CONNECT ON DATABASE teecup_db TO teecup_app;
GRANT USAGE   ON SCHEMA public       TO teecup_app;

-- Runtime-appen trenger vanlig DML på domenetabellene, men skal IKKE kunne
-- endre skjema eller policyer (det følger av at den ikke eier tabellene og
-- ikke er superuser).
GRANT SELECT, INSERT, UPDATE, DELETE ON ALL TABLES    IN SCHEMA public TO teecup_app;
GRANT USAGE, SELECT                  ON ALL SEQUENCES  IN SCHEMA public TO teecup_app;

-- Samme rettigheter automatisk på fremtidige tabeller/sekvenser laget av
-- migrasjonseieren.
ALTER DEFAULT PRIVILEGES IN SCHEMA public
    GRANT SELECT, INSERT, UPDATE, DELETE ON TABLES    TO teecup_app;
ALTER DEFAULT PRIVILEGES IN SCHEMA public
    GRANT USAGE, SELECT                  ON SEQUENCES  TO teecup_app;

-- MERK: teecup_app får bevisst IKKE rettigheter til å endre RLS. Bootstrap av
-- nye organisasjoner (INSERT i organization) skjer via en privilegert sti i
-- auth-laget, ikke med runtime-rollen.
