-- Mandantentrennung: ein account ist der Mandant (Creator, Agentur, -- Marke oder Kanzlei als eigene Organisation), app_user ist ein Login -- innerhalb eines accounts. session ist bewusst eine eigene Tabelle -- statt signierter, zustandsloser Tokens — ein Logout muss eine -- Sitzung wirklich beenden können, nicht nur clientseitig "vergessen" -- werden. CREATE TABLE account ( id UUID PRIMARY KEY DEFAULT gen_random_uuid(), name TEXT NOT NULL, created_at TIMESTAMPTZ NOT NULL DEFAULT now() ); -- "app_user" statt "user", da user ein reserviertes Wort in SQL ist. CREATE TABLE app_user ( id UUID PRIMARY KEY DEFAULT gen_random_uuid(), account_id UUID NOT NULL REFERENCES account (id), email TEXT NOT NULL UNIQUE, password_hash TEXT NOT NULL, role TEXT NOT NULL CHECK (role IN ('creator', 'agentur', 'marke', 'kanzlei')), created_at TIMESTAMPTZ NOT NULL DEFAULT now() ); CREATE TABLE session ( token TEXT PRIMARY KEY, user_id UUID NOT NULL REFERENCES app_user (id), expires_at TIMESTAMPTZ NOT NULL, created_at TIMESTAMPTZ NOT NULL DEFAULT now() ); -- Jeder Beitrag gehört ab jetzt zu genau einem Mandanten. NOT NULL ohne -- Default ist hier sicher, weil noch keine Submission-Zeilen aus der -- Zeit vor Auth existieren (kein Kunde live). ALTER TABLE submission ADD COLUMN account_id UUID NOT NULL REFERENCES account (id);