shinkan-jinkendo/.claude/docs/working/ACCESS_LAYER_ENDPOINT_AUDIT.md
Lars bd5a409fa7
All checks were successful
Deploy Development / deploy (push) Successful in 42s
Test Suite / pytest-backend (push) Successful in 44s
Test Suite / lint-backend (push) Successful in 1s
Test Suite / build-frontend (push) Successful in 15s
Test Suite / k6 /health Baseline (push) Successful in 35s
Test Suite / playwright-tests (push) Successful in 1m18s
Test Suite / pytest-backend (pull_request) Successful in 38s
Test Suite / lint-backend (pull_request) Successful in 0s
Test Suite / build-frontend (pull_request) Successful in 13s
Test Suite / k6 /health Baseline (pull_request) Successful in 38s
Test Suite / playwright-tests (pull_request) Successful in 1m12s
Add Admin User Content Management Features
- Introduced a new admin user content management endpoint for superadmins, allowing for moderation of user-generated content.
- Updated the backend to include new API functions for retrieving, patching, and deleting user content items.
- Enhanced the frontend with a new Admin User Content page and navigation link for easy access to user content management.
- Updated access layer documentation to reflect the new endpoint and its exempt status.
- Incremented version to 0.8.191 and updated changelog to document these additions in admin functionality.
2026-06-06 17:53:25 +02:00

7.6 KiB
Raw Blame History

Endpoint-Audit: Mandanten & Governance

Fortlaufend gemäß ACCESS_LAYER_AND_GOVERNANCE_PLAN.md Stufe AC.

Router / Bereich Beispiel-Endpunkt tenant-relevant Depends(get_tenant_context) / Kontext Governance geprüft (Liste+Detail) Notizen
profiles GET /api/profiles/me ja resolve_tenant_context inline (invalid_header_policy=ignore) teils + effective_club_id; veralteter Header bricht Refresh nicht
profiles GET /api/profiles, GET /profiles/{pid}, POST /profiles, DELETE /profiles/{pid} ja/teils require_auth ja Liste nur Plattform-Admin; GET nach ID eigenes Profil oder Admin; POST/DELETE nur Admin
profiles PUT /api/profiles/{id}, PUT /api/profile ja get_tenant_context active_club_id Mitgliedschaft Validiert X-Active-Club-Id konsistent zu Mitgliedschaft
clubs geschützte /api/clubs*, /divisions*, /groups* ja get_tenant_context Mitgliedschaft / can_manage_* Öffentlich: /clubs/public-directory ohne Auth
club_memberships /clubs/{id}/members* ja get_tenant_context ja
club_join_requests /me/club-join-requests, /clubs/{id}/join-requests* ja get_tenant_context ja
exercises PATCH /api/exercises/bulk-metadata ja get_tenant_context ja Liste: UI-Mehrfachwahl; bis 500 IDs; nur Ersteller oder Plattform-Admin
exercises GET .../media/{mid}/file ja get_tenant_context_flexible ja (wie Übung lesen) Datei oder ?ssetoken; kein anonymes /media/ ohne ALLOW_PUBLIC_MEDIA_STATIC
exercises übrige geschützte /api/exercises* ja get_tenant_context ja PUT Einzelübung: bei Sichtbarkeit official Medien-§4.2 (422: Lifecycle/Promotion/Copyright)
exercises POST /api/exercises/ai/suggest, POST /api/exercises/{id}/ai/regenerate ja get_tenant_context nein Nur Vorschlags-JSON; keine DB-Schreibung; OpenRouter — suggest optional focus_areas_context für Retrieval-Profile
exercise_progression_graphs /api/exercise-progression-graphs* ja get_tenant_context Liste wie Bibliothek; Schreiben Ersteller/Plattform-Admin Kanten: Lesen wenn Graph lesbar
training_planning alle geschützten Endpoints ja get_tenant_context ja Vorlagen-Liste wie Übungen; POST Vorlage Default club_id
dashboard GET /api/dashboard/kpis ja get_tenant_context wie GET /api/exercises + GET /api/training-units Aggregat für Dashboard-Kurzüberblick (ein Roundtrip)
training_modules /api/training-modules* ja get_tenant_context ja Bibliotheks-Module wie Vorlagen/Rahmen; POST Default club_id bei visibility=club
training_framework_programs alle geschützten Endpoints ja get_tenant_context ja Liste + POST Default club_id
admin_users GET /api/admin/users Plattform require_auth Admin-Rolle EXEMPT check_access_layer_hints.py
platform_media_storage GET/PUT /api/admin/platform-media-storage Plattform require_auth GET: is_platform_admin; PUT: nur superadmin Relativer Pfad unter MEDIA_ROOT; keine Secrets; EXEMPT wie admin_users
media_assets POST /api/media-assets/{id}/lifecycle ja get_tenant_context ja u. a. trash_soft mit Trainer-nur-privat-Eigentum; purge nur Superadmin; Superadmin: superadmin_force_lifecycle, superadmin_hard_delete
media_assets GET /api/media-assets ja get_tenant_context ja optional lifecycle; Standard active; Liste inkl. copyright_notice; Papierkorb-Ansicht nur sichtbare Mandanten-Assets
media_assets POST /api/media-assets/bulk-lifecycle ja get_tenant_context ja Mehrfach-Lifecycle; gleiche Regeln wie Einzel-POST
media_assets POST /api/media-assets/bulk-patch ja get_tenant_context ja Copyright / Bezeichner / Sichtbarkeit für viele IDs; gemischte Fehler in failed[]
media_assets PATCH /api/media-assets/{id} ja get_tenant_context ja Copyright, original_filename, optional visibility/club_id; Rechte pro Stufe
media_assets GET /api/media-assets/{id}/file ja get_tenant_context_flexible ja aktiv: Bibliotheks-Sichtbarkeit; trash_soft/trash_hidden: wie Lifecycle-Verwaltung
exercises POST /api/exercises/{id}/media/from-asset ja get_tenant_context ja Verknüpfung exercise_media → bestehendes media_asset_id; Bearbeitungsrecht Übung + Leserecht Archiv
auth /api/auth/* nein Login/Session EXEMPT
catalogs Katalog-CRUD nein (global) require_auth Admin/Trainer je Endpoint EXEMPT; bei späterem club_id nachziehen
skills /api/skills* nein (global) require_auth je Endpoint EXEMPT
maturity_models Admin-Matrix nein (global) require_auth Admin für Schreiben; GET …/{id} nur Portal-Admin EXEMPT
matrix_stack_bundle Export/Import Bundles Plattform/Test require_auth Admin EXEMPT
matrix_editor /api/admin/matrix-editor/* (Export/Import Editor-Bundle) Plattform require_auth nur superadmin EXEMPT; globale Fähigkeitsmatrix ohne Mandantenkontext
import_wiki / import_wiki_admin Wiki-Import Werkzeug require_auth/Admin Admin EXEMPT
ai_skill_retrieval_admin /api/admin/ai-skill-retrieval-profiles* (CRUD) Plattform require_auth nur superadmin; JSON config EXEMPT wie admin_users; kein Vereinsbezug
ai_prompts_admin /api/admin/ai-prompts* (Liste, Detail, PUT, Preview, Reset) Plattform require_auth nur superadmin EXEMPT; globale ai_prompts ohne Mandantenkontext
exercise_enrichment_admin /api/admin/exercise-enrichment/* (Kandidaten, Preview, Apply) Plattform require_auth nur superadmin EXEMPT; plattformweite Übungsliste + Skill-Schreibung; kein TenantContext
admin_user_content /api/admin/user-content/* (Meta, Nutzer-Summary, Items, PATCH, DELETE) Plattform require_auth nur superadmin EXEMPT; Moderation nutzerangelegter Inhalte inkl. privat; kein TenantContext

Legende: Router auf der EXEMPT-Liste des Scripts sind globale oder Auth-only-Pfade; sobald ein Router Vereinsdaten oder Bibliotheks-Sichtbarkeit erhält, EXEMPT entfernen und get_tenant_context einführen.

Pflege / Drift: Änderungen an Mandanten, Governance (visibility/club_id) oder neuen inhaltsbezogenen Endpoints → eine Zeile in dieser Tabelle anpassen und PRODUCTION_READINESS_AUDIT_2026-05.md prüfen.

Letzte Änderung: 2026-06-06 — Superadmin /api/admin/user-content/* (Nutzer-Inhalte Moderation).


Changelog (Fortführung)

  • 2026-05-23: Superadmin-API exercise_enrichment_admin (Batch-Übungs-Anreicherung KI) dokumentiert.

  • 2026-05-30: Superadmin-API ai_prompts_admin (/api/admin/ai-prompts*) dokumentiert.

  • 2026-05-29: Superadmin-API ai_skill_retrieval_admin (Retrieval-Profile) dokumentiert.

  • 2026-05-22: Übungs-KI-Endpunkte (Suggest/Regenerate) dokumentiert.

  • 2026-05-13: Dashboard-KPI-Endpunkt dokumentiert.

  • 2026-05-07: Legacy GET/PUT /api/profile auf Session-Profil gehärtet; OpenAPI/Health-Ready Produktionsdefaults; Security-Release-Tests + CI-Schritt security_release_checks.py — siehe PRODUCTION_READINESS_AUDIT_2026-05.md.

  • 2026-05-07 (Phase 3): CSP SPA (nginx); API nosniff-Middleware — siehe PRODUCTION_READINESS_AUDIT_2026-05.md.


Hinweis GET /training-units

Kein impliziter Filter nach effective_club_id (Multi-Verein-Kalender); bei Bedarf club_id Query setzen.