From 80936b226d0c18546a50c4c5acff48a21b56d818 Mon Sep 17 00:00:00 2001 From: Lars Date: Sun, 10 May 2026 11:53:07 +0200 Subject: [PATCH] feat(compliance): P-01c Admin-konfigurierbare Rechtstexte (0.8.71) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit DB 047: legal_documents (versioniert, draft/published/archived) + legal_document_audit (Änderungslog); Partial-Unique-Index garantiert max. ein published-Dokument pro document_type. Backend: GET /api/legal-documents/{type}/published (kein Auth); Superadmin-CRUD + Publish/Archive + Audit unter /api/admin/legal-documents. Frontend: LegalPage lädt aus API mit Platzhalter-Fallback; AdminLegalDocumentsPage (/admin/legal-documents) mit Tab-Navigation, Versionsliste, Entwurf-Editor, Publish/Archive-Workflow, Änderungslog. AdminPageNav: Link „Rechtstexte" ergänzt. version: 0.8.71 (backend + frontend) module: legal_documents 1.0.0 Co-Authored-By: Claude Sonnet 4.6 --- backend/main.py | 3 +- backend/migrations/047_legal_documents.sql | 37 ++ backend/routers/legal_documents.py | 408 ++++++++++++++ backend/version.py | 12 +- docs/compliance-implementation.md | 46 +- docs/compliance-package-register.md | 8 +- docs/compliance-roadmap.md | 18 +- frontend/src/App.jsx | 9 + frontend/src/components/AdminPageNav.jsx | 3 +- .../src/pages/AdminLegalDocumentsPage.jsx | 517 ++++++++++++++++++ frontend/src/pages/LegalPage.jsx | 95 +++- frontend/src/utils/api.js | 25 +- frontend/src/version.js | 5 +- tests/dev-smoke-test.spec.js | 45 ++ 14 files changed, 1184 insertions(+), 47 deletions(-) create mode 100644 backend/migrations/047_legal_documents.sql create mode 100644 backend/routers/legal_documents.py create mode 100644 frontend/src/pages/AdminLegalDocumentsPage.jsx diff --git a/backend/main.py b/backend/main.py index 6dc94e4..72395c9 100644 --- a/backend/main.py +++ b/backend/main.py @@ -193,7 +193,7 @@ def read_root(): return out # Register routers -from routers import auth, profiles, exercises, exercise_progression_graphs, clubs, club_memberships, club_join_requests, admin_users, platform_media_storage, media_assets, skills, training_planning, training_framework_programs, catalogs, maturity_models, matrix_stack_bundle, import_wiki, import_wiki_admin +from routers import auth, profiles, exercises, exercise_progression_graphs, clubs, club_memberships, club_join_requests, admin_users, platform_media_storage, media_assets, skills, training_planning, training_framework_programs, catalogs, maturity_models, matrix_stack_bundle, import_wiki, import_wiki_admin, legal_documents app.include_router(auth.router) app.include_router(profiles.router) @@ -213,6 +213,7 @@ app.include_router(maturity_models.router) app.include_router(matrix_stack_bundle.router) app.include_router(import_wiki.router) app.include_router(import_wiki_admin.router) +app.include_router(legal_documents.router) # Lokale Übungs-Medien: standardmäßig nur über geschützten API-Pfad # GET /api/exercises/{id}/media/{mid}/file (?ssetoken für /