-- Migration 048: P-06 Upload-Einwilligungsdialog -- Append-only Deklarations-Log + Schnellfelder in media_assets -- Alle bestehenden Medien erhalten rights_status = 'legacy_unreviewed' -- Deklarations-Log (append-only, wird nie geaendert oder geloescht) CREATE TABLE IF NOT EXISTS media_asset_rights_declarations ( id SERIAL PRIMARY KEY, media_asset_id INT NOT NULL REFERENCES media_assets(id) ON DELETE CASCADE, declared_by_profile_id INT REFERENCES profiles(id) ON DELETE SET NULL, declared_at TIMESTAMPTZ NOT NULL DEFAULT NOW(), -- Kontext der Erklaerung action_type VARCHAR(50) NOT NULL CHECK (action_type IN ( 'upload', -- Erstupload 'promote_club', -- Promotion zu club 'promote_official', -- Promotion zu official 're_declaration', -- Freiwillige Nacherklaerung 'legacy_re_declaration' -- Altmedium: erste Erklaerung nachgereicht )), target_visibility VARCHAR(32) NOT NULL CHECK (target_visibility IN ('private', 'club', 'official')), -- Textversion der Erklaerung; 'p06-v1-conservative' = konservative Erstannahmen -- VORLAEUTIG: Texte noch nicht juristisch geprueft declaration_version VARCHAR(40) NOT NULL DEFAULT 'p06-v1-conservative', -- Pflichtfeld (alle Sichtbarkeiten, alle Aktionen) rights_holder_confirmed BOOLEAN NOT NULL, -- Personen (konservative Annahme: immer abgefragt, auch bei 'private') contains_identifiable_persons BOOLEAN, person_consent_confirmed BOOLEAN, -- Pflicht wenn contains_identifiable_persons = true -- Minderjaehrige contains_minors BOOLEAN, parental_consent_confirmed BOOLEAN, -- Pflicht wenn contains_minors = true -- Drittmaterial contains_music BOOLEAN, music_rights_confirmed BOOLEAN, -- Pflicht wenn contains_music = true contains_third_party_content BOOLEAN, third_party_rights_confirmed BOOLEAN, -- Pflicht wenn contains_third_party_content = true created_at TIMESTAMPTZ NOT NULL DEFAULT NOW() ); CREATE INDEX IF NOT EXISTS idx_mard_asset ON media_asset_rights_declarations (media_asset_id); CREATE INDEX IF NOT EXISTS idx_mard_profile ON media_asset_rights_declarations (declared_by_profile_id); CREATE INDEX IF NOT EXISTS idx_mard_action_type ON media_asset_rights_declarations (action_type); -- Schnellfelder in media_assets (kein Ersatz fuer den Log, nur fuer effiziente Abfragen) ALTER TABLE media_assets ADD COLUMN IF NOT EXISTS rights_status VARCHAR(32) NOT NULL DEFAULT 'legacy_unreviewed' CHECK (rights_status IN ('legacy_unreviewed', 'declared', 'blocked')), ADD COLUMN IF NOT EXISTS rights_declared_for_visibility VARCHAR(32) CHECK (rights_declared_for_visibility IN ('private', 'club', 'official')), ADD COLUMN IF NOT EXISTS rights_declared_at TIMESTAMPTZ; -- Bestehende Medien: explicit legacy_unreviewed setzen (redundant zum DEFAULT, zur Klarheit) UPDATE media_assets SET rights_status = 'legacy_unreviewed' WHERE rights_status = 'legacy_unreviewed'; -- no-op, setzt Default explizit COMMENT ON TABLE media_asset_rights_declarations IS 'P-06: Append-only Erklaerungslog fuer Upload-Einwilligungen. ' 'Eintraege werden nie geaendert. Juristische Validierung der Felder und Texte steht aus.'; COMMENT ON COLUMN media_assets.rights_status IS 'P-06: legacy_unreviewed = Altbestand ohne P-06-Erklaerung; ' 'declared = gueltige Erklaerung fuer rights_declared_for_visibility; ' 'blocked = durch Admin gesperrt (P-11-Schnittstelle).';