-- Best-effort-Rückbau auf die Schema-Form des alten Werberecht-Produkts -- (Stand nach Migration 0007) — reine Struktur, keine Daten. Ein -- kompletter Produktwechsel wird in der Praxis nicht zurückgerollt, -- diese Datei existiert nur, damit "migrate down" nicht bricht. DROP TABLE IF EXISTS antrag; DROP TABLE IF EXISTS werkzeug_sperre; DROP TABLE IF EXISTS werkzeug; DROP TABLE IF EXISTS abteilung; ALTER TABLE app_user DROP CONSTRAINT app_user_role_check; ALTER TABLE app_user ADD CONSTRAINT app_user_role_check CHECK (role IN ('creator', 'agentur', 'marke', 'kanzlei', 'admin')); ALTER TABLE account ADD COLUMN verified BOOLEAN NOT NULL DEFAULT false; CREATE TABLE submission ( id UUID PRIMARY KEY DEFAULT gen_random_uuid(), platform TEXT NOT NULL CHECK (platform IN ('instagram', 'tiktok', 'youtube', 'linkedin')), post_type TEXT NOT NULL, status TEXT NOT NULL DEFAULT 'draft' CHECK (status IN ('draft', 'checked', 'published', 'archived')), caption TEXT, created_at TIMESTAMPTZ NOT NULL DEFAULT now(), updated_at TIMESTAMPTZ NOT NULL DEFAULT now(), account_id UUID NOT NULL REFERENCES account (id) ); CREATE TABLE asset ( id UUID PRIMARY KEY DEFAULT gen_random_uuid(), submission_id UUID NOT NULL REFERENCES submission (id), kind TEXT NOT NULL CHECK (kind IN ('image', 'video', 'file')), path TEXT NOT NULL, sha256 TEXT NOT NULL, created_at TIMESTAMPTZ NOT NULL DEFAULT now(), purpose TEXT NOT NULL DEFAULT 'initial' CHECK (purpose IN ('initial', 'insights')) ); CREATE TRIGGER asset_append_only BEFORE UPDATE OR DELETE ON asset FOR EACH ROW EXECUTE FUNCTION forbid_update_delete(); CREATE TABLE extraction ( id UUID PRIMARY KEY DEFAULT gen_random_uuid(), submission_id UUID NOT NULL REFERENCES submission (id), payload JSONB NOT NULL, model_version TEXT NOT NULL, prompt_version TEXT NOT NULL, created_at TIMESTAMPTZ NOT NULL DEFAULT now() ); CREATE TRIGGER extraction_append_only BEFORE UPDATE OR DELETE ON extraction FOR EACH ROW EXECUTE FUNCTION forbid_update_delete(); CREATE TABLE finding ( id UUID PRIMARY KEY DEFAULT gen_random_uuid(), submission_id UUID NOT NULL REFERENCES submission (id), extraction_id UUID REFERENCES extraction (id), rule_id TEXT NOT NULL, rule_version INTEGER NOT NULL, severity TEXT NOT NULL CHECK (severity IN ('niedrig', 'mittel', 'hoch')), supersedes UUID REFERENCES finding (id), created_at TIMESTAMPTZ NOT NULL DEFAULT now(), title TEXT NOT NULL, fix TEXT NOT NULL, sources TEXT[] NOT NULL DEFAULT '{}' ); CREATE INDEX finding_supersedes_idx ON finding (supersedes) WHERE supersedes IS NOT NULL; CREATE TRIGGER finding_append_only BEFORE UPDATE OR DELETE ON finding FOR EACH ROW EXECUTE FUNCTION forbid_update_delete(); CREATE TABLE evidence_package ( id UUID PRIMARY KEY DEFAULT gen_random_uuid(), submission_id UUID NOT NULL REFERENCES submission (id), dossier_path TEXT NOT NULL, sha256 TEXT NOT NULL, timestamp_token BYTEA NOT NULL, created_at TIMESTAMPTZ NOT NULL DEFAULT now() ); CREATE TRIGGER evidence_package_append_only BEFORE UPDATE OR DELETE ON evidence_package FOR EACH ROW EXECUTE FUNCTION forbid_update_delete(); CREATE TABLE participant ( id UUID PRIMARY KEY DEFAULT gen_random_uuid(), submission_id UUID NOT NULL REFERENCES submission (id), role TEXT NOT NULL CHECK (role IN ('creator', 'agentur', 'marke', 'kanzlei')), name TEXT NOT NULL, vorgegeben BOOLEAN NOT NULL DEFAULT false, freigegeben BOOLEAN NOT NULL DEFAULT false, approved_at TIMESTAMPTZ, created_at TIMESTAMPTZ NOT NULL DEFAULT now() ); CREATE TABLE platform_connection ( id UUID PRIMARY KEY DEFAULT gen_random_uuid(), account_id UUID NOT NULL REFERENCES account (id), platform TEXT NOT NULL CHECK (platform IN ('instagram', 'tiktok')), platform_user_id TEXT NOT NULL, access_token TEXT NOT NULL, refresh_token TEXT NOT NULL DEFAULT '', expires_at TIMESTAMPTZ, connected_at TIMESTAMPTZ NOT NULL DEFAULT now(), UNIQUE (account_id, platform) );