# 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 ` ### 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