feat(dokument): Dokumente-Modul (Roadmap Phase 5)
CI / backend-tests (push) Failing after 1m51s
CI / frontend-build (push) Successful in 17s

Polymorphe Datei-Anhänge (PDF/JPEG/PNG/WebP, Whitelist statt Blacklist -
owasp-Grundsatz) an beliebige Ressource, gleiches entitaet_typ/entitaet_id-
Muster wie Mangel/Historie. Lokale Ablage (settings.upload_dir, kein Cloud-
Zwang, Self-Hosting-Anforderung), server-generierter Dateiname verhindert
Path-Traversal/Namenskollisionen.

POST /dokumente (multipart), GET /dokumente (Filter Pflicht: entitaet_typ +
entitaet_id), GET /dokumente/{id}/download, DELETE /dokumente/{id}. Hochladen:
alle Mitarbeiter+, Löschen: Materialverantwortliche+Leitung+Admin.

Frontend: wiederverwendbares DokumentePanel (Upload/Liste/Download/Löschen),
eingebunden in ObjektSection (je Objekt) und MangelListePage (Fotos zu
Mängeln) - weitere Ressourcen (Geräteinstanz, Fahrzeugdetails, Benutzer)
können denselben Baustein später einfach wiederverwenden.

Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01KC8HYvv6UkCVYheYiTw9DD
This commit is contained in:
2026-09-05 13:56:27 +02:00
co-authored by Claude Sonnet 5
parent 11ad747136
commit 73bf6c1605
16 changed files with 631 additions and 0 deletions
+7
View File
@@ -24,5 +24,12 @@ class Settings(BaseSettings):
smtp_from: str = "mabea@example.org"
smtp_use_tls: bool = True
# Dokumente-Modul (Roadmap Phase 5): lokale Ablage, kein Cloud-Storage-
# Zwang (Self-Hosting-Anforderung). Relativer Default reicht für
# Entwicklung, Produktion setzt einen absoluten Pfad außerhalb des
# Anwendungsverzeichnisses (z.B. /opt/mabea/uploads, siehe deploy/README.md).
upload_dir: str = "./uploads"
max_upload_size_mb: int = 25
settings = Settings()