Some checks failed
ci/woodpecker/push/integration Pipeline failed
ci/woodpecker/push/main Pipeline failed
CI/CD Pipeline / Go Tests (push) Has been cancelled
CI/CD Pipeline / Python Tests (push) Has been cancelled
CI/CD Pipeline / Website Tests (push) Has been cancelled
CI/CD Pipeline / Linting (push) Has been cancelled
CI/CD Pipeline / Security Scan (push) Has been cancelled
CI/CD Pipeline / Docker Build & Push (push) Has been cancelled
CI/CD Pipeline / Integration Tests (push) Has been cancelled
CI/CD Pipeline / Deploy to Staging (push) Has been cancelled
CI/CD Pipeline / Deploy to Production (push) Has been cancelled
CI/CD Pipeline / CI Summary (push) Has been cancelled
Security Scanning / Secret Scanning (push) Has been cancelled
Security Scanning / Dependency Vulnerability Scan (push) Has been cancelled
Security Scanning / Go Security Scan (push) Has been cancelled
Security Scanning / Python Security Scan (push) Has been cancelled
Security Scanning / Node.js Security Scan (push) Has been cancelled
Security Scanning / Docker Image Security (push) Has been cancelled
Security Scanning / Security Summary (push) Has been cancelled
Tests / Go Tests (push) Has been cancelled
Tests / Python Tests (push) Has been cancelled
Tests / Integration Tests (push) Has been cancelled
Tests / Go Lint (push) Has been cancelled
Tests / Python Lint (push) Has been cancelled
Tests / Security Scan (push) Has been cancelled
Tests / All Checks Passed (push) Has been cancelled
- Academy, Whistleblower, Incidents frontend pages with API proxies and types - Vendor compliance API proxy route - Go backend handlers and models for all new SDK modules - Investor pitch-deck app with interactive slides - Blog section with DSGVO, AI Act, NIS2, glossary articles - MkDocs documentation site - CI/CD pipelines (Woodpecker, GitHub Actions), security scanning config - Planning and implementation documentation Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
795 lines
31 KiB
Markdown
795 lines
31 KiB
Markdown
# Policy Vault - Projekt-Dokumentation
|
|
|
|
## Projektübersicht
|
|
|
|
**Policy Vault** ist eine vollständige Web-Anwendung zur Verwaltung von Datenschutzrichtlinien, Cookie-Einwilligungen und Nutzerzustimmungen für verschiedene Projekte und Plattformen. Das System ermöglicht es Administratoren, Datenschutzdokumente zu erstellen, zu verwalten und zu versionieren, sowie Nutzereinwilligungen zu verfolgen und Cookie-Präferenzen zu speichern.
|
|
|
|
## Zweck und Anwendungsbereich
|
|
|
|
Das Policy Vault System dient als zentrale Plattform für:
|
|
- **Verwaltung von Datenschutzrichtlinien** (Privacy Policies, Terms of Service, etc.)
|
|
- **Cookie-Consent-Management** mit Kategorisierung und Vendor-Verwaltung
|
|
- **Versionskontrolle** für Richtliniendokumente
|
|
- **Multi-Projekt-Verwaltung** mit rollenbasiertem Zugriff
|
|
- **Nutzereinwilligungs-Tracking** über verschiedene Plattformen hinweg
|
|
- **Mehrsprachige Unterstützung** für globale Anwendungen
|
|
|
|
---
|
|
|
|
## Technologie-Stack
|
|
|
|
### Backend
|
|
- **Framework**: NestJS (Node.js/TypeScript)
|
|
- **Datenbank**: PostgreSQL
|
|
- **ORM**: Drizzle ORM
|
|
- **Authentifizierung**: JWT (JSON Web Tokens) mit Access/Refresh Token
|
|
- **API-Dokumentation**: Swagger/OpenAPI
|
|
- **Validierung**: class-validator, class-transformer
|
|
- **Security**:
|
|
- Encryption-based authentication
|
|
- Rate limiting (Throttler)
|
|
- Role-based access control (RBAC)
|
|
- bcrypt für Password-Hashing
|
|
- **Logging**: Winston mit Daily Rotate File
|
|
- **Job Scheduling**: NestJS Schedule
|
|
- **E-Mail**: Nodemailer
|
|
- **OTP-Generierung**: otp-generator
|
|
|
|
### Frontend
|
|
- **Framework**: Angular 18
|
|
- **UI**:
|
|
- TailwindCSS
|
|
- Custom SCSS
|
|
- **Rich Text Editor**: CKEditor 5
|
|
- Alignment, Block Quote, Code Block
|
|
- Font styling, Image support
|
|
- List und Table support
|
|
- **State Management**: RxJS
|
|
- **Security**: DOMPurify für HTML-Sanitization
|
|
- **Multi-Select**: ng-multiselect-dropdown
|
|
- **Process Manager**: PM2
|
|
|
|
---
|
|
|
|
## Hauptfunktionen und Features
|
|
|
|
### 1. Administratoren-Verwaltung
|
|
- **Super Admin und Admin Rollen**
|
|
- Super Admin (Role 1): Vollzugriff auf alle Funktionen
|
|
- Admin (Role 2): Eingeschränkter Zugriff auf zugewiesene Projekte
|
|
- **Authentifizierung**
|
|
- Login mit E-Mail und Passwort
|
|
- JWT-basierte Sessions (Access + Refresh Token)
|
|
- OTP-basierte Passwort-Wiederherstellung
|
|
- Account-Lock-Mechanismus bei mehrfachen Fehlversuchen
|
|
- **Benutzerverwaltung**
|
|
- Admin-Erstellung durch Super Admin
|
|
- Projekt-Zuweisungen für Admins
|
|
- Rollen-Modifikation (Promote/Demote)
|
|
- Soft-Delete (isDeleted Flag)
|
|
|
|
### 2. Projekt-Management
|
|
- **Projektverwaltung**
|
|
- Erstellung und Verwaltung von Projekten
|
|
- Projekt-spezifische Konfiguration (Theme-Farben, Icons, Logos)
|
|
- Mehrsprachige Unterstützung (Language Configuration)
|
|
- Projekt-Keys für sichere API-Zugriffe
|
|
- Soft-Delete und Blocking von Projekten
|
|
- **Projekt-Zugriffskontrolle**
|
|
- Zuweisung von Admins zu spezifischen Projekten
|
|
- Project-Admin-Beziehungen
|
|
|
|
### 3. Policy Document Management
|
|
- **Dokumentenverwaltung**
|
|
- Erstellung von Datenschutzdokumenten (Privacy Policies, ToS, etc.)
|
|
- Projekt-spezifische Dokumente
|
|
- Beschreibung und Metadaten
|
|
- **Versionierung**
|
|
- Multiple Versionen pro Dokument
|
|
- Version-Metadaten mit Inhalt
|
|
- Publish/Draft-Status
|
|
- Versionsnummern-Tracking
|
|
|
|
### 4. Cookie-Consent-Management
|
|
- **Cookie-Kategorien**
|
|
- Kategorien-Metadaten (z.B. Notwendig, Marketing, Analytics)
|
|
- Plattform-spezifische Kategorien (Web, Mobile, etc.)
|
|
- Versionierung der Kategorien
|
|
- Pflicht- und optionale Kategorien
|
|
- Mehrsprachige Kategorie-Beschreibungen
|
|
- **Vendor-Management**
|
|
- Verwaltung von Drittanbieter-Services
|
|
- Vendor-Metadaten und -Beschreibungen
|
|
- Zuordnung zu Kategorien
|
|
- Sub-Services für Vendors
|
|
- Mehrsprachige Vendor-Informationen
|
|
- **Globale Cookie-Einstellungen**
|
|
- Projekt-weite Cookie-Texte und -Beschreibungen
|
|
- Mehrsprachige globale Inhalte
|
|
- Datei-Upload-Unterstützung
|
|
|
|
### 5. User Consent Tracking
|
|
- **Policy Document Consent**
|
|
- Tracking von Nutzereinwilligungen für Richtlinien-Versionen
|
|
- Username-basiertes Tracking
|
|
- Status (Akzeptiert/Abgelehnt)
|
|
- Timestamp-Tracking
|
|
- **Cookie Consent**
|
|
- Granulare Cookie-Einwilligungen pro Kategorie
|
|
- Vendor-spezifische Einwilligungen
|
|
- Versions-Tracking
|
|
- Username und Projekt-basiert
|
|
- **Verschlüsselte API-Zugriffe**
|
|
- Token-basierte Authentifizierung für Mobile/Web
|
|
- Encryption-based authentication für externe Zugriffe
|
|
|
|
### 6. Mehrsprachige Unterstützung
|
|
- **Language Management**
|
|
- Dynamische Sprachen-Konfiguration pro Projekt
|
|
- Mehrsprachige Inhalte für:
|
|
- Kategorien-Beschreibungen
|
|
- Vendor-Informationen
|
|
- Globale Cookie-Texte
|
|
- Sub-Service-Beschreibungen
|
|
|
|
---
|
|
|
|
## API-Struktur und Endpoints
|
|
|
|
### Admin-Endpoints (`/admins`)
|
|
```
|
|
POST /admins/create-admin - Admin erstellen (Super Admin only)
|
|
POST /admins/create-super-admin - Super Admin erstellen (Super Admin only)
|
|
POST /admins/create-root-user-super-admin - Root Super Admin erstellen (Secret-based)
|
|
POST /admins/login - Admin Login
|
|
GET /admins/get-access-token - Neuen Access Token abrufen
|
|
POST /admins/generate-otp - OTP für Passwort-Reset generieren
|
|
POST /admins/validate-otp - OTP validieren
|
|
POST /admins/change-password - Passwort ändern (mit OTP)
|
|
PUT /admins/update-password - Passwort aktualisieren (eingeloggt)
|
|
PUT /admins/forgot-password - Passwort vergessen
|
|
PUT /admins/make-super-admin - Admin zu Super Admin befördern
|
|
PUT /admins/remove-super-admin - Super Admin zu Admin zurückstufen
|
|
PUT /admins/make-project-admin - Projekt-Zugriff gewähren
|
|
DELETE /admins/remove-project-admin - Projekt-Zugriff entfernen
|
|
GET /admins/findAll?role= - Alle Admins abrufen (gefiltert nach Rolle)
|
|
GET /admins/findAll-super-admins - Alle Super Admins abrufen
|
|
GET /admins/findOne?id= - Einzelnen Admin abrufen
|
|
PUT /admins/update - Admin-Details aktualisieren
|
|
DELETE /admins/delete-admin?id= - Admin löschen (Soft-Delete)
|
|
```
|
|
|
|
### Project-Endpoints (`/project`)
|
|
```
|
|
POST /project/create - Projekt erstellen (Super Admin only)
|
|
PUT /project/v2/updateProjectKeys - Projekt-Keys aktualisieren
|
|
GET /project/findAll - Alle Projekte abrufen (mit Pagination)
|
|
GET /project/findAllByUser - Projekte eines bestimmten Users
|
|
GET /project/findOne?id= - Einzelnes Projekt abrufen
|
|
PUT /project/update - Projekt aktualisieren
|
|
DELETE /project/delete?id= - Projekt löschen
|
|
```
|
|
|
|
### Policy Document-Endpoints (`/policydocument`)
|
|
```
|
|
POST /policydocument/create - Policy Document erstellen
|
|
GET /policydocument/findAll - Alle Policy Documents abrufen
|
|
GET /policydocument/findOne?id= - Einzelnes Policy Document
|
|
GET /policydocument/findPolicyDocs?projectId= - Documents für ein Projekt
|
|
PUT /policydocument/update - Policy Document aktualisieren
|
|
DELETE /policydocument/delete?id= - Policy Document löschen
|
|
```
|
|
|
|
### Version-Endpoints (`/version`)
|
|
```
|
|
POST /version/create - Version erstellen
|
|
GET /version/findAll - Alle Versionen abrufen
|
|
GET /version/findOne?id= - Einzelne Version abrufen
|
|
GET /version/findVersions?policyDocId= - Versionen für ein Policy Document
|
|
PUT /version/update - Version aktualisieren
|
|
DELETE /version/delete?id= - Version löschen
|
|
```
|
|
|
|
### User Consent-Endpoints (`/consent`)
|
|
```
|
|
POST /consent/v2/create - User Consent erstellen (Encrypted)
|
|
GET /consent/v2/GetConsent - Consent abrufen (Encrypted)
|
|
GET /consent/v2/GetConsentFileContent - Consent mit Dateiinhalt (Encrypted)
|
|
GET /consent/v2/latestAcceptedConsent - Letzte akzeptierte Consent
|
|
DELETE /consent/v2/delete - Consent löschen (Encrypted)
|
|
```
|
|
|
|
### Cookie Consent-Endpoints (`/cookieconsent`)
|
|
```
|
|
POST /cookieconsent/v2/create - Cookie Consent erstellen (Encrypted)
|
|
GET /cookieconsent/v2/get - Cookie Kategorien abrufen (Encrypted)
|
|
GET /cookieconsent/v2/getFileContent - Cookie Daten mit Dateiinhalt (Encrypted)
|
|
DELETE /cookieconsent/v2/delete - Cookie Consent löschen (Encrypted)
|
|
```
|
|
|
|
### Cookie-Endpoints (`/cookies`)
|
|
```
|
|
POST /cookies/createCategory - Cookie-Kategorie erstellen
|
|
POST /cookies/createVendor - Vendor erstellen
|
|
POST /cookies/createGlobalCookie - Globale Cookie-Einstellung erstellen
|
|
GET /cookies/getCategories?projectId= - Kategorien für Projekt abrufen
|
|
GET /cookies/getVendors?projectId= - Vendors für Projekt abrufen
|
|
GET /cookies/getGlobalCookie?projectId= - Globale Cookie-Settings
|
|
PUT /cookies/updateCategory - Kategorie aktualisieren
|
|
PUT /cookies/updateVendor - Vendor aktualisieren
|
|
PUT /cookies/updateGlobalCookie - Globale Settings aktualisieren
|
|
DELETE /cookies/deleteCategory?id= - Kategorie löschen
|
|
DELETE /cookies/deleteVendor?id= - Vendor löschen
|
|
DELETE /cookies/deleteGlobalCookie?id= - Globale Settings löschen
|
|
```
|
|
|
|
### Health Check-Endpoint (`/db-health-check`)
|
|
```
|
|
GET /db-health-check - Datenbank-Status prüfen
|
|
```
|
|
|
|
---
|
|
|
|
## Datenmodelle
|
|
|
|
### Admin
|
|
```typescript
|
|
{
|
|
id: number (PK)
|
|
createdAt: timestamp
|
|
updatedAt: timestamp
|
|
employeeCode: string (nullable)
|
|
firstName: string (max 60)
|
|
lastName: string (max 50)
|
|
officialMail: string (unique, max 100)
|
|
role: number (1 = Super Admin, 2 = Admin)
|
|
passwordHash: string
|
|
salt: string (nullable)
|
|
accessToken: text (nullable)
|
|
refreshToken: text (nullable)
|
|
accLockCount: number (default 0)
|
|
accLockTime: number (default 0)
|
|
isBlocked: boolean (default false)
|
|
isDeleted: boolean (default false)
|
|
otp: string (nullable)
|
|
}
|
|
```
|
|
|
|
### Project
|
|
```typescript
|
|
{
|
|
id: number (PK)
|
|
createdAt: timestamp
|
|
updatedAt: timestamp
|
|
name: string (unique)
|
|
description: string
|
|
imageURL: text (nullable)
|
|
iconURL: text (nullable)
|
|
isBlocked: boolean (default false)
|
|
isDeleted: boolean (default false)
|
|
themeColor: string
|
|
textColor: string
|
|
languages: json (nullable) // Array von Sprach-Codes
|
|
}
|
|
```
|
|
|
|
### Policy Document
|
|
```typescript
|
|
{
|
|
id: number (PK)
|
|
createdAt: timestamp
|
|
updatedAt: timestamp
|
|
name: string
|
|
description: string (nullable)
|
|
projectId: number (FK -> project.id, CASCADE)
|
|
}
|
|
```
|
|
|
|
### Version (Policy Document Meta & Version Meta)
|
|
```typescript
|
|
// Policy Document Meta
|
|
{
|
|
id: number (PK)
|
|
createdAt: timestamp
|
|
updatedAt: timestamp
|
|
policyDocumentId: number (FK)
|
|
version: string
|
|
isPublish: boolean
|
|
}
|
|
|
|
// Version Meta (Sprachspezifischer Inhalt)
|
|
{
|
|
id: number (PK)
|
|
createdAt: timestamp
|
|
updatedAt: timestamp
|
|
policyDocMetaId: number (FK)
|
|
language: string
|
|
content: text
|
|
file: text (nullable)
|
|
}
|
|
```
|
|
|
|
### User Consent
|
|
```typescript
|
|
{
|
|
id: number (PK)
|
|
createdAt: timestamp
|
|
updatedAt: timestamp
|
|
username: string
|
|
status: boolean
|
|
projectId: number (FK -> project.id, CASCADE)
|
|
versionMetaId: number (FK -> versionMeta.id, CASCADE)
|
|
}
|
|
```
|
|
|
|
### Cookie Consent
|
|
```typescript
|
|
{
|
|
id: number (PK)
|
|
createdAt: timestamp
|
|
updatedAt: timestamp
|
|
username: string
|
|
categoryId: number[] (Array)
|
|
vendors: number[] (Array)
|
|
projectId: number (FK -> project.id, CASCADE)
|
|
version: string
|
|
}
|
|
```
|
|
|
|
### Categories Metadata
|
|
```typescript
|
|
{
|
|
id: number (PK)
|
|
createdAt: timestamp
|
|
updatedAt: timestamp
|
|
projectId: number (FK -> project.id, CASCADE)
|
|
platform: string
|
|
version: string
|
|
isPublish: boolean (default false)
|
|
metaName: string
|
|
isMandatory: boolean (default false)
|
|
}
|
|
```
|
|
|
|
### Categories Language Data
|
|
```typescript
|
|
{
|
|
id: number (PK)
|
|
createdAt: timestamp
|
|
updatedAt: timestamp
|
|
categoryMetaId: number (FK -> categoriesMetadata.id, CASCADE)
|
|
language: string
|
|
title: string
|
|
description: text
|
|
}
|
|
```
|
|
|
|
### Vendor Meta
|
|
```typescript
|
|
{
|
|
id: number (PK)
|
|
createdAt: timestamp
|
|
updatedAt: timestamp
|
|
categoryId: number (FK -> categoriesMetadata.id, CASCADE)
|
|
vendorName: string
|
|
}
|
|
```
|
|
|
|
### Vendor Language
|
|
```typescript
|
|
{
|
|
id: number (PK)
|
|
createdAt: timestamp
|
|
updatedAt: timestamp
|
|
vendorMetaId: number (FK -> vendorMeta.id, CASCADE)
|
|
language: string
|
|
description: text
|
|
}
|
|
```
|
|
|
|
### Sub Service
|
|
```typescript
|
|
{
|
|
id: number (PK)
|
|
createdAt: timestamp
|
|
updatedAt: timestamp
|
|
vendorMetaId: number (FK -> vendorMeta.id, CASCADE)
|
|
serviceName: string
|
|
}
|
|
```
|
|
|
|
### Global Cookie Metadata
|
|
```typescript
|
|
{
|
|
id: number (PK)
|
|
createdAt: timestamp
|
|
updatedAt: timestamp
|
|
projectId: number (FK -> project.id, CASCADE)
|
|
version: string
|
|
isPublish: boolean (default false)
|
|
}
|
|
```
|
|
|
|
### Global Cookie Language Data
|
|
```typescript
|
|
{
|
|
id: number (PK)
|
|
createdAt: timestamp
|
|
updatedAt: timestamp
|
|
globalCookieMetaId: number (FK -> globalCookieMetadata.id, CASCADE)
|
|
language: string
|
|
title: string
|
|
description: text
|
|
file: text (nullable)
|
|
}
|
|
```
|
|
|
|
### Project Keys
|
|
```typescript
|
|
{
|
|
id: number (PK)
|
|
createdAt: timestamp
|
|
updatedAt: timestamp
|
|
projectId: number (FK -> project.id, CASCADE)
|
|
publicKey: text
|
|
privateKey: text
|
|
}
|
|
```
|
|
|
|
### Admin Projects (Junction Table)
|
|
```typescript
|
|
{
|
|
id: number (PK)
|
|
adminId: number (FK -> admin.id, CASCADE)
|
|
projectId: number (FK -> project.id, CASCADE)
|
|
}
|
|
```
|
|
|
|
---
|
|
|
|
## Architektur-Übersicht
|
|
|
|
### Backend-Architektur
|
|
|
|
```
|
|
┌─────────────────────────────────────────────────────────────┐
|
|
│ NestJS Backend │
|
|
├─────────────────────────────────────────────────────────────┤
|
|
│ │
|
|
│ ┌──────────────┐ ┌──────────────┐ ┌──────────────┐ │
|
|
│ │ Guards │ │ Middlewares │ │ Interceptors │ │
|
|
│ ├──────────────┤ ├──────────────┤ ├──────────────┤ │
|
|
│ │ - AuthGuard │ │ - Token │ │ - Serialize │ │
|
|
│ │ - RolesGuard │ │ - Decrypt │ │ - Logging │ │
|
|
│ │ - Throttler │ │ - Headers │ │ │ │
|
|
│ └──────────────┘ └──────────────┘ └──────────────┘ │
|
|
│ │
|
|
│ ┌───────────────────────────────────────────────────┐ │
|
|
│ │ API Modules │ │
|
|
│ ├───────────────────────────────────────────────────┤ │
|
|
│ │ - Admins (Authentication, Authorization) │ │
|
|
│ │ - Projects (Multi-tenant Management) │ │
|
|
│ │ - Policy Documents (Document Management) │ │
|
|
│ │ - Versions (Versioning System) │ │
|
|
│ │ - User Consent (Consent Tracking) │ │
|
|
│ │ - Cookies (Cookie Categories & Vendors) │ │
|
|
│ │ - Cookie Consent (Cookie Consent Tracking) │ │
|
|
│ │ - DB Health Check (System Monitoring) │ │
|
|
│ └───────────────────────────────────────────────────┘ │
|
|
│ │
|
|
│ ┌───────────────────────────────────────────────────┐ │
|
|
│ │ Drizzle ORM Layer │ │
|
|
│ ├───────────────────────────────────────────────────┤ │
|
|
│ │ - Schema Definitions │ │
|
|
│ │ - Relations │ │
|
|
│ │ - Database Connection Pool │ │
|
|
│ └───────────────────────────────────────────────────┘ │
|
|
│ │ │
|
|
└──────────────────────────┼────────────────────────────────────┘
|
|
│
|
|
▼
|
|
┌─────────────────┐
|
|
│ PostgreSQL │
|
|
│ Database │
|
|
└─────────────────┘
|
|
```
|
|
|
|
### Frontend-Architektur
|
|
|
|
```
|
|
┌─────────────────────────────────────────────────────────────┐
|
|
│ Angular Frontend │
|
|
├─────────────────────────────────────────────────────────────┤
|
|
│ │
|
|
│ ┌──────────────┐ ┌──────────────┐ ┌──────────────┐ │
|
|
│ │ Guards │ │ Interceptors │ │ Services │ │
|
|
│ ├──────────────┤ ├──────────────┤ ├──────────────┤ │
|
|
│ │ - AuthGuard │ │ - HTTP │ │ - Auth │ │
|
|
│ │ │ │ - Error │ │ - REST API │ │
|
|
│ │ │ │ │ │ - Session │ │
|
|
│ │ │ │ │ │ - Security │ │
|
|
│ └──────────────┘ └──────────────┘ └──────────────┘ │
|
|
│ │
|
|
│ ┌───────────────────────────────────────────────────┐ │
|
|
│ │ Feature Modules │ │
|
|
│ ├───────────────────────────────────────────────────┤ │
|
|
│ │ ┌─────────────────────────────────────────┐ │ │
|
|
│ │ │ Auth Module │ │ │
|
|
│ │ │ - Login Component │ │ │
|
|
│ │ └─────────────────────────────────────────┘ │ │
|
|
│ │ │ │
|
|
│ │ ┌─────────────────────────────────────────┐ │ │
|
|
│ │ │ Project Dashboard │ │ │
|
|
│ │ │ - Project List │ │ │
|
|
│ │ │ - Project Creation │ │ │
|
|
│ │ │ - Project Settings │ │ │
|
|
│ │ └─────────────────────────────────────────┘ │ │
|
|
│ │ │ │
|
|
│ │ ┌─────────────────────────────────────────┐ │ │
|
|
│ │ │ Individual Project Dashboard │ │ │
|
|
│ │ │ - Agreements (Policy Documents) │ │ │
|
|
│ │ │ - Cookie Consent Management │ │ │
|
|
│ │ │ - FAQ Management │ │ │
|
|
│ │ │ - Licenses Management │ │ │
|
|
│ │ │ - User Management │ │ │
|
|
│ │ │ - Project Settings │ │ │
|
|
│ │ └─────────────────────────────────────────┘ │ │
|
|
│ │ │ │
|
|
│ │ ┌─────────────────────────────────────────┐ │ │
|
|
│ │ │ Shared Components │ │ │
|
|
│ │ │ - Settings │ │ │
|
|
│ │ │ - Common UI Elements │ │ │
|
|
│ │ └─────────────────────────────────────────┘ │ │
|
|
│ └───────────────────────────────────────────────────┘ │
|
|
│ │
|
|
└─────────────────────────────────────────────────────────────┘
|
|
│
|
|
│ HTTPS/REST API
|
|
▼
|
|
┌─────────────────┐
|
|
│ NestJS Backend │
|
|
└─────────────────┘
|
|
```
|
|
|
|
### Datenbankbeziehungen
|
|
|
|
```
|
|
┌──────────┐ ┌─────────────────┐ ┌─────────────┐
|
|
│ Admin │◄───────►│ AdminProjects │◄───────►│ Project │
|
|
└──────────┘ └─────────────────┘ └─────────────┘
|
|
│
|
|
│ 1:N
|
|
┌────────────────────────────────────┤
|
|
│ │
|
|
▼ ▼
|
|
┌──────────────────────┐ ┌──────────────────────────┐
|
|
│ Policy Document │ │ Categories Metadata │
|
|
└──────────────────────┘ └──────────────────────────┘
|
|
│ │
|
|
│ 1:N │ 1:N
|
|
▼ ▼
|
|
┌──────────────────────┐ ┌──────────────────────────┐
|
|
│ Policy Document Meta │ │ Categories Language Data │
|
|
└──────────────────────┘ └──────────────────────────┘
|
|
│ │
|
|
│ 1:N │ 1:N
|
|
▼ ▼
|
|
┌──────────────────────┐ ┌──────────────────────────┐
|
|
│ Version Meta │ │ Vendor Meta │
|
|
└──────────────────────┘ └──────────────────────────┘
|
|
│ │
|
|
│ 1:N │ 1:N
|
|
▼ ├──────────┐
|
|
┌──────────────────────┐ ▼ ▼
|
|
│ User Consent │ ┌─────────────────┐ ┌────────────┐
|
|
└──────────────────────┘ │ Vendor Language │ │Sub Service │
|
|
└─────────────────┘ └────────────┘
|
|
┌──────────────────────┐
|
|
│ Cookie Consent │◄─── Project
|
|
└──────────────────────┘
|
|
|
|
┌─────────────────────────┐
|
|
│ Global Cookie Metadata │◄─── Project
|
|
└─────────────────────────┘
|
|
│
|
|
│ 1:N
|
|
▼
|
|
┌─────────────────────────────┐
|
|
│ Global Cookie Language Data │
|
|
└─────────────────────────────────┘
|
|
|
|
┌──────────────────┐
|
|
│ Project Keys │◄─── Project
|
|
└──────────────────┘
|
|
```
|
|
|
|
### Sicherheitsarchitektur
|
|
|
|
#### Authentifizierung & Autorisierung
|
|
1. **JWT-basierte Authentifizierung**
|
|
- Access Token (kurzlebig)
|
|
- Refresh Token (langlebig)
|
|
- Token-Refresh-Mechanismus
|
|
|
|
2. **Rollenbasierte Zugriffskontrolle (RBAC)**
|
|
- Super Admin (Role 1): Vollzugriff
|
|
- Admin (Role 2): Projektbezogener Zugriff
|
|
- Guard-basierte Absicherung auf Controller-Ebene
|
|
|
|
3. **Encryption-based Authentication**
|
|
- Für externe/mobile Zugriffe
|
|
- Token-basierte Verschlüsselung
|
|
- User + Project ID Validierung
|
|
|
|
#### Security Features
|
|
- **Rate Limiting**: Throttler mit konfigurierbaren Limits
|
|
- **Password Security**: bcrypt Hashing mit Salt
|
|
- **Account Lock**: Nach mehrfachen Fehlversuchen
|
|
- **OTP-basierte Passwort-Wiederherstellung**
|
|
- **Input Validation**: class-validator auf allen DTOs
|
|
- **HTML Sanitization**: DOMPurify im Frontend
|
|
- **CORS Configuration**: Custom Headers Middleware
|
|
- **Soft Delete**: Keine permanente Löschung von Daten
|
|
|
|
---
|
|
|
|
## Deployment und Konfiguration
|
|
|
|
### Backend Environment Variables
|
|
```env
|
|
DATABASE_URL=postgresql://username:password@host:port/database
|
|
NODE_ENV=development|test|production|local|demo
|
|
PORT=3000
|
|
JWT_SECRET=your_jwt_secret
|
|
JWT_REFRESH_SECRET=your_refresh_secret
|
|
ROOT_SECRET=your_root_secret
|
|
ENCRYPTION_KEY=your_encryption_key
|
|
SMTP_HOST=smtp.example.com
|
|
SMTP_PORT=587
|
|
SMTP_USER=your_email
|
|
SMTP_PASSWORD=your_password
|
|
```
|
|
|
|
### Frontend Environment
|
|
```typescript
|
|
{
|
|
production: false,
|
|
BASE_URL: "https://api.example.com/api/",
|
|
TITLE: "Policy Vault - Environment"
|
|
}
|
|
```
|
|
|
|
### Datenbank-Setup
|
|
```bash
|
|
# Migrationen ausführen
|
|
npm run migration:up
|
|
|
|
# Migrationen zurückrollen
|
|
npm run migration:down
|
|
|
|
# Schema generieren
|
|
npx drizzle-kit push
|
|
```
|
|
|
|
---
|
|
|
|
## API-Sicherheit
|
|
|
|
### Token-basierte Authentifizierung
|
|
- Alle geschützten Endpoints erfordern einen gültigen JWT-Token im Authorization-Header
|
|
- Format: `Authorization: Bearer <access_token>`
|
|
|
|
### Encryption-based Endpoints
|
|
Für mobile/externe Zugriffe (Consent Tracking):
|
|
- Header: `secret` oder `mobiletoken`
|
|
- Format: Verschlüsselter String mit `userId_projectId`
|
|
- Automatische Validierung durch DecryptMiddleware
|
|
|
|
### Rate Limiting
|
|
- Standard: 10 Requests pro Minute
|
|
- OTP/Login: 3 Requests pro Minute
|
|
- Konfigurierbar über ThrottlerModule
|
|
|
|
---
|
|
|
|
## Besondere Features
|
|
|
|
### 1. Versionierung
|
|
- Komplettes Versions-Management für Policy Documents
|
|
- Mehrsprachige Versionen mit separaten Inhalten
|
|
- Publish/Draft Status
|
|
- Historische Versionsverfolgung
|
|
|
|
### 2. Mehrsprachigkeit
|
|
- Zentrale Sprach-Konfiguration pro Projekt
|
|
- Separate Language-Data Tabellen für alle Inhaltstypen
|
|
- Support für unbegrenzte Sprachen
|
|
|
|
### 3. Cookie-Consent-System
|
|
- Granulare Kontrolle über Cookie-Kategorien
|
|
- Vendor-Management mit Sub-Services
|
|
- Plattform-spezifische Kategorien (Web, Mobile, etc.)
|
|
- Versions-Tracking für Compliance
|
|
|
|
### 4. Rich Content Editing
|
|
- CKEditor 5 Integration
|
|
- Support für komplexe Formatierungen
|
|
- Bild-Upload und -Verwaltung
|
|
- Code-Block-Unterstützung
|
|
|
|
### 5. Logging & Monitoring
|
|
- Winston-basiertes Logging
|
|
- Daily Rotate Files
|
|
- Structured Logging
|
|
- Fehler-Tracking
|
|
- Datenbank-Health-Checks
|
|
|
|
### 6. Soft Delete Pattern
|
|
- Keine permanente Datenlöschung
|
|
- `isDeleted` Flags auf allen Haupt-Entitäten
|
|
- Möglichkeit zur Wiederherstellung
|
|
- Audit Trail Erhaltung
|
|
|
|
---
|
|
|
|
## Entwicklung
|
|
|
|
### Backend starten
|
|
```bash
|
|
# Development
|
|
npm run start:dev
|
|
|
|
# Local (mit Watch)
|
|
npm run start:local
|
|
|
|
# Production
|
|
npm run start:prod
|
|
```
|
|
|
|
### Frontend starten
|
|
```bash
|
|
# Development Server
|
|
npm run start
|
|
# oder
|
|
ng serve
|
|
|
|
# Build
|
|
npm run build
|
|
|
|
# Mit PM2
|
|
npm run start:pm2
|
|
```
|
|
|
|
### Tests
|
|
```bash
|
|
# Backend Tests
|
|
npm run test
|
|
npm run test:e2e
|
|
npm run test:cov
|
|
|
|
# Frontend Tests
|
|
npm run test
|
|
```
|
|
|
|
---
|
|
|
|
## Zusammenfassung
|
|
|
|
Policy Vault ist eine umfassende Enterprise-Lösung für die Verwaltung von Datenschutzrichtlinien und Cookie-Einwilligungen. Das System bietet:
|
|
|
|
- **Multi-Tenant-Architektur** mit Projekt-basierter Trennung
|
|
- **Robuste Authentifizierung** mit JWT und rollenbasierter Zugriffskontrolle
|
|
- **Vollständiges Versions-Management** für Compliance-Tracking
|
|
- **Granulare Cookie-Consent-Verwaltung** mit Vendor-Support
|
|
- **Mehrsprachige Unterstützung** für globale Anwendungen
|
|
- **Moderne Tech-Stack** mit NestJS, Angular und PostgreSQL
|
|
- **Enterprise-Grade Security** mit Encryption, Rate Limiting und Audit Trails
|
|
- **Skalierbare Architektur** mit klarer Trennung von Concerns
|
|
|
|
Das System eignet sich ideal für Unternehmen, die:
|
|
- Multiple Projekte/Produkte mit unterschiedlichen Datenschutzrichtlinien verwalten
|
|
- GDPR/DSGVO-Compliance sicherstellen müssen
|
|
- Granulare Cookie-Einwilligungen tracken wollen
|
|
- Mehrsprachige Anwendungen betreiben
|
|
- Eine zentrale Policy-Management-Plattform benötigen
|