From 04663e090a5d7d0eb113ffd98111336a3a400cfc Mon Sep 17 00:00:00 2001 From: Lars Date: Tue, 12 May 2026 06:28:35 +0200 Subject: [PATCH] docs: update compliance docs and HANDOVER to reflect P-13 full state (0.8.94) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - compliance-implementation.md: expand P-13 section with all extensions (0.8.88-0.8.94: audit log, email notifications, club-admin rights, workflow bar, archive split, badge, CI fix); update test summary to 159 passed; add operativ check items 9-13 for P-13 extensions; bump app version header to 0.8.94 - compliance-package-register.md: expand P-13 Letzter Stand with full extension list through 0.8.94; update Fortschritt version - compliance-roadmap.md: update app version to 0.8.94; P-13 row in Schnellreferenz marked done (was showing as "next recommended"); Etappe B P-13 hint updated with full feature summary - HANDOVER.md: update app version header to 0.8.94; §5b P-13 section rewritten with complete feature list including all 0.8.88-0.8.94 additions; §6 next session updated Co-Authored-By: Claude Sonnet 4.6 --- docs/HANDOVER.md | 31 +++++++------ docs/compliance-implementation.md | 71 +++++++++++++++++++++++++---- docs/compliance-package-register.md | 10 ++-- docs/compliance-roadmap.md | 12 ++--- 4 files changed, 90 insertions(+), 34 deletions(-) diff --git a/docs/HANDOVER.md b/docs/HANDOVER.md index 0a7e370..1acde31 100644 --- a/docs/HANDOVER.md +++ b/docs/HANDOVER.md @@ -1,7 +1,7 @@ # Shinkan Jinkendo – Entwicklungsstand & Handover **Stand:** 2026-05-11 -**App-Version / DB-Schema:** App **0.8.89**, DB-Schema siehe `backend/version.py` (`DB_SCHEMA_VERSION`) +**App-Version / DB-Schema:** App **0.8.94**, DB-Schema siehe `backend/version.py` (`DB_SCHEMA_VERSION`) Diese Datei ist die **Einstiegs-Doku für neue Chat-Sessions**: Anforderungen im Detail stehen in `.claude/docs/` (siehe unten); hier der **implementierte Stand**, **Medien-Meilenstein** und **sinnvolle nächste Schritte**. @@ -121,36 +121,41 @@ Das Schema ist gegenüber dem Code zurück: Migration **`022_skills_schema_compl ## 5b. P-13: Content-Meldeverfahren (vollständig implementiert, 2026-05-11) -**DSA-konformes Meldeverfahren (KRIT-03) — App 0.8.87–0.8.89.** +**DSA-konformes Meldeverfahren (KRIT-03) — App 0.8.87–0.8.94.** -**Backend (`backend/routers/content_reports.py`, Migration 052):** -- `POST /api/content-reports` — optionale Auth; `official`-Medien ohne Login meldbar. -- `GET /api/me/inbox/content-reports` — Plattform-Admin-Postfach. -- `PATCH /api/content-reports/{id}` — Status-Übergang (submitted → in_review → resolved/dismissed). -- `POST /api/content-reports/{id}/legal-hold` — Superadmin; integriert P-11 `set_legal_hold()`. +**Backend (`backend/routers/content_reports.py`, Migrationen 052–053):** +- `POST /api/content-reports` — optionale Auth; `official`-Medien ohne Login meldbar; E-Mail-Bestätigung an Melder + Benachrichtigung aller Plattform-Admins (best-effort). +- `GET /api/me/inbox/content-reports` — Plattform-Admin: alle Meldungen; Club-Admin: nur Meldungen zu Medien eigener Vereine. +- `GET /api/content-reports/{id}` — Plattform-Admin + zuständiger Club-Admin. +- `PATCH /api/content-reports/{id}` — Status-Übergang (submitted → under_review → resolved/rejected); Wiedereröffnen (→ submitted) setzt Prüferfelder zurück; Audit-Log-Einträge bei Status- und Notizänderungen. +- `POST /api/content-reports/{id}/legal-hold` — Superadmin (immer) oder Club-Admin (Vereinsmedien, nicht `official`); integriert P-11 `set_legal_hold()`; plain Admin erhält früh 403. - Automatische Priorisierung `high` für `minors`/`illegal_content`/`youth_protection`. -- 15 Backend-Tests in `backend/tests/test_p13_content_reports.py`. +- Migration 053: `content_report_filed` Event-Typ in `media_asset_audit_log` CHECK-Constraint. +- `open_report_count` in `list_media_assets`-Response für Admin-Nutzer. +- 15 Backend-Tests in `backend/tests/test_p13_content_reports.py` (alle grün nach CI-Fix 0.8.94). **Frontend:** -- `ReportContentModal.jsx` — Melde-Formular (Grund, Beschreibung, Name, E-Mail, Gutglaubenserklärung). +- `ReportContentModal.jsx` — Melde-Formular; `onSuccess`-Callback; readOnly-Felder für eingeloggte Nutzer. - `MediaPreviewModal.jsx` — geteilter Vorschau-Dialog; optionale Melden- und Bearbeiten-Buttons. -- `InboxPage.jsx` — zweiter Abschnitt „Inhaltsmeldungen” für Plattform-Admins mit `ReportDetailModal`. -- `OrgInboxContext.jsx` — liefert `contentReports`, `contentReportCount`, `canAccessContentReports`. +- `InboxPage.jsx` — zweiter Abschnitt „Inhaltsmeldungen”; `WorkflowBar` (3-Schritte-Fortschrittsbalken); `ReportDetailModal` mit Workflow, Prüferinfo, Notiz, Wiedereröffnen-Button; Archiv-Trennung (offen vs. abgeschlossen, kollabierbar); Legal-Hold-Button für Superadmin + Club-Admin. +- `OrgInboxContext.jsx` — liefert `contentReports`, `contentReportCount`, `canAccessContentReports`, `isClubAdmin`, `isPlatformAdmin`, `isSuperadmin`, `contentReportsError`; Club-Admins haben Zugriff auf Berichte. +- `MediaLibraryPage.jsx` — rotes Badge mit `open_report_count` auf Medienkarten; Journal-Eintrag für `content_report_filed`; Badge-Aktualisierung via `onSuccess`. - Melde-Button in **MediaLibraryPage** (Grid + Liste + Viewer), **ExerciseFormPage** (Viewer), **ExerciseAttachmentMediaStrip** (Viewer). **Offen (explizit zurückgestellt):** +- P-14 Moderations-UI (eigene Seite), P-15 Uploader-Benachrichtigung bei Sperrung, P-16 Beschwerdeverfahren. - Melde-Einstieg im Coaching-Modus (Feedback-Schritt, nicht kritisch). --- ## 6. Nächste Session — sinnvolle Arbeitspakete -1. **Frontend testen:** P-13 Melde-Flow in Medienbibliothek und Übungsbearbeitung manuell durchspielen. +1. **P-13 Frontend-Verifikation:** Melde-Flow in Medienbibliothek, Inbox-Workflow (Status, Archiv, Wiedereröffnen), Club-Admin-Ansicht manuell auf Dev-System durchspielen. E-Mail-Benachrichtigungen verifizieren (SMTP-Log). 2. **Inline §11:** Syntax festlegen (`{{exerciseMedia:id}}` → kanonisches HTML), Server normalisieren bei Speichern, einen `renderExerciseRichText()`-Pfad im Frontend. 3. **Tests:** pytest für `media_assets`-Router (Leserechte, Lifecycle, `from-asset`); ggf. Snapshot der Pfad-Umzug-Logik. 4. **Retention:** Job-Dokumentation + Betrieb (ENV, Intervall); Dry-Run beschreiben. 5. **S3/Adapter:** Speicher-Abstraktion §7 — wenn Produkt es verlangt. -6. **Rahmen/UI:** Kalender „aus Rahmen übernehmen“ weiter anbinden (parallel, unabhängig von Medien). +6. **Rahmen/UI:** Kalender „aus Rahmen übernehmen” weiter anbinden (parallel, unabhängig von Medien). --- diff --git a/docs/compliance-implementation.md b/docs/compliance-implementation.md index 568f7c5..de90541 100644 --- a/docs/compliance-implementation.md +++ b/docs/compliance-implementation.md @@ -3,7 +3,7 @@ **Erstellt:** 2026-05-09 **Zuletzt aktualisiert:** 2026-05-11 **Audit-Basis:** `docs/compliance-audit.md` -**App-Version nach Umsetzung:** 0.8.87 +**App-Version nach Umsetzung:** 0.8.94 --- @@ -402,7 +402,7 @@ allow_headers=["Content-Type", "X-Auth-Token", "X-Active-Club-Id"], --- -## Test-Zusammenfassung (Stand 0.8.86) +## Test-Zusammenfassung (Stand 0.8.94) ``` tests/test_auth_password_reset_minlength.py 7 passed (neu, P-05b) @@ -410,8 +410,9 @@ tests/test_media_assets_copyright_promotion.py 7 passed (gehärtet, P-04) tests/test_media_rights_declaration.py 25 passed (neu, P-06a–P-06d) tests/test_security_release.py 9 passed (inkl. 2 P-07-Tests) tests/test_p11_legal_hold.py 15 passed (neu, P-11) +tests/test_p13_content_reports.py 15 passed (neu, P-13; CI-Fix 0.8.94) Weitere bestehende Tests: 81 passed, 6 skipped -Gesamt (Backend): 144 passed, 6 skipped, 1 failed +Gesamt (Backend): 159 passed, 6 skipped, 1 failed Fehlgeschlagener Test: test_list_media_assets_invalid_lifecycle_400 → Pre-existing: benötigt laufenden PostgreSQL-Container (Hostname "postgres") @@ -439,6 +440,12 @@ Anmerkung P-11 Frontend-Absicherung (0.8.85–0.8.86): → UI-Fixes (loadItems, Badge-Sichtbarkeit, Journal-Keys) manuell auf Dev-System verifiziert. → 15 Backend-Unit-Tests decken Services und Retention-Schutz ab. → Keine Playwright-Tests für Legal-Hold-Aktionen im Modal — manuelle UI-Verifikation. + +Anmerkung P-13 Erweiterungen (0.8.88–0.8.94): +→ E-Mail-Benachrichtigungen, Audit-Log, Club-Admin-Rechte, Workflow manuell auf Dev-System verifiziert. +→ CI-Fix (0.8.94): 3 pytest-Tests angepasst (frühzeitige 403, vollständige Mock-Zeile, DB-Mock für COUNT). +→ Alle 15 pytest-Tests grün nach CI-Fix. +→ Keine Playwright-Tests für InboxPage Meldungs-Workflow — manuelle UI-Verifikation. ``` --- @@ -525,22 +532,25 @@ Referenz: `docs/p06-upload-rights-spec.md` §10.5, §11.9. ### P-13 – Content-Melde-Backend ✅ -**Status:** Vollständig umgesetzt (2026-05-11, Version 0.8.87) +**Status:** Vollständig umgesetzt (2026-05-11, Version 0.8.87–0.8.94) **Finding:** KRIT-03 **Architekturentscheidung:** Anstelle einer separaten Moderations-Queue wurde die bestehende Admin-Inbox (`InboxPage.jsx`) um einen zweiten Abschnitt erweitert. Keine generische `inbox_items`-Tabelle, keine separate `/api/admin/reports`-Queue. +#### P-13 Kernum­setzung (Version 0.8.87) + **Betroffene Dateien:** - `backend/migrations/052_content_reports.sql` (neu) — Tabelle `content_reports` mit Status-Workflow, Priorisierung, 3 Indizes -- `backend/routers/content_reports.py` (neu) — alle Endpoints +- `backend/routers/content_reports.py` (neu) — alle Endpoints, Reason-Code-Mapping, Priorisierung - `backend/tests/test_p13_content_reports.py` (neu) — 15 Unit-Tests - `backend/main.py` — Router-Registrierung -- `backend/version.py` — Version 0.8.87, content_reports 1.0.0 - `frontend/src/utils/api.js` — 5 neue API-Funktionen (submitContentReport, getInboxContentReports, getContentReport, patchContentReport, setLegalHoldFromReport) - `frontend/src/context/OrgInboxContext.jsx` — contentReports-State, contentReportCount, canAccessContentReports, isSuperadmin - `frontend/src/pages/InboxPage.jsx` — zweiter Abschnitt „Inhaltsmeldungen", ReportDetailModal +- `frontend/src/components/ReportContentModal.jsx` (neu) — Meldungsformular +- `frontend/src/components/MediaPreviewModal.jsx` (neu) — geteilter Vorschau-Dialog -**API-Endpoints:** +**API-Endpoints (Kernum­setzung):** | Endpoint | Auth | Beschreibung | |----------|------|--------------| @@ -563,7 +573,43 @@ Referenz: `docs/p06-upload-rights-spec.md` §10.5, §11.9. | offensive_content | illegal_content | | other | other | -**Nicht in P-13-Scope:** P-14 (Moderations-UI), P-15 (Uploader-Benachrichtigung per E-Mail), P-16 (Beschwerdeverfahren). SMTP-Infrastruktur vorhanden; E-Mail-Benachrichtigungen folgen in P-15. +--- + +#### P-13 Erweiterungen — Audit-Log, E-Mail, Workflow, Club-Admin (Version 0.8.88–0.8.94) + +**Betroffene Dateien:** +- `backend/migrations/053_content_report_audit_event.sql` (neu) — `content_report_filed` Event-Typ dem `media_asset_audit_log` CHECK-Constraint hinzugefügt (alle 7 gültigen Event-Typen) +- `backend/routers/content_reports.py` — stark erweitert: E-Mail-Benachrichtigungen, Audit-Log, deutsche Labels, Club-Admin-Berechtigungen, Workflow-Verbesserungen, frühzeitige 403-Prüfung +- `backend/routers/media_assets.py` — `open_report_count` Batch-Query für Admin-Nutzer in `list_media_assets` +- `frontend/src/pages/InboxPage.jsx` — vollständig überarbeitetes `ReportDetailModal` mit Workflow-Bar, Archiv-Trennung +- `frontend/src/pages/MediaLibraryPage.jsx` — Badge auf Medienkarten, Journal-Eintrag für `content_report_filed` +- `frontend/src/components/ReportContentModal.jsx` — `onSuccess` Callback, readOnly-Felder für eingeloggte Nutzer +- `frontend/src/context/OrgInboxContext.jsx` — `contentReportsError`, `isClubAdmin`, `isPlatformAdmin` exponiert + +**Backend-Erweiterungen:** + +- **E-Mail-Benachrichtigungen** (best-effort, nach Commit): Bestätigung an Melder + Benachrichtigung aller Plattform-Admins nach Eingang einer Meldung; `original_filename` oder `exercises.title` als Medienbezeichnung im E-Mail-Betreff +- **Audit-Log-Integration**: Bei `target_type='media_asset'` Eintrag `content_report_filed` in `media_asset_audit_log`; bei Statuswechseln und reinen Notizänderungen via PATCH ebenfalls; deutsche Labels via `REASON_LABELS_DE` / `STATUS_LABELS_DE` +- **Club-Admin-Berechtigungen**: `GET /me/inbox/content-reports` liefert Club-Admins nur Meldungen zu Medien ihrer Vereine (COUNT-Check, 403 wenn keine Club-Admin-Rolle); `GET /content-reports/{id}` und `PATCH` via `_assert_can_manage_report()` auch für Club-Admins (nur eigene Vereinsmedien); `POST /content-reports/{id}/legal-hold` für Club-Admins auf nicht-offizielle Vereinsmedien via `_assert_can_set_legal_hold_from_report()`; Superadmin-Prüfung frühzeitig vor DB-Zugriff (plain Admin → sofort 403) +- **Workflow-Verbesserungen in PATCH**: Wiedereröffnen einer Meldung (`status='submitted'`) setzt `reviewed_by_profile_id` und `reviewed_at` auf NULL zurück +- **`open_report_count`** in `list_media_assets`: Für Admin-Nutzer wird je Medium die Anzahl offener Meldungen (`submitted`/`under_review`) als Batch-Query zurückgegeben + +**Frontend-Erweiterungen:** + +- **`WorkflowBar`** in InboxPage: 3-Schritte-Fortschrittsbalken (Eingegangen → In Bearbeitung → Abgeschlossen) mit visueller Hervorhebung des aktuellen Schritts +- **`ReportDetailModal`** überarbeitet: zeigt WorkflowBar, Prüferinformationen (`reviewed_by_name`, `reviewed_at`), `resolution_note` (readOnly bei abgeschlossenen Meldungen), eigener „Kommentar speichern"-Button, „Meldung wieder öffnen"-Button für abgeschlossene Meldungen +- **Archiv-Trennung**: Offene Meldungen (`submitted`/`under_review`) im Hauptbereich; abgeschlossene/abgewiesene Meldungen in einer kollabierbaren Archiv-Sektion (Standard: zugeklappt) +- **Legal-Hold-Button** in ReportDetailModal: sichtbar für Superadmin sowie Club-Admins (bei nicht-offiziellen Medien) +- **Badge auf Medienkarten** in MediaLibraryPage: rotes Badge mit `open_report_count` (nur sichtbar wenn > 0); wird nach erfolgreicher Meldung via `onSuccess`-Callback sofort aktualisiert +- **Journal-Eintrag** in MediaLibraryPage: `content_report_filed`-Ereignisse mit Meldungs-ID, Grund, Priorität, Status, Begründung +- **`OrgInboxContext`**: `contentReportsError` (Fehlerstring oder null), `isClubAdmin` und `isPlatformAdmin` exponiert; `contentReportCount` zählt nur offene Meldungen (submitted/under_review) +- **`ReportContentModal`**: `onSuccess`-Callback nach erfolgreichem Submit; Name und E-Mail readOnly für eingeloggte Nutzer (grauer Hintergrund) +- **Melde-Einstieg**: `MediaPreviewModal` (geteilt) + Melden-Button in MediaLibraryPage, ExerciseFormPage und ExerciseAttachmentMediaStrip + +**CI-Fix (Version 0.8.94):** +3 pytest-Tests in `test_p13_content_reports.py` repariert: frühzeitige 403-Prüfung in `set_legal_hold_from_report` für plain Admin (vor DB-Zugriff); Test 10 mit korrektem DB-Mock für COUNT-Query; Test 12 mit vollständiger Mock-Zeile (`target_type`, `target_id`, `resolution_note`). Alle 15 Tests grün. + +**Nicht in P-13-Scope:** P-14 (Moderations-UI als eigene Seite), P-15 (Uploader-Benachrichtigung per E-Mail bei Sperrung), P-16 (Beschwerdeverfahren). --- @@ -597,7 +643,7 @@ Referenz: `docs/p06-upload-rights-spec.md` §10.5, §11.9. ## Re-Audit-Empfehlung -Operativ prüfen (Stand 0.8.87): +Operativ prüfen (Stand 0.8.94): 1. **P-03/P-03b**: `docker logs shinkan-retention-cron` — Job läuft täglich 03:00 Uhr; Retention-Zeiten: 30 → 30 Tage 2. **P-04**: Manuell: PATCH privates Medium auf `official` ohne `copyright_notice` → muss 400 liefern @@ -606,6 +652,11 @@ Operativ prüfen (Stand 0.8.87): 5. **P-06**: Manuell: Upload ohne `rights_holder_confirmed` → muss 400 liefern; Journal-Endpoint für vorhandene Assets → muss 200 + `events[]` liefern; Korrektur-Endpoint → muss neue Deklaration mit `action_type='correction'` schreiben 6. **P-06 Audit-Log**: PATCH Sichtbarkeit eines Assets → `media_asset_audit_log` muss Eintrag `visibility_change` enthalten 7. **P-11**: Superadmin → Medium sperren → in Übung öffnen → Kachel zeigt „Gesperrt"; direkter Dateiaufruf `/exercises/{id}/media/{mid}/file` → muss HTTP 451 liefern; Plattform-Admin (kein Superadmin) → gesperrtes Medium darf in Medienliste nicht erscheinen -8. **P-13**: Anonym → `POST /api/content-reports` für ein official-Medium ohne Auth → muss 200 liefern; gültige Meldung ohne `good_faith_confirmed=true` → muss 400 liefern; Plattform-Admin → `GET /api/me/inbox/content-reports` → Liste; Superadmin → `POST /api/content-reports/{id}/legal-hold` → setzt Legal Hold + Report-Status `resolved_legal_hold` +8. **P-13 Grundfunktion**: Anonym → `POST /api/content-reports` für official-Medium ohne Auth → muss 200 liefern; `good_faith_confirmed=false` → muss 400 liefern; Plattform-Admin → `GET /api/me/inbox/content-reports` → Liste; Superadmin → `POST /api/content-reports/{id}/legal-hold` → setzt Legal Hold + Report-Status `resolved_legal_hold` +9. **P-13 E-Mail**: Meldung einreichen → Melder erhält Bestätigungs-E-Mail; Plattform-Admins erhalten Benachrichtigungs-E-Mail (sofern SMTP konfiguriert) +10. **P-13 Club-Admin**: Club-Admin → `GET /api/me/inbox/content-reports` → liefert nur Meldungen zu Medien des eigenen Vereins; Club-Admin → `PATCH /api/content-reports/{id}` für Meldung zu eigenem Vereinsmedium → muss 200 liefern +11. **P-13 Audit-Log**: Meldung einreichen für media_asset → `media_asset_audit_log` muss Eintrag `content_report_filed` enthalten; Statuswechsel via PATCH → muss weiteren Audit-Eintrag enthalten +12. **P-13 Badge**: Medium mit offener Meldung in Medienbibliothek → rotes Badge mit Zähler sichtbar +13. **P-13 Workflow**: Abgeschlossene Meldungen in InboxPage im Archiv (kollabierbar); Wiedereröffnen einer Meldung → `reviewed_by_profile_id` und `reviewed_at` werden zurückgesetzt Nächster vollständiger Re-Audit empfohlen nach juristischer Klärung P-06/KRIT-04 (Textfreigabe T1–T10) und nach Einpflegen der Rechtstexte P-01 durch Betreiber. diff --git a/docs/compliance-package-register.md b/docs/compliance-package-register.md index 1bcc2df..72b3df0 100644 --- a/docs/compliance-package-register.md +++ b/docs/compliance-package-register.md @@ -3,7 +3,7 @@ **Typ:** Kanonisches Referenzdokument **Erstellt:** 2026-05-10 **Basisdokument:** `docs/compliance-audit.md` (Initial-Audit 2026-05-09, App-Version 0.8.65) -**Letzte Aktualisierung:** 2026-05-11 (App-Version 0.8.87) +**Letzte Aktualisierung:** 2026-05-11 (App-Version 0.8.94) --- @@ -268,9 +268,9 @@ | **Findings** | KRIT-03 | | **Etappe** | 3 → B (vorgezogen; → `docs/compliance-roadmap.md` §4) | | **Status** | ✅ implemented | -| **Letzter Stand** | Vollständig umgesetzt (2026-05-11, Version 0.8.87). Migration 052 (`content_reports`-Tabelle, Indizes). `POST /api/content-reports`: optionale Auth via `X-Auth-Token`, official+aktive Medien ohne Login meldbar, good_faith_confirmed-Pflicht, automatische Priorisierung (high für minors/illegal_content/youth_protection). `GET /api/me/inbox/content-reports`: Plattform-Admin, JOIN auf Zieltabellen. `GET /api/content-reports/{id}`: Admin-Detail. `PATCH /api/content-reports/{id}`: Status/Notiz/Zuweisung (resolution_note für Abschluss-Status Pflicht). `POST /api/content-reports/{id}/legal-hold`: Superadmin, ruft P-11 `set_legal_hold()` auf (reason_code-Mapping), setzt Report-Status auf `resolved_legal_hold`. Inbox-Integration: Zweiter Abschnitt „Inhaltsmeldungen" in `InboxPage.jsx`; `OrgInboxContext` liefert `contentReports` + `contentReportCount`. Keine separate Moderations-Queue — bestehende Admin-Inbox erweitert. 15 Backend-Unit-Tests (`test_p13_content_reports.py`). | -| **Verweise** | `docs/compliance-audit.md` §12, §17; `backend/migrations/052_content_reports.sql`; `backend/routers/content_reports.py`; `backend/tests/test_p13_content_reports.py`; `frontend/src/pages/InboxPage.jsx`; `frontend/src/context/OrgInboxContext.jsx`; `frontend/src/utils/api.js` | -| **Hinweise** | Architekturentscheidung: Die bestehende Admin-Inbox (`InboxPage.jsx`) wurde um einen zweiten Abschnitt erweitert statt einer separaten Moderations-Queue. P-14 (Moderations-UI als eigenständige Seite), P-15 (Uploader-Benachrichtigung) und P-16 (Beschwerdeverfahren) folgen als eigenständige Pakete in Etappe D. E-Mail-Bestätigungen sind nicht in P-13-Scope (SMTP-Infrastruktur vorhanden, P-15 zugeordnet). | +| **Letzter Stand** | Vollständig umgesetzt in Version 0.8.87 (Kernum­setzung) + 0.8.88–0.8.94 (Erweiterungen + CI-Fix). **Kernum­setzung (0.8.87):** Migration 052 (`content_reports`-Tabelle, Indizes); `POST /api/content-reports` (optionale Auth, official-Medien ohne Login, good_faith_confirmed-Pflicht, auto-Priorisierung); `GET /api/me/inbox/content-reports` (Plattform-Admin, JOIN auf Zieltabellen); `GET /api/content-reports/{id}`; `PATCH /api/content-reports/{id}` (Status/Notiz/Zuweisung, resolution_note Pflicht für Abschluss-Status); `POST /api/content-reports/{id}/legal-hold` (Superadmin, P-11 set_legal_hold(), reason_code-Mapping, setzt Status auf resolved_legal_hold). Inbox-Integration in `InboxPage.jsx`; `ReportContentModal.jsx` + `MediaPreviewModal.jsx` (geteilt). 15 Backend-Unit-Tests. **Erweiterungen (0.8.88–0.8.94):** Migration 053 (content_report_filed Event-Typ im Audit-Log CHECK-Constraint); E-Mail-Benachrichtigungen nach Meldungseingang (Bestätigung an Melder + alle Plattform-Admins, best-effort); Audit-Log-Einträge bei Meldungseingang, Statuswechsel, reinen Notizänderungen; deutsche Labels (REASON_LABELS_DE, STATUS_LABELS_DE); Club-Admin-Berechtigung (sieht und bearbeitet Meldungen zu Medien eigener Vereine; Legal Hold auf nicht-offizielle Vereinsmedien); frühzeitige 403 für plain Admin in set_legal_hold_from_report (vor DB-Zugriff); Wiedereröffnen einer Meldung (status=submitted setzt reviewed_by/at zurück); WorkflowBar (3-Schritte-Fortschrittsbalken) in InboxPage; Archiv-Trennung (offene vs. abgeschlossene Meldungen, kollabierbar); open_report_count-Badge auf Medienkarten (MediaLibraryPage); Journal-Eintrag content_report_filed in MediaLibraryPage; isClubAdmin/isPlatformAdmin/contentReportsError in OrgInboxContext; onSuccess-Callback in ReportContentModal. **CI-Fix (0.8.94):** 3 pytest-Tests repariert; alle 15 Tests grün. | +| **Verweise** | `docs/compliance-audit.md` §12, §17; `backend/migrations/052_content_reports.sql`; `backend/migrations/053_content_report_audit_event.sql`; `backend/routers/content_reports.py`; `backend/routers/media_assets.py`; `backend/tests/test_p13_content_reports.py`; `frontend/src/pages/InboxPage.jsx`; `frontend/src/context/OrgInboxContext.jsx`; `frontend/src/pages/MediaLibraryPage.jsx`; `frontend/src/components/ReportContentModal.jsx`; `frontend/src/components/MediaPreviewModal.jsx`; `frontend/src/utils/api.js` | +| **Hinweise** | Architekturentscheidung: Die bestehende Admin-Inbox (`InboxPage.jsx`) wurde um einen zweiten Abschnitt erweitert statt einer separaten Moderations-Queue. Club-Admin-Rechte sind bewusst auf Vereinsmedien (nicht official) beschränkt. P-14 (Moderations-UI), P-15 (Uploader-Benachrichtigung bei Sperrung — SMTP vorhanden), P-16 (Beschwerdeverfahren) folgen in Etappe D. | --- @@ -427,7 +427,7 @@ **Teilweise implementiert:** P-01 (technischer Teil vollständig inkl. P-01b, P-01c, copy-as-draft, jsPDF; juristische Inhalte offen) — 1 Paket **Teilweise umgesetzt (KRIT offen):** P-06 (Upload-Einwilligungsdialog inkl. P-06+ Volljournal + Korrektur — KRIT-04 bis juristische Validierung ausstehend) **Offen:** P-02, P-08, P-09, P-10, P-14, P-15, P-16, P-17, P-18, P-19, P-20, P-21, P-22 — 13 Pakete -**App-Version bei letzter Aktualisierung:** 0.8.87 +**App-Version bei letzter Aktualisierung:** 0.8.94 **Letztes Umsetzungsdatum:** 2026-05-11 --- diff --git a/docs/compliance-roadmap.md b/docs/compliance-roadmap.md index 0f7c520..fdfb23f 100644 --- a/docs/compliance-roadmap.md +++ b/docs/compliance-roadmap.md @@ -2,7 +2,7 @@ **Typ:** Lebendes Steuerungsdokument **Erstellt:** 2026-05-10 -**App-Version:** 0.8.87 +**App-Version:** 0.8.94 **Zuletzt aktualisiert:** 2026-05-11 --- @@ -29,7 +29,7 @@ Diese Roadmap ist nach jedem Re-Audit zu aktualisieren. Abweichungen von der bis ## 2. Aktueller Stand (2026-05-11) -### App-Version: 0.8.87 +### App-Version: 0.8.94 ### Teilweise umgesetzte Pakete @@ -55,9 +55,9 @@ Diese Roadmap ist nach jedem Re-Audit zu aktualisieren. Abweichungen von der bis | P-01c | _Nacharbeit:_ Admin-konfigurierbare Rechtstexte (DB 047, Superadmin-UI, API) | 0.8.71 | | P-01c+ | _Erweiterung:_ Als-Entwurf-kopieren (`copy-as-draft`) | 0.8.72 | | P-01c++ | _Erweiterung:_ Echter PDF-Download (jsPDF) + Abschnitts-Sortierung/-Einfügen | 0.8.74 | -| P-13 | Content-Melde-Backend (Minimalversion, DSA/KRIT-03) | 0.8.87 | +| P-13 | Content-Melde-Backend + Erweiterungen (Audit-Log, E-Mail, Club-Admin, Workflow) | 0.8.87–0.8.94 | -**Vollständig abgeschlossen:** 10 Hauptpakete + 4 Nacharbeiten + 2 Erweiterungen = 16 Umsetzungseinheiten +**Vollständig abgeschlossen:** 10 Hauptpakete + 4 Nacharbeiten + 2 Erweiterungen = 16 Umsetzungseinheiten (P-13 inkl. umfangreicher Nachfixe 0.8.88–0.8.94) **Teilweise umgesetzt (technisch):** P-01, P-06 ### Offene Pakete (13) @@ -179,7 +179,7 @@ Reihenfolge innerhalb der Etappe ist flexibel; P-01 und P-06 haben keine gegense **Hinweis P-01:** Die technische Anlage (leere Seiten, Routen `/impressum`, `/datenschutz`, `/nutzungsbedingungen`) ist von der juristischen Ausarbeitung des Inhalts zu trennen. Beide Teilschritte können unabhängig voneinander freigegeben und durchgeführt werden. -**Hinweis P-13:** ✅ Implementiert (v0.8.87). Endpunkte und Architektur: `POST /api/content-reports`, `GET /api/me/inbox/content-reports`, `PATCH /api/content-reports/{id}`, `POST /api/content-reports/{id}/legal-hold`. Keine separate Moderations-Queue — bestehende Admin-Inbox erweitert. P-14 (Moderations-UI), P-15 (Uploader-Benachrichtigung), P-16 (Beschwerdeverfahren) folgen in Etappe D. +**Hinweis P-13:** ✅ Vollständig implementiert (v0.8.87–0.8.94). Kernum­setzung: `POST /api/content-reports`, `GET /api/me/inbox/content-reports`, `PATCH /api/content-reports/{id}`, `POST /api/content-reports/{id}/legal-hold`. Erweiterungen: Audit-Log (Migration 053), E-Mail-Benachrichtigungen, Club-Admin-Rechte (Vereinsmedien), Workflow-Bar + Archiv-Trennung, Badge auf Medienkarten, CI-Fix (15 Tests grün). Keine separate Moderations-Queue — bestehende Admin-Inbox erweitert. P-14 (Moderations-UI), P-15 (Uploader-Benachrichtigung), P-16 (Beschwerdeverfahren) folgen in Etappe D. --- @@ -356,7 +356,7 @@ Diese Punkte liegen außerhalb des Code-Scopes und erfordern organisatorische Ma | ~~P-01c~~ | ~~„Freigabe zur Umsetzung P-01c: Admin-konfigurierbare Rechtstexte"~~ | ✅ historisch abgeschlossen (Version 0.8.71); Erweiterungen copy-as-draft (0.8.72) + jsPDF/Sortierung (0.8.74) | | **P-06** | **„Freigabe zur Umsetzung P-06 auf Basis konservativer Erstannahmen"** | ✅ erteilt + vollständig umgesetzt (2026-05-11, v0.8.75–0.8.83) — technisch umgesetzt unter `p06-v1-conservative` inkl. P-06+ Volljournal + Korrektur; KRIT-04 bleibt bis juristische Validierung | | **P-11** | **„Freigabe zur Umsetzung P-11: Legal-Hold Lifecycle-Status"** | ✅ vollständig umgesetzt (2026-05-11, v0.8.84–0.8.86) — Migration 051, Retention-Schutz, Superadmin-API + Frontend (0.8.84); UI-Bugfixes (0.8.85); Auslieferungssperre + Frontend-Placeholder + Superadmin-only Medienliste (0.8.86); 15 Backend-Tests | -| P-13 | „Freigabe zur Umsetzung P-13: Content-Melde-Backend" | ⬅ nächste empfohlene Freigabe (nach juristischer Klärung P-06/KRIT-04 und Rechtstexten P-01) | +| ~~P-13~~ | ~~„Freigabe zur Umsetzung P-13: Content-Melde-Backend"~~ | ✅ vollständig umgesetzt (2026-05-11, v0.8.87–0.8.94) — Kernum­setzung + Audit-Log, E-Mail-Benachrichtigungen, Club-Admin-Rechte, Workflow-Management, Badge, CI-Fix; 15 Backend-Tests | | P-02 Spezifikation | „Freigabe zur Spezifikation P-02: DSGVO-Self-Service-Prozess" | offen | ---