cms.c2sgmbh/docs/anleitungen/TODO.md
Martin Porwoll ce4962e74b feat: BullMQ queue system for email and PDF processing
- Add BullMQ-based job queue with Redis backend
- Implement email worker with tenant-specific SMTP support
- Add PDF worker with Playwright for HTML/URL-to-PDF generation
- Create /api/generate-pdf endpoint with job status polling
- Fix TypeScript errors in Tenants, TenantBreadcrumb, TenantDashboard
- Fix type casts in auditAuthEvents and audit-service
- Remove credentials from ecosystem.config.cjs (now loaded via dotenv)
- Fix ESM __dirname issue with fileURLToPath for PM2 compatibility

🤖 Generated with [Claude Code](https://claude.com/claude-code)

Co-Authored-By: Claude <noreply@anthropic.com>
2025-12-09 22:59:17 +00:00

22 KiB

To-Do-Liste - Payload CMS Multi-Tenant Projekt

Legende

  • Offen
  • Erledigt
  • [~] In Bearbeitung
  • [!] Hohe Priorität
  • [?] Klärungsbedarf

Phase 1: Grundlagen (Abgeschlossen)

Infrastruktur

  • Payload CMS 3.x Installation
  • PostgreSQL-Datenbank eingerichtet
  • PM2 Process Manager konfiguriert
  • Caddy Reverse Proxy mit SSL
  • Multi-Tenant Plugin aktiviert
  • Git & GitHub Repository Setup (05.12.2025)

Basis-Collections

  • Users Collection
    • isSuperAdmin Feld hinzugefügt (05.12.2025)
    • Migration erstellt: 20251202_081830_add_is_super_admin_to_users
  • Media Collection
  • Tenants Collection
  • Pages Collection

Globals

  • SiteSettings
  • Navigation

Phase 2: Universal Features (Abgeschlossen)

Collections

  • Posts Collection (Blog, News, Presse, Ankündigungen)
    • Feld type (blog, news, press, announcement)
    • Feld isFeatured
    • Feld excerpt
  • Categories Collection
  • Testimonials Collection
  • Newsletter Subscribers Collection
    • Double Opt-In Support
    • DSGVO-konforme Felder (IP, Timestamps)
  • Social Links Collection

Blocks

  • Hero Block
  • Text Block
  • Image Text Block
  • Card Grid Block
  • Quote Block
  • CTA Block
  • Contact Form Block
  • Video Block
  • Divider Block
  • Timeline Block
  • Posts List Block
  • Testimonials Block
  • Newsletter Block
  • Process Steps Block
  • Cookie Configurations Collection
  • Cookie Inventory Collection
  • Consent Logs Collection
  • Privacy Policy Settings Collection

Phase 3: Offene Aufgaben

Hohe Priorität

  • Tenant-Domains konfigurieren (Erledigt: 07.12.2025)

    • Domains in Tenants Collection eingetragen
    • DNS-Einträge konfiguriert
    • Caddy-Konfiguration (nicht benötigt im Tech-Stack)
  • E-Mail-System (Erledigt: 06.12.2025)

    • Multi-Tenant Email Adapter für Payload CMS
    • Tenant-spezifische SMTP-Konfiguration in Tenants Collection
    • EmailLogs Collection für Protokollierung aller E-Mails
    • REST-Endpoint /api/send-email mit:
      • Authentifizierung & Tenant-Zugriffskontrolle
      • Rate-Limiting (10 E-Mails/Minute pro User)
    • Form-Submission Notifications
    • Cache-Invalidierung bei Config-Änderungen
    • SMTP-Passwort-Schutz (nie in API-Responses)
    • SMTP-Credentials in .env konfigurieren (TODO)
    • Newsletter Double Opt-In E-Mails (TODO)
  • [!] Frontend-Komponenten entwickeln

    • React/Next.js Komponenten für alle Blocks
    • Newsletter-Anmelde-Formular
    • Cookie-Banner implementieren

Mittlere Priorität

  • Bild-Optimierung (Erledigt: 30.11.2025)

    • Sharp Plugin konfiguriert
    • 11 Responsive Image Sizes definiert (thumbnail, small, medium, large, xlarge, 2k, og + AVIF-Varianten)
    • WebP/AVIF Format aktiviert
    • Fokuspunkt-Support
    • Zusätzliche Felder (caption, credit, tags)
    • Dokumentation: docs/anleitungen/BILDOPTIMIERUNG.md
  • SEO-Erweiterungen (Erledigt: 30.11.2025)

    • Sitemap-Generator (/sitemap.xml)
    • robots.txt (/robots.txt)
    • Structured Data (JSON-LD) Helpers
    • SEO Settings Global im Admin-Panel
    • Dokumentation: docs/anleitungen/SEO_ERWEITERUNG.md
  • Suche implementieren (Erledigt: 30.11.2025)

    • Volltextsuche für Posts (/api/search)
    • Filterbare Kategorie-Ansichten (/api/posts?category=...)
    • Auto-Complete Funktion (/api/search/suggestions)
    • Rate Limiting (30 Requests/Minute)
    • TTL-Caching (60 Sekunden)
    • Dokumentation: src/lib/search.ts
  • Mehrsprachigkeit (i18n) (Erledigt: 30.11.2025)

    • Admin UI: Deutsch & Englisch (@payloadcms/translations)
    • Content Localization: DE (default), EN mit Fallback
    • Alle Collections lokalisiert (Pages, Posts, Categories, Testimonials)
    • Alle 14 Blocks lokalisiert
    • Alle Globals lokalisiert (SiteSettings, Navigation, SEOSettings)
    • 36 _locales Tabellen in PostgreSQL
    • Search API mit locale Parameter
    • Frontend Locale Routing (/[locale]/...)
    • Hinweis: Datenbank wurde zurückgesetzt (war leer)

Niedrige Priorität

  • Analytics Integration

    • 1. Umami Analytics (cookieless, ohne Consent)
      • Umami-Server auf sv-analytics (10.10.181.103) einrichten
      • Website-IDs für alle 4 Tenants in Umami erstellen
      • src/config/analytics.ts mit Website-IDs anlegen
      • src/components/analytics/UmamiScript.tsx implementieren
      • Umami Script in Root Layout einbinden (Multi-Tenant)
      • src/hooks/useAnalytics.ts Hook für Custom Events
      • src/lib/analytics.server.ts für Server-Side Events
      • Event-Tracking in Newsletter-Formular integrieren
      • Event-Tracking in CTA-Buttons integrieren
      • TrackedButton & TrackedDownload Komponenten erstellen
    • 2. Google Ads Conversion (mit Consent)
      • src/components/analytics/GoogleConsentMode.tsx implementieren
      • Google Consent Mode v2 mit Orestbida Cookie-Banner integrieren
      • src/hooks/useGclid.ts Hook für GCLID-Erfassung
      • src/lib/google-ads.ts Client-Side Conversion Tracking
      • src/lib/google-ads.server.ts Server-Side Conversion API
      • Enhanced Conversions mit gehashten E-Mails
    • 3. Cookie Inventory
      • Google Ads Cookies (_gcl_au, _gcl_aw, IDE) zur Cookie Inventory Collection hinzufügen
    • 4. Environment Variables
      • NEXT_PUBLIC_UMAMI_HOST in .env.local
      • NEXT_PUBLIC_GOOGLE_ADS_ID in .env.local (pro Tenant)
      • UMAMI_HOST, UMAMI_WEBSITE_ID in Backend .env
      • Google Ads API Credentials in Backend .env
    • Dokumentation: docs/anleitungen/ANALYTICS_IMPLEMENTATION_GUIDE.md
  • Redis Caching (Erledigt: 05.12.2025)

    • Redis-Cache für API-Responses
    • TTL-basierte Invalidierung
    • Pattern-basierte Cache-Invalidierung
    • CDN-Integration (Cloudflare) (TODO)
  • [~] Backup-System

    • Manuelle Datenbank-Backups (pg_dump)
    • SQL-Dateien in .gitignore
    • Backup via Git (temporär für Migration)
    • Automatische Datenbank-Backups (Cron)
    • Media-Backup zu S3/MinIO
    • Disaster Recovery Plan
    • Backup-Rotation (30 Tage Retention)
  • Monitoring & Logging (→ siehe Phase 4: Produktionsreife)

    • Sentry Error Tracking
    • Prometheus Metrics
    • Grafana Dashboard

Phase 4: Produktionsreife (Audit-basiert)

Basierend auf Audit-Analyse vom 07.12.2025

[!] Hohe Priorität - Stabilität & Sicherheit

Monitoring & Alerting

  • AuditLogs Collection (Erledigt: 07.12.2025)
    • Collection erstellen für: Tenant-Änderungen, Admin-Login, kritische Aktionen
    • Automatisches Logging via Collection Hooks (Users, Tenants)
    • Sensitive Data Masking (Passwörter, Secrets)
    • Retention Policy (90 Tage) - Cron-Job TODO
  • Email-Fehler Alerting (Erledigt: 07.12.2025)
    • Hook bei wiederholten failed-Status in EmailLogs
    • Multi-Channel Alert Service (E-Mail, Slack, Discord, Console)
    • Konfigurierbare Alert-Level (info, warning, error, critical)
    • Dashboard-Widget für Email-Status im Admin
  • Email-Logs Admin-Verbesserungen (Erledigt: 07.12.2025)
    • Filter nach Status (pending/sent/failed) im Admin
    • Export-Endpoint für Email-Logs (CSV/JSON) - /api/email-logs/export
    • Statistik-Endpoint (letzte 24h/7d/30d) - /api/email-logs/stats

Backup & Recovery

  • Automatisierte Datenbank-Backups
    • Cron-Job für tägliche pg_dump
    • Offsite-Storage (S3/MinIO)
    • Backup-Rotation (30 Tage Retention)
    • Dokumentierter Restore-Prozess
  • Media-Backup
    • S3/MinIO Integration für Media-Uploads
    • Versionierung aktivieren
    • Sync-Script für Offsite-Backup

Security Hardening

  • API-Schutz erweitern (Erledigt: 07.12.2025)
    • Globales Rate-Limiting für alle öffentlichen Endpoints
      • Zentraler Rate-Limiter Service (src/lib/security/rate-limiter.ts)
      • Vordefinierte Limiter: publicApi (60/min), auth (5/15min), email (10/min), search (30/min), form (5/10min)
      • Redis-Support für verteilte Systeme mit In-Memory-Fallback
    • IP-Allowlist Option für /api/send-email
      • Konfiguration via SEND_EMAIL_ALLOWED_IPS env
      • Unterstützt IPs, CIDRs und Wildcards
      • Globale Blocklist via BLOCKED_IPS env
    • CSRF-Schutz für Browser-basierte API-Calls
      • Double Submit Cookie Pattern
      • Origin-Header-Validierung
      • Token-Endpoint: GET /api/csrf-token
  • Sensitive Data Masking (Erledigt: 07.12.2025)
    • Zentraler Data-Masking-Service (src/lib/security/data-masking.ts)
    • Automatische Maskierung von Passwörtern, Tokens, API-Keys
    • Safe-Logger-Factory für konsistentes Logging
    • Rekursive Object-Maskierung für Audit-Logs
  • Secrets Scanning (Erledigt: 07.12.2025)
    • Pre-commit Hook für Secret-Detection (scripts/detect-secrets.sh)
    • GitHub Actions Workflow für Gitleaks und CodeQL
    • Gitleaks-Konfiguration (.gitleaks.toml)
    • Dependency Vulnerability Scanning

Mittlere Priorität - Performance & Skalierung

Search Performance

  • Full-Text-Search aktivieren (Erledigt: 09.12.2025)
    • USE_FTS=true in Production gesetzt
    • PostgreSQL to_tsvector-Indices erstellt:
      • posts_locales_fts_title_idx (GIN auf title)
      • posts_locales_fts_excerpt_idx (GIN auf excerpt)
      • posts_locales_fts_combined_idx (GIN auf title + excerpt)
      • pages_locales_fts_title_idx (GIN auf title)
      • categories_locales_fts_name_idx (GIN auf name)
    • Deutsche Sprachkonfiguration (german config)
    • Relevanz-Ranking mit ts_rank()
    • Prefix-Suche mit :* Operator
    • Fallback auf ILIKE bei USE_FTS=false
  • Redis-Migration für Caches
    • Search-Cache von In-Memory auf Redis migrieren
    • Rate-Limit-Maps auf Redis migrieren
    • Suggestions-Cache auf Redis

Background Jobs

  • Queue-System implementieren (Erledigt: 09.12.2025)

    • BullMQ oder Agenda.js evaluieren → Empfehlung: BullMQ
    • E-Mail-Versand über Queue (non-blocking)
      • Queue-Service: src/lib/queue/queue-service.ts
      • Email-Job: src/lib/queue/jobs/email-job.ts
      • Email-Worker: src/lib/queue/workers/email-worker.ts
      • API-Integration: queued: true Option in /api/send-email
    • PDF-Generierung über Queue (Erledigt: 09.12.2025)
      • PDF-Job: src/lib/queue/jobs/pdf-job.ts
      • PDF-Service: src/lib/pdf/pdf-service.ts (Playwright-basiert)
      • PDF-Worker: src/lib/queue/workers/pdf-worker.ts
      • API-Endpoint: /api/generate-pdf (POST für Generierung, GET für Job-Status)
      • Unterstützt HTML-zu-PDF und URL-zu-PDF
      • PM2-Integration mit konfigurierbaren Workern
    • Job-Dashboard im Admin
      • Queue-Status: GET /api/admin/queues (SuperAdmin only)
      • Queue-Jobs: GET /api/admin/queues/[name]/jobs
      • Queue-Actions: POST /api/admin/queues (pause, resume, clean, drain)

    Evaluation BullMQ vs Agenda.js:

    Kriterium BullMQ Agenda.js
    Database Redis (bereits vorhanden) MongoDB (neue Dependency)
    TypeScript Native Begrenzt ⚠️
    Priority Jobs Ja Nein
    Rate Limiting Ja Nein
    Delayed Jobs Ja Ja
    Repeatable Jobs Ja Ja
    UI Dashboard @bull-board Keine Built-in
    Weekly Downloads 1.6M 120K
    Maintenance Aktiv Weniger aktiv

    Entscheidung: BullMQ wegen:

    1. Redis bereits im Stack (keine neue DB)
    2. Native TypeScript-Unterstützung
    3. Priority Jobs & Rate Limiting für Multi-Tenant
    4. @bull-board für Admin-Dashboard
    5. Höhere Aktivität und Downloads

    Implementierungsplan:

    1. pnpm add bullmq @bull-board/api @bull-board/express
    2. Queue-Service (src/lib/queue/queue-service.ts)
    3. Job-Definitionen (src/lib/queue/jobs/)
    4. Worker-Script (scripts/run-queue-worker.ts)
    5. PM2-Integration (separater Prozess)
    6. Admin-Dashboard Route (/admin/jobs)

    Betroffene Dateien für E-Mail-Queue:

    • src/lib/email/tenant-email-service.ts
    • src/app/(payload)/api/send-email/route.ts
    • src/app/(payload)/api/test-email/route.ts
    • src/lib/alerting/alert-service.ts
    • src/hooks/sendFormNotification.ts

Database Optimization

  • Index-Audit (Erledigt: 09.12.2025)
    • Composite-Indices für lokalisierte Felder (slug + locale)
      • posts_locales_slug_locale_idx
      • pages_locales_slug_locale_idx
      • categories_locales_slug_locale_idx
    • Query-Performance-Analyse
    • EXPLAIN ANALYZE für häufige Queries
    • Zusätzliche Performance-Indexes erstellt:
      • posts_status_tenant_idx (status + tenant)
      • posts_type_tenant_idx (type + tenant)
      • posts_published_at_idx (chronologische Sortierung)
      • posts_is_featured_tenant_idx (partial index)
      • email_logs_status_tenant_idx, email_logs_status_created_at_idx
      • audit_logs_action_created_at_idx
      • newsletter_subscribers_status_tenant_idx
      • consent_logs_created_at_desc_idx
  • Connection Pooling
    • PgBouncer evaluieren für Multi-Instanz-Betrieb

Build & Infrastructure

  • Memory-Problem lösen
    • Swap auf Server aktivieren (2-4GB)
    • Alternativ: Build auf separatem Runner
  • PM2 Cluster Mode
    • Multi-Instanz Konfiguration testen
    • Shared State via Redis sicherstellen

Niedrige Priorität - Developer Experience & UX

Testing & CI/CD

  • Security Test Suite (Erledigt: 08.12.2025)
    • Unit Tests für Rate-Limiter (tests/unit/security/rate-limiter.unit.spec.ts)
    • Unit Tests für CSRF Protection (tests/unit/security/csrf.unit.spec.ts)
    • Unit Tests für IP-Allowlist (tests/unit/security/ip-allowlist.unit.spec.ts)
    • Unit Tests für Data-Masking (tests/unit/security/data-masking.unit.spec.ts)
    • API Integration Tests (tests/int/security-api.int.spec.ts)
    • Test Utilities (tests/helpers/security-test-utils.ts)
    • Dedicated Script: pnpm test:security
    • CI Integration in .github/workflows/security.yml
  • Test-Suite erweitern (Erledigt: 09.12.2025)
    • Test-DB mit Migrationen aufsetzen (Locale-Tabellen bereits vorhanden)
    • Skipped Tests aktivieren (search, i18n) - alle 9 Tests nun aktiv
    • Coverage-Report generieren (pnpm test:coverage)
      • Vitest v8 Coverage Provider konfiguriert
      • HTML/LCOV/Text Reports in ./coverage/
      • Thresholds: 35% lines, 50% functions, 65% branches
      • Aktuell: 37.29% lines, 55.55% functions, 71.61% branches
  • Audit-Fixes (Erledigt: 10.12.2025)
    • Vitest auf 3.2.4 aktualisiert (Version-Warnung entfernt)
    • payload.create/payload.update Mock in tests/int/security-api.int.spec.ts ergänzt
    • 205 Tests laufen fehlerfrei, Coverage-Report ohne Abbrüche
    • Kein "payload.create is not a function" Hinweis mehr im Test-Output
  • CI/CD Pipeline
    • GitHub Actions Workflow erstellt (security.yml)
    • Automatisches Lint/Test/Build Workflow
    • Secrets-Scanning in Pipeline
    • Staging-Deployment

Admin UX

  • Tenant-Wechsel UI (Erledigt: 08.12.2025)
    • Dropdown in Admin-Leiste für schnellen Tenant-Wechsel (Multi-Tenant Plugin integriert)
    • Tenant-Kontext in Breadcrumbs anzeigen (Custom TenantBreadcrumb Komponente)
    • Deutsche Übersetzungen für Tenant-Selector hinzugefügt
  • Email-Konfiguration UX (Erledigt: 08.12.2025)
    • Formularvalidierung für SMTP-Settings (Host-Format, Port-Bereich, Pflichtfelder)
    • Tooltips für SPF/DKIM-Hinweise (aufklappbare Info-Komponente mit Beispielen)
    • "Test-Email senden" Button (Custom UI-Komponente + API-Endpoint)
  • Tenant Self-Service (Erledigt: 08.12.2025)
    • API für Tenant-Admins zum Testen der SMTP-Settings (/api/test-email)
    • Email-Logs Einsicht für eigenen Tenant (Tenant-basierter Zugriff bereits vorhanden)
    • Eigene Statistiken Dashboard (/admin/tenant-dashboard)

Data Retention

  • Automatische Datenbereinigung
    • Cron-Job für Email-Log Cleanup (älter als X Tage)
    • Consent-Logs Archivierung
    • Media-Orphan-Cleanup

Phase 5: Tenant-spezifische Features

porwoll.de

  • Immobilien-Collection (falls benötigt)
  • Objektsuche
  • Kontaktformular mit Objekt-Referenz

complexcaresolutions.de (C2S)

  • Team-Collection
  • Leistungs-Übersicht
  • Karriere-Seite mit Stellenangeboten

gunshin.de / Fotografin-Portfolio

  • Portfolio-Categories Collection (Erledigt: 06.12.2025)
    • Name, Slug, Beschreibung (lokalisiert)
    • Cover-Bild, Reihenfolge, Aktiv-Status
  • Portfolios Collection (Erledigt: 06.12.2025)
    • Titel, Beschreibung, Excerpt (lokalisiert)
    • Kategorie-Beziehung
    • Cover-Bild + Galerie-Bilder mit Captions
    • Projekt-Details (Kunde, Ort, Datum, Ausrüstung)
    • Status (draft/published/archived)
    • isFeatured, SEO-Felder
  • Projekt-Galerie Frontend
  • Referenzen-Slider

zweitmein.ng

  • Produkt-Collection (falls E-Commerce)
  • FAQ-Collection
  • Preistabellen

Technische Schulden

  • TypeScript Strict Mode aktivieren
  • Unit Tests für Access Control
  • E2E Tests für kritische Flows
  • API-Dokumentation automatisch generieren (OpenAPI)
  • Code-Review für Security-relevante Bereiche
  • Performance-Audit der Datenbank-Queries

Dokumentation

  • CLAUDE.md (Projekt-Übersicht)
  • UNIVERSAL_FEATURES.md (Collections & Blocks)
  • API_ANLEITUNG.md (REST API Guide)
  • TODO.md (Diese Datei)
  • BILDOPTIMIERUNG.md (Sharp & Image Sizes)
  • SEO_ERWEITERUNG.md (SEO Features)
  • ANALYTICS_IMPLEMENTATION_GUIDE.md (Umami & Google Ads)
  • Techstack_Dokumentation_12_2025.md (Infrastruktur & Deployment)
  • SECURITY.md (Sicherheitsrichtlinien) (Erledigt: 08.12.2025)
  • DEPLOYMENT.md (Deployment-Prozess)
  • FRONTEND_INTEGRATION.md (Next.js Guide)

Regelmäßige Wartung

Wöchentlich

  • PM2 Logs prüfen
  • Datenbank-Größe überwachen
  • Media-Storage prüfen

Monatlich

  • Dependencies aktualisieren (pnpm update)
  • Sicherheitsupdates prüfen (pnpm audit)
  • Backup-Restore testen

Quartalsweise

  • Performance-Review
  • Security-Audit
  • Dokumentation aktualisieren

Notizen

Bekannte Probleme

  1. Tenant-Isolation bei localhost: API gibt 403 zurück, wenn kein Tenant zur Domain passt. Das ist gewolltes Verhalten für Multi-Tenant-Sicherheit.

  2. GraphQL Playground deaktiviert: Route wurde entfernt. Bei Bedarf wieder aktivieren.

  3. PM2 Cluster Mode: Aktuell 1 Instanz. Für Skalierung instances: "max" setzen.

Nächste Schritte (Priorisiert)

  1. [KRITISCH] AuditLogs Collection implementieren Erledigt
  2. [KRITISCH] Automatisierte Backups einrichten
  3. [HOCH] Full-Text-Search aktivieren (USE_FTS=true) Erledigt
  4. [HOCH] Rate-Limits auf Redis migrieren (In-Memory-Fallback funktioniert)
  5. [MITTEL] CI/CD Pipeline mit GitHub Actions security.yml erstellt
  6. [MITTEL] Frontend-Entwicklung starten
  7. [NIEDRIG] Admin UX Verbesserungen

Kontakte & Ressourcen


Letzte Aktualisierung: 09.12.2025


Changelog

09.12.2025

  • Admin Login Fix: Custom Login-Route unterstützt nun _payload JSON-Feld aus multipart/form-data (Payload Admin Panel Format)
  • Dokumentation bereinigt: Obsolete PROMPT_*.md Instruktionsdateien gelöscht
  • CLAUDE.md aktualisiert: Security-Features, Test Suite, AuditLogs dokumentiert
  • Index-Audit: 12 neue Performance-Indexes für PostgreSQL erstellt
    • Composite-Indexes für slug+locale auf posts_locales, pages_locales, categories_locales
    • Status/Tenant-Indexes für posts, email_logs, newsletter_subscribers
    • Partial Index für Featured Posts
    • Chronologische Sortierung für published_at, created_at

10.12.2025

  • Audit-Fixes: Vitest auf 3.2.4 aktualisiert, Payload-Mocks im Security-Test ergänzt

09.12.2025 (Fortsetzung)

  • Full-Text-Search: PostgreSQL FTS mit GIN-Indexes aktiviert
    • 5 FTS-Indexes auf posts_locales, pages_locales, categories_locales
    • Deutsche Sprachkonfiguration (german config)
    • Relevanz-Ranking mit ts_rank()
    • Feature-Flag USE_FTS=true in .env
  • Queue-System Evaluation: BullMQ vs Agenda.js evaluiert
    • Empfehlung: BullMQ (Redis-basiert, TypeScript-native, @bull-board UI)
    • Implementierungsplan dokumentiert
    • Betroffene Dateien identifiziert
  • BullMQ Implementation: Vollständiges Queue-System implementiert
    • Queue-Service mit Redis-Connection und Job-Optionen
    • Email-Job mit Priority, Delay und Batch-Support
    • Email-Worker für asynchrone Verarbeitung
    • Worker-Script für PM2 (scripts/run-queue-worker.ts)
    • PM2-Konfiguration für separaten Worker-Prozess
    • Admin-API für Queue-Monitoring (/api/admin/queues)
    • Send-Email API mit queued: true Option
  • Audit-Fixes (BullMQ): FTS und Dependencies bereinigt
    • FTS SQL-Fix: p.published_at zu SELECT hinzugefügt (PostgreSQL DISTINCT-Regel)
    • Guard für fehlende payload.db.drizzle in Tests
    • Ungenutzte @bull-board/* Packages entfernt (53 Dependencies weniger)
  • PDF-Queue-System: Vollständige PDF-Generierung über BullMQ
    • PDF-Job-Definition mit Priority, Delay und Batch-Support
    • PDF-Service mit Playwright (HTML-zu-PDF, URL-zu-PDF)
    • PDF-Worker für asynchrone Verarbeitung
    • REST-API /api/generate-pdf mit Auth, CSRF, Rate-Limiting
    • PM2-Integration mit konfigurierbaren Workern (QUEUE_ENABLE_PDF)