feat(PROJ-17): Admin Dashboard Systemauslastung immer anzeigen

- Systemauslastungs-Sektion wird immer gerendert (nicht nur bei Erfolg)
- Fehlermeldung wenn /api/admin/system/stats nicht erreichbar ist
- Feature-Status auf In Review gesetzt

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
This commit is contained in:
sysops
2026-03-14 11:43:19 +01:00
parent a893084a88
commit d360c9a5ba
68 changed files with 11938 additions and 435 deletions
+122
View File
@@ -0,0 +1,122 @@
# PROJ-12: E-Mail-Export (EML / PDF)
## Status: In Progress
**Created:** 2026-03-12
**Last Updated:** 2026-03-13
## Dependencies
- Requires: PROJ-1 (Authentifizierung)
- Requires: PROJ-6 (Volltext-Suche) Export aus Suchergebnissen
- Requires: PROJ-7 (E-Mail-Ansicht)
- Requires: PROJ-11 (Audit-Log) Export-Aktionen werden geloggt
## User Stories
- Als Nutzer möchte ich eine einzelne E-Mail als EML-Datei exportieren, damit ich sie in einem E-Mail-Client öffnen kann.
- Als Nutzer möchte ich eine E-Mail als PDF drucken/exportieren, damit ich sie für Behörden oder Verträge verwenden kann.
- Als Admin möchte ich mehrere E-Mails als ZIP-Archiv exportieren, damit ich bei einer Anfrage mehrere Mails auf einmal liefern kann.
- Als System möchte ich jeden Export im Audit-Log erfassen.
## Acceptance Criteria
- [ ] Einzelexport EML: Original-MIME-Inhalt wird unverändert heruntergeladen
- [ ] Einzelexport PDF: E-Mail-Header + Body als gut lesbares PDF gerendert, Anhänge als separate Dateien erwähnt
- [ ] Massenexport: Auswahl mehrerer E-Mails (Checkbox in Suchergebnissen), ZIP-Download
- [ ] ZIP enthält: EML-Dateien + optionale Anhänge + Manifest (CSV mit Metadaten)
- [ ] Massenexport-Limit konfigurierbar (Standard: max. 500 E-Mails pro Export)
- [ ] Jeder Export wird im Audit-Log erfasst (Nutzer, Anzahl E-Mails, Format)
- [ ] Zugriffsschutz: Nutzer kann nur eigene E-Mails exportieren
## Edge Cases
- Export von 500 E-Mails mit großen Anhängen → Streaming-ZIP, kein Speicher-Overflow
- PDF-Rendering von komplexem HTML → graceful Fallback auf Plain-Text-PDF
- Nutzer wählt E-Mails aus, auf die er keinen Zugriff hat → diese werden aus Export-Liste entfernt
## Technical Requirements
- ZIP-Erstellung als Stream (nicht komplett in Memory)
- PDF-Generierung serverseitig (z.B. wkhtmltopdf oder Go-PDF-Bibliothek)
---
## Tech Design (Solution Architect)
### Komponentenstruktur
**Next.js Frontend:**
```
Suchergebnisse (PROJ-6, Erweiterung)
├── Checkbox pro Treffer (Multi-Select)
├── [Exportieren] Button (aktiv wenn ≥1 ausgewählt)
└── Export-Dialog
├── Format: EML | PDF
├── Anhänge einschließen: ja / nein
└── [Download starten] → POST /api/export/zip (Streaming)
E-Mail-Ansicht (PROJ-7, Erweiterung)
├── [Als EML herunterladen] Button → GET /api/export/eml/{id}
└── [Als PDF exportieren] Button → GET /api/export/pdf/{id}
```
**Go Backend:**
```
Export-Handler
├── GET /api/export/eml/{id} ← Einzelexport EML
│ └── Original-.m-Datei lesen, AES-256-GCM entschlüsseln, direkt streamen
├── GET /api/export/pdf/{id} ← Einzelexport PDF
│ ├── .m-Datei lesen + entschlüsseln
│ ├── Header + Body extrahieren
│ └── → PDF-Bibliothek → PDF streamen
│ Fallback: Plain-Text-PDF wenn HTML zu komplex
└── POST /api/export/zip ← Massenexport
├── Body: { ids: [...], format: "eml"|"pdf", attachments: bool }
├── Zugriffscheck: Nutzer darf nur eigene Mails exportieren
├── Max-Limit prüfen (konfigurierbar, Standard: 500)
├── Streaming-ZIP (archive/zip Writer → ResponseWriter direkt)
│ ├── Pro Mail: <message_id>.eml oder <message_id>.pdf
│ ├── Anhänge: attachments/<hash>/<filename> (wenn aktiviert)
│ └── manifest.csv (Message-ID, From, To, Subject, Date, Dateiname)
└── → Audit-Log: export_start + export_done (Anzahl, Format)
```
### Export-Fluss (Massenexport)
```
POST /api/export/zip
├── Zugriffsfilter: IDs auf user-eigene Mails beschränken
├── Audit-Log: export_start
├── ZIP-Stream öffnen (Content-Type: application/zip)
└── Für jede Mail:
.m-Datei lesen → AES-256-GCM entschlüsseln
→ Zu ZIP hinzufügen (kein vollständiges RAM-Buffering)
manifest.csv Zeile anhängen
ZIP schließen → Audit-Log: export_done
```
### Technische Entscheidungen
| Entscheidung | Begründung |
|---|---|
| **Streaming-ZIP** | 500 Mails mit Anhängen können mehrere GB sein — kein RAM-Overhead |
| **Serverseitiges PDF** | Browser-Print ist nicht reproduzierbar; serverseitiges PDF ist auditierbar und einheitlich |
| **Plain-Text-Fallback für PDF** | Komplexes HTML kann PDF-Renderer zum Absturz bringen — graceful degradation |
| **Zugriffscheck im Export-Handler** | Serverseitige Filterung verhindert Datenlecks durch manipulierte IDs |
| **manifest.csv im ZIP** | Nachvollziehbarkeit bei Behördenanfragen ohne jede EML einzeln öffnen zu müssen |
| **Audit-Log für jeden Export** | Compliance-Anforderung — wer hat wann was exportiert |
### Abhängigkeiten
| Paket | Zweck |
|---|---|
| `archive/zip` (Stdlib) | Streaming-ZIP-Erstellung ohne externe Abhängigkeit |
| `github.com/SebastiaanKlippert/go-wkhtmltopdf` | PDF-Generierung aus HTML (serverseitig) |
## QA Test Results
_To be added by /qa_
## Deployment
_To be added by /deploy_