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
15 lines
606 B
Bash
15 lines
606 B
Bash
# Kopieren nach .env (auf dem Zielsystem) und Werte setzen. .env selbst nie committen.
|
|
|
|
DATABASE_URL=postgresql+asyncpg://mabea:changeme@localhost:5432/mabea
|
|
JWT_SECRET_KEY=change-me-to-a-long-random-value
|
|
JWT_ALGORITHM=HS256
|
|
ACCESS_TOKEN_EXPIRE_MINUTES=480
|
|
|
|
# ID des systemknoten-Datensatzes mit typ='haupt' (Sprintplan E6, siehe alembic/versions/0002_seed_hauptserver.py)
|
|
SYSTEMKNOTEN_ID=1
|
|
|
|
# Dokumente-Modul: Ablageverzeichnis außerhalb des Anwendungsverzeichnisses
|
|
# (z.B. /opt/mabea/uploads), damit ein Redeploy hochgeladene Dateien nicht löscht.
|
|
UPLOAD_DIR=/opt/mabea/uploads
|
|
MAX_UPLOAD_SIZE_MB=25
|