-- P-13: Content-Melde-Backend -- Meldungen rechtswidriger Inhalte (DSA-konformes Meldeverfahren, KRIT-03) -- -- Architektur: Diese Tabelle traegt alle fachlichen Report-Daten. -- Die bestehende Admin-Inbox (InboxPage.jsx, GET /api/me/inbox/join-requests) -- wird um einen zweiten Abschnitt erweitert, der Content-Reports anzeigt. -- Keine separate Admin-Queue, keine generische inbox_items-Tabelle. CREATE TABLE IF NOT EXISTS content_reports ( id SERIAL PRIMARY KEY, -- Ziel der Meldung (erweiterbar auf weitere Typen) target_type VARCHAR(20) NOT NULL DEFAULT 'media_asset' CHECK (target_type IN ('media_asset', 'exercise')), target_id INTEGER NOT NULL, -- Meldungsinhalt report_reason VARCHAR(50) NOT NULL CHECK (report_reason IN ( 'copyright', 'image_rights', 'privacy', 'minors', 'illegal_content', 'youth_protection', 'offensive_content', 'other' )), report_description TEXT NOT NULL, -- Meldende Person (Name + E-Mail Pflicht; Profil optional bei eingeloggten Nutzern) reporter_name VARCHAR(200) NOT NULL, reporter_email VARCHAR(200) NOT NULL, reporter_profile_id INTEGER REFERENCES profiles(id) ON DELETE SET NULL, -- Gutglaubenserklärung (Pflicht) good_faith_confirmed BOOLEAN NOT NULL DEFAULT FALSE, -- Automatische Priorisierung (high fuer minors/youth_protection/illegal_content) priority VARCHAR(20) NOT NULL DEFAULT 'normal' CHECK (priority IN ('high', 'normal')), -- Workflow-Status status VARCHAR(30) NOT NULL DEFAULT 'submitted' CHECK (status IN ( 'submitted', 'under_review', 'resolved_no_action', 'resolved_legal_hold', 'rejected_invalid' )), -- Bearbeitung assigned_to_profile_id INTEGER REFERENCES profiles(id) ON DELETE SET NULL, reviewed_by_profile_id INTEGER REFERENCES profiles(id) ON DELETE SET NULL, reviewed_at TIMESTAMP, resolution_note TEXT, -- Zeitstempel submitted_at TIMESTAMP DEFAULT NOW(), created_at TIMESTAMP DEFAULT NOW(), updated_at TIMESTAMP DEFAULT NOW() ); -- Indices fuer Admin-Liste CREATE INDEX IF NOT EXISTS idx_content_reports_status_created ON content_reports (status, created_at DESC); CREATE INDEX IF NOT EXISTS idx_content_reports_target ON content_reports (target_type, target_id); CREATE INDEX IF NOT EXISTS idx_content_reports_priority ON content_reports (priority, status, created_at DESC);