12 KiB
Mitwirken an Olympus CRM
Dieses Dokument beschreibt verbindliche Entwicklungsregeln fuer Olympus CRM.
Ziel ist ein stabiler, nachvollziehbarer und produktionsfaehiger Entwicklungsprozess. Keine Quickfixes, keine Workarounds, keine Architektur-Abkuerzungen.
Branching-Modell
main bleibt immer lauffaehig.
Neue Arbeit erfolgt in eigenen Branches:
- Features:
feature/<name> - Bugfixes:
fix/<name> - Dokumentation:
docs/<name>
Beispiele:
feature/users-detail-page
feature/customer-module
fix/auth-cookie-localhost
docs/architecture
Direkte Commits auf main sind zu vermeiden.
Commit-Konventionen
Olympus verwendet Conventional Commits.
Format:
type(scope): kurze beschreibung
Beispiele:
feat(auth): add bff login route
feat(users): implement user detail page
fix(auth): accept forwarded origin behind proxy
docs: add architecture documentation
refactor(users): extract reusable data table
Zulaessige Typen:
feat: neue Funktionfix: Fehlerbehebungdocs: Dokumentationrefactor: interne Umstrukturierung ohne Verhaltensaenderungtest: Testschore: Wartung, Build, Tooling
Commits sollen klein, fachlich zusammenhaengend und reviewbar sein.
Definition of Done
Eine Aenderung gilt erst als fertig, wenn diese Punkte erfuellt sind:
npm run linterfolgreich infrontend/athenanpx next build --webpackerfolgreich infrontend/athenapython3 -m compileall backend/hermes/apperfolgreich im Projektroot- Alembic-Migrationen geprueft, falls Datenbankschema betroffen ist
uv run alembic historyerfolgreich inbackend/hermesuv run alembic upgrade headerfolgreich inbackend/hermes, wenn Migrationen betroffen sind- Docker Compose startet
- keine
.envim Git - keine
node_modulesim Git - keine
.nextim Git - keine
.venvim Git - keine toten Imports
- keine ungenutzten Dateien
- keine Debug-Ausgaben oder Browser-Dialoge im Anwendungscode
Standard-Checks:
cd frontend/athena
npm run lint
npx next build --webpack
python3 -m compileall backend/hermes/app
cd backend/hermes
uv run alembic history
uv run alembic upgrade head
Coding Standards
Frontend
- TypeScript strikt verwenden.
- Next.js 16 App Router Konventionen einhalten.
- Browser-API-Zugriffe nur ueber Athena
/api/.... - Wiederverwendbare Komponenten bevorzugen.
- UI-Zustaende immer abbilden: Loading, Error, Empty State.
- Erfolg und Fehler in mutierenden CRUD-Flows ueber den Toast-Provider melden.
- Keine nativen Browser-Dialoge fuer produktive UI-Flows.
- Keine Tokens in Browser-JavaScript speichern.
- Datei-Uploads vom Browser laufen ueber Athena-BFF-Routen und werden serverseitig an Hermes weitergeleitet.
Backend
- FastAPI sauber nach API, Schema, Repository und Core trennen.
- SQLAlchemy 2.x Patterns verwenden.
- Pydantic v2 fuer Request- und Response-Modelle verwenden.
- HTTP-Fehler bewusst mit passenden Statuscodes ausgeben.
- Fachliche Konflikte als
409 Conflict. - Nicht gefundene Ressourcen als
404 Not Found. - Authentifizierung serverseitig pruefen.
- Berechtigungen mit
require_permission,require_any_permissionoderrequire_all_permissionspruefen. - Mutierende Kernaktionen mit Audit Logs erfassen, sofern fachlich relevant.
- Sensible Felder vor Persistenz in Logs oder Audit-Daten maskieren.
- Import- und Bootstrap-Flows duerfen keine Passwoerter, Tokens, Secrets oder vollstaendige CSV-Inhalte loggen.
- Dateiablagen laufen ueber
StorageService; direkte Dateioperationen in Fachservices sind nur mit guter Begruendung zulaessig. - Uploads muessen Dateityp, MIME-Type, Groesse, Dateiname und Storage-Pfad validieren.
Allgemein
- Keine Platzhalter-Kommentare als Ersatz fuer fertige Implementierung.
- Keine Quickfixes.
- Keine Workarounds.
- Keine ungeprueften Annahmen bei Auth, Datenbank oder Docker.
- Bestehende Architektur respektieren.
Architekturregeln
Diese Regeln sind verbindlich:
- Browser spricht niemals direkt mit Hermes.
- Alle Frontend-API-Zugriffe laufen ueber Athena
/api. - Athena ruft Hermes serverseitig auf.
- Hermes bleibt Cookie-frei.
- Authentifizierung bleibt serverseitig.
- Hermes erwartet JWT Bearer Tokens.
- Athena setzt und loescht das HttpOnly Cookie.
- Keine Cross-Origin-Cookie-Loesungen.
- RBAC wird serverseitig in Hermes durchgesetzt.
- Frontend-Permissions dienen nur der UI und ersetzen keine Backend-Pruefung.
- Audit Logs werden serverseitig in Hermes geschrieben.
- Neue Plattform-Endpunkte sollen das einheitliche API-Response-Format nutzen.
- Header- und Benutzerkontext wird ueber
GET /api/megeladen; hart codierte Benutzernamen sind unzulaessig.
Wenn eine Aufgabe diese Regeln zu verletzen scheint, muss zuerst die Architekturentscheidung geklaert werden.
Neue Module
Neue CRM-Module sollen die bestehenden Muster wiederverwenden.
Beispiele fuer spaetere Module:
- Kunden
- Reparaturen
- Projekte
- Lieferanten
- Kontakte
- Mitarbeiter
Verbindliche Wiederverwendung:
DataTablefuer tabellarische ListenConfirmDialogfuer destruktive AktionenSearchInputfuer SuchfelderStatusBadgeoder aehnliche Badge-Komponenten fuer StatusanzeigenToastProviderfuer Erfolg und Fehler bei mutierenden AktionenapiClient ausfrontend/athena/lib/api.ts- Athena API-Routes als BFF-Schicht
- konsistente Fehlerbehandlung
- zentrale Permission-Helfer aus
frontend/athena/lib/permissions.ts
Neue Module sollen mindestens diese UI-Zustaende unterstuetzen:
- Ladezustand
- Fehlerzustand
- Empty State
- Validierung
- Erfolg ohne Page Reload
CRM-Modulstandard
Ein neues CRM-Modul soll sich am Kundenmodul orientieren:
- SQLAlchemy-Modell in
backend/hermes/app/models - Pydantic-Schemas in
backend/hermes/app/schemas - Repository in
backend/hermes/app/repositories - FastAPI-Router in
backend/hermes/app/api - Alembic-Migration fuer Schemaaenderungen
- Athena-BFF-Routen unter
frontend/athena/app/api - Frontend-Seiten unter
frontend/athena/app/<module> - wiederverwendbare UI-Komponenten unter
frontend/athena/components - RBAC-Permissions vor der UI-Integration definieren
- Audit-Log-Ereignisse fuer relevante Create/Update/Delete-Aktionen definieren
- keine Fake-Daten fuer noch nicht existierende Unterbereiche
Dashboard-Widgets fuer noch nicht implementierte Module muessen Empty States anzeigen statt hart codierter Beispieldaten.
Kundenimport
Kundenimporte muessen die bestehende Kundenarchitektur nutzen und ueber Athena-BFF-Routen laufen. Der Browser darf keine Hermes-URL kennen.
CSV-Vorgaben:
- UTF-8 bevorzugen
- Semikolon und Komma unterstuetzen
- leere Zeilen ignorieren
- Fehler und Warnungen pro Zeile zurueckgeben
- Preview darf keine Datenbank-Aenderungen ausloesen
- Commit schreibt Audit Logs ohne CSV-Rohinhalt
Importmodi:
create_onlyupdate_existingupsert
Die Excel-freundliche Vorlage liegt unter GET /api/customers/import/template.
Wissensdatenbank
Das Knowledge-Modul folgt dem bestehenden Modulstandard:
- SQLAlchemy-Modell in
backend/hermes/app/models/knowledge.py - Pydantic-Schemas in
backend/hermes/app/schemas/knowledge.py - Repository in
backend/hermes/app/repositories/knowledge_repository.py - Service-Logik in
backend/hermes/app/services/knowledge_service.py - FastAPI-Router in
backend/hermes/app/api/knowledge.py - Athena-BFF unter
/api/knowledge/... - Frontend-Seiten unter
/knowledge
Upload-Regeln:
- Browser sendet Dateien nur an Athena.
- Athena leitet FormData serverseitig an Hermes weiter.
- Hermes validiert Dateityp, MIME-Type, Dateigroesse und Speicherpfad.
- Lokale Dateien liegen ueber Docker unter
STORAGE_BASE_PATH; alte Knowledge-Pfade bleiben nur als Legacy-Fallback erhalten. - Dokumentuploads benoetigen Hersteller, Geraet, Dokumenttyp und Datei.
- Ein Geraet muss serverseitig zum ausgewaehlten Hersteller gehoeren.
- Fehlende Upload-Voraussetzungen muessen im Formular sichtbar sein und duerfen keinen Upload starten.
- Audit Logs duerfen keine Datei-Inhalte enthalten.
- Keine Pfade aus unvalidierten Benutzereingaben zusammensetzen.
Workflow-Regel:
Hersteller -> Gerät -> Dokument -> Notiz/Reparaturhinweis
Knowledge-Listen sollen EmptyState nutzen, wenn Daten fehlen oder Suche/Filter keinen Treffer liefern.
Paperless-ngx ist nur vorbereitet. paperless_document_id und external_url duerfen gepflegt werden, aber es werden keine Paperless-Secrets oder API-Keys eingefuehrt.
Storage
Neue Dateiablagen muessen das zentrale Storage Framework verwenden.
Regeln:
- Keine unvalidierten Pfade aus Benutzereingaben zusammensetzen.
- Keine absoluten User-Pfade akzeptieren.
- Keine Path-Traversal-Moeglichkeiten zulassen.
- Originaldateinamen und gespeicherte Dateinamen fachlich unterscheiden.
- SHA256 fuer gespeicherte Dateien berechnen, sofern das Modul Datei-Metadaten persistiert.
- Keine Datei-Inhalte loggen.
- Bestehende Dateien nicht automatisch verschieben oder loeschen.
Der lokale Provider nutzt STORAGE_BASE_PATH; Docker mountet den Host-Pfad aus STORAGE_HOST_PATH nach /data/storage.
Deployment
Neue Installationen koennen optional ueber INITIAL_ADMIN_* einen initialen Administrator anlegen. Diese Variablen werden nur von Hermes gelesen und duerfen nicht im Frontend oder in Logs erscheinen.
Dateien benoetigen einen persistenten Storage-Mount. Vor produktiven Deployments muessen STORAGE_PROVIDER, STORAGE_BASE_PATH, STORAGE_MAX_UPLOAD_MB und STORAGE_HOST_PATH bewusst gesetzt oder die Defaults akzeptiert werden.
Die Skripte unter scripts/ sind die bevorzugte Grundlage fuer Migration, Healthcheck, Deploy, Backup und Restore.
Neue Permissions
Neue Module muessen eigene stabile Permission-Strings erhalten.
Namensschema:
<module>.<action>
Beispiele:
customers.read
customers.create
projects.update
tickets.delete
Regeln:
- Permission in
backend/hermes/app/rbac/defaults.pyergaenzen. - Rollen-Mapping in
ROLE_PERMISSION_NAMESpruefen. - Falls noetig Alembic-Migration fuer bestehende Installationen ergaenzen.
- Hermes-Endpunkte mit
require_permission(...)schuetzen. - Athena UI-Aktionen mit
hasPermission(...)ausblenden oder deaktivieren. - Backend bleibt immer massgeblich.
Review-Checkliste
Vor Merge pruefen:
- Auth-Architektur nicht gebrochen
- Browser ruft Hermes nicht direkt auf
- Docker laeuft
- Migrationen vorhanden, falls Schema geaendert wurde
- Migrationen getestet
- UI konsistent mit bestehenden Komponenten
- keine Secrets committed
- keine
.envcommitted - keine toten Imports
- keine ungenutzten Dateien
- keine Debug-Ausgaben
- keine Build-Artefakte committed
- keine neuen CORS- oder Cookie-Workarounds
- Permission-Pruefung fuer neue Endpunkte vorhanden
- Permission-UI nur als Komfort, nicht als Sicherheitsgrenze
- Audit Logs fuer relevante Aenderungen vorhanden
- API-Fehlerantworten konsistent
- Toasts fuer mutierende UI-Aktionen vorhanden
- Dateiablagen verwenden
StorageService - Storage-Pfade sind gegen Path Traversal geschuetzt
- Backup-/Restore-Auswirkungen fuer Dateiablagen dokumentiert
Migrationsregeln
Datenbankschema wird ausschliesslich ueber Alembic geaendert.
Regeln:
- Jede Schemaaenderung braucht eine Migration.
- Migrationen werden ins Repository aufgenommen.
alembic upgrade headmuss getestet werden.- Downgrade sollte sinnvoll sein, sofern moeglich.
- Keine manuellen Produktions-DB-Aenderungen ohne Dokumentation.
Typischer Ablauf:
cd backend/hermes
alembic upgrade head
Sicherheitsregeln
Verbindlich:
- Keine Secrets im Code.
- Keine Secrets in Commits.
- Keine Tokens im Browser-JavaScript.
- Keine Auth in
localStorage. - Keine Auth in
sessionStorage. - Keine CORS-Cookie-Workarounds.
- Keine Cross-Origin-Cookies.
- Produktiv nur HTTPS.
AUTH_COOKIE_SECURE=truein Produktion.SECRET_KEYstark und geheim halten.
Bei Auth-Aenderungen muessen Login, Logout, geschuetzte Seiten und Athena-API-Routes gemeinsam geprueft werden.
Bei RBAC-Aenderungen muessen Rollen, Permissions, betroffene API-Endpunkte, Navigation und UI-Aktionen gemeinsam geprueft werden.
Lokale Entwicklung
Lokaler Betrieb kann ueber Docker Compose erfolgen.
Wichtige lokale Einstellungen:
AUTH_COOKIE_SECURE=false
ATHENA_PUBLIC_ORIGIN=http://localhost:3001
Diese Werte sind nur fuer lokale HTTP-Entwicklung gedacht. In Produktion muessen sichere Werte verwendet werden.
Dokumentationspflicht
Architekturentscheidungen, neue Module, neue Umgebungsvariablen und Datenbankmigrationen muessen dokumentiert werden.
Wenn sich die BFF-Architektur, Authentifizierung, Docker-Konfiguration oder Datenbankstruktur aendert, muss ARCHITECTURE.md aktualisiert werden.