feat(platform): add audit logs and activity feed

This commit is contained in:
Schubert Ferenc 2026-07-03 00:04:44 +02:00
parent 92cb8d1286
commit c816e9869d
34 changed files with 1592 additions and 43 deletions

View file

@ -58,6 +58,8 @@ Sie verbindet:
- das konfigurierte Docker-Netzwerk
- die notwendigen Runtime-Umgebungsvariablen
Im gemeinsamen Compose-Stack wird Athena am Host veroeffentlicht. Hermes wird nur intern im Docker-Netzwerk exponiert und von Athena ueber `HERMES_INTERNAL_URL` erreicht.
## BFF-Architektur
Olympus nutzt eine Backend-for-Frontend-Architektur.
@ -172,6 +174,14 @@ Beispiele:
Nicht vorhandene Module wie Aufgaben, Tickets oder Projekte werden nicht mit Fake-Daten gefuellt. Stattdessen liefert das Dashboard leere Widgets mit klarer Meldung.
### Activity Feed
Der Activity Feed ist Teil der v0.5.0-Qualitaetsplattform.
Athena ruft `GET /api/activity-feed` auf. Die BFF-Route ruft serverseitig Hermes `GET /activity-feed` auf.
Der Feed basiert auf persistenten Audit Logs und zeigt die letzten relevanten Aktivitaeten. Hermes filtert die Eintraege anhand der Berechtigungen des aktuellen Benutzers. Ein Benutzer sieht dadurch nur Aktivitaeten zu Bereichen, fuer die er Leserechte besitzt.
## RBAC: Rollen und Berechtigungen
Olympus verwendet ein serverseitiges RBAC-System als Grundlage fuer alle CRM-Module.
@ -250,6 +260,10 @@ Dashboard und System:
- `system.settings.read`
- `system.settings.update`
Audit:
- `audit_logs.read`
### Berechtigungspruefung
Zentrale Hermes-Dependencies:
@ -374,12 +388,80 @@ Kontakte und Adressen gehoeren fachlich zum Kunden und werden aktuell ueber `cus
Ein Kunden-Delete entfernt aktuell den Kunden inklusive Adressen und Ansprechpartnern. Fuer spaetere Projekte oder Tickets ist ein fachlicher Loeschschutz vorzubereiten, sobald diese Module existieren.
## Audit Logs
Audit Logs sind die zentrale Nachvollziehbarkeitsschicht fuer v0.5.0.
Hermes persistiert relevante Ereignisse in der Tabelle `audit_logs`.
Erfasste Informationen:
- handelnder Benutzer
- Aktion, z. B. `users.update` oder `customers.delete`
- Objekttyp und Objekt-ID
- lesbares Objektlabel
- IP-Adresse und User-Agent
- Vorher-/Nachher-Daten fuer Aenderungen
- Metadaten fuer Kontextinformationen
- Erstellungszeitpunkt
Sensible Felder wie Passwoerter, Tokens und Secrets werden vor dem Schreiben maskiert.
Audit Logs werden aktuell fuer diese Bereiche geschrieben:
- Login erfolgreich/fehlgeschlagen
- Benutzer erstellen, bearbeiten, loeschen, Passwort aendern
- Rollen erstellen, bearbeiten, loeschen, Berechtigungen aendern
- Kunden erstellen, bearbeiten, loeschen
- Ansprechpartner erstellen, bearbeiten, loeschen
Hermes-Endpunkte:
- `GET /audit-logs`
- `GET /activity-feed`
Athena-BFF-Routen:
- `GET /api/audit-logs`
- `GET /api/activity-feed`
Die Audit-Log-UI liegt unter `frontend/athena/app/audit-logs` und ist ueber `audit_logs.read` sichtbar.
## API-Response-Standard
Neue Plattform-Endpunkte verwenden eine einheitliche Response-Huelle:
```json
{
"success": true,
"data": {},
"message": "Daten geladen"
}
```
Fehlerantworten aus Hermes verwenden ein konsistentes Format mit `success`, `message`, `error_code` und `details`. Fuer bestehende Athena-Fehlerbehandlung bleibt `detail` zusaetzlich erhalten.
## Logging
Hermes konfiguriert Logging zentral ueber `backend/hermes/app/core/logging.py`.
HTTP-Requests werden strukturiert mit Methode, Pfad, Statuscode und Dauer geloggt. Fachliche Ereignisse bleiben in den API-Modulen als strukturierte Logeintraege erhalten.
Das Runtime-Loglevel wird ueber `LOG_LEVEL` gesteuert.
## Frontend-Feedback
Athena nutzt einen globalen Toast-Provider fuer konsistente Erfolgs- und Fehlermeldungen.
Aktuell werden Toasts in den CRUD-Flows fuer Benutzer, Rollen, Kunden und Ansprechpartner genutzt. Inline-Fehler bleiben dort erhalten, wo sie fuer Formulare und Dialoge hilfreich sind.
## Verzeichnisstruktur
```text
backend/hermes
app/
api/
audit/
core/
db/
models/
@ -393,6 +475,7 @@ backend/hermes
frontend/athena
app/
api/
audit-logs/
customers/
roles/
users/
@ -422,6 +505,9 @@ docker-compose.yml
`ACCESS_TOKEN_EXPIRE_MINUTES`
: Ablaufzeit fuer Access Tokens in Minuten.
`LOG_LEVEL`
: Runtime-Loglevel fuer Hermes, z. B. `INFO`, `WARNING` oder `ERROR`.
### Athena
`HERMES_INTERNAL_URL`