3.7 KiB
Architektur
Das Repository ist ein modularer Monolith mit getrennten Workspaces fuer Frontend, Backend und API-Client. Ausgeliefert wird eine einzelne Node.js-App, die die gebaute Angular-Anwendung statisch mitliefert.
Workspaces
apps/frontend
apps/backend
packages/api-client
Es wird bewusst kein Nx eingesetzt. Workspace-Grenzen bleiben durch npm-Scripts, TypeScript-Projekte und klare Importpfade nachvollziehbar.
Backend
Das Backend liegt in apps/backend und basiert auf NestJS. Es ist nach Features
geschnitten:
auth: OIDC Login, Callback, Logout und Authentifizierungsessions: serverseitige Sessions, CSRF-Token und Session-Listenroles: Code-definierte Permissions und rollenbasierte Rechteverwaltungusers: lokale Benutzerprofile und Einstellungenitems: Beispiel-Fachmodulaudit: Audit-Log fuer administrative Nachvollziehbarkeithealth: Liveness- und Readiness-Endpunktedatabase: TypeORM-Konfiguration, Entities und Migrationencommon: Fehlerformat, Request Context, Validierung und HTTP-Helfer
Controller enthalten keine Datenbanklogik. Sie validieren den HTTP-Rand, deklarieren Permissions und delegieren an Services. Services enthalten Fachlogik. Datenbankzugriffe laufen ueber Repository-Klassen oder klar benannte Persistence-Services.
Globale Backend-Bausteine:
ApiExceptionFilternormalisiert Fehlerantworten.ThrottlerGuardsetzt Rate Limits.CsrfGuardschuetzt schreibende Requests.PermissionsGuardprueft Rollen und Permissions.RequestIdMiddlewaresetzt Request-Korrelation.helmetsetzt Security Header.pino-httploggt mit Redaction fuer Cookies, Tokens und Secrets.
Frontend
Das Frontend liegt in apps/frontend und nutzt Angular Standalone Components.
Der Shell-Aufbau steckt in src/app/layout/app-shell.ts. Feature-Seiten liegen
unter src/app/features.
Design- und Implementierungsregeln:
- mobile-first HTML und SCSS
- keine UI-Komponentenbibliothek
- Signals fuer lokalen UI-State
- RxJS fuer HTTP- und API-Flows
- Angular Permissions nur fuer Darstellung und Navigation, nicht als Sicherheitsgrenze
Der permissionGuard verhindert unpassende Navigation im Frontend. Die
verbindliche Autorisierung findet immer im Backend statt.
API-Client
packages/api-client enthaelt den vom Frontend genutzten Angular-Service und die
DTO-Typen. Der Code ist als generiert markiert. Er wird mit folgendem Befehl neu
geschrieben:
npm run api:generate
Der Produktionsbuild ruft diesen Schritt vor Backend- und Frontend-Builds auf. Bei API-Aenderungen muss der Generator synchron zur Backend-API angepasst werden.
Runtime-Aufbau
Im Produktionsbuild entsteht:
apps/backend/dist/main.js
apps/backend/dist/public/index.html
apps/backend/dist/public/assets...
NestJS liefert:
/api/*als JSON API/api/docsals Swagger UI, wenn aktiviert/health/livefuer Liveness/health/readyfuer Readiness inklusive Datenbank- und Migrationspruefung- alle anderen Pfade als Angular SPA Fallback
Datenmodell und Migrationen
TypeORM laeuft mit:
synchronize: falsemigrationsRun: false- expliziten Migrationen unter
apps/backend/src/database/migrations
Der normale App-Start fuehrt keine Migrationen aus. Stattdessen prueft
MigrationHealthService, ob Migrationen fehlen. Dadurch wird verhindert, dass
ein App-Rollout unbemerkt ein Schema veraendert.
Autorisierung
Permissions werden in apps/backend/src/roles/permissions.ts definiert. Rollen
sind Datenbankdaten, Benutzer erhalten Permissions nur ueber Rollen.
Systemrollen:
admin: alle Permissionsuser: Basisrechte fuer Items-Lesen und eigene Sessions
Der erste erfolgreich angemeldete Benutzer wird automatisch Admin. Danach
erhalten neue Benutzer initial die Rolle user.