Commit Graph

5 Commits

Author SHA1 Message Date
e5db71ead1 fix: Bug 1+2+3 — SQL Cross-Join, PATCH 404 vs 400, API-Test-Skip
- getCampaignRecipients: EXISTS-Subquery statt Cross-Join verhindert Mehrfachversand
- updateCampaign: SELECT vor UPDATE unterscheidet 'nicht gefunden' (404) von 'nicht im Draft' (400)
- campaigns-api.test.ts: describe.skip entfernt, Mocks für DB-Abhängigkeiten ergänzt

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
2026-04-17 17:34:18 +00:00
ca0c65352e fix: DSGVO-Findings 5+7+6 — Tenant-Guard, APP_URL-Pflichtcheck, Constraint-Migration
- getTenantId wirft bei fehlendem Header statt silent fallback auf 'default'
- Alle API-Routes fangen den Fehler ab und antworten mit 401
- Worker gibt err() zurück wenn APP_URL nicht konfiguriert ist
- Migration: recipient_has_one Constraint schließt NULL/NULL-Zeilen aus

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
2026-04-17 16:42:50 +00:00
25889a5419 fix: Rollback auf draft bei Versand-Fehlern, Fehlermeldung updateCampaign
- send/route.ts: try/catch + Rollback auf draft wenn Empfänger-Query oder Queue-Enqueue fehlschlägt
- campaigns.ts: Fehlermeldung 'Kampagne nicht im Draft-Status' (zuvor enthielt sie 'nicht gefunden' — verursachte falschen 404 in PATCH)

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
2026-04-17 13:50:21 +00:00
889bfad085 fix: API Routes — Ergebnisprüfung, Suppression-Check vor Enqueue, Bulk-Enqueue, Status-Codes, Draft-Guard
- getTenantId in shared Utility src/lib/tenant-header.ts ausgelagert (alle 4 Route-Dateien)
- send/route.ts: updateCampaignStatus-Ergebnis geprüft (C1), addBulk statt sequentiellem await (C2), Suppression-Check vor Enqueue (C3)
- [id]/route.ts: GET unterscheidet 404/500, PATCH unterscheidet 404/400
- schedule/route.ts: immediate-Typ abgelehnt (I4), Draft-Guard hinzugefügt (I5)
- .eslintrc.json ergänzt (next/core-web-vitals) — fehlte im Projekt

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
2026-04-17 13:44:42 +00:00
e2f2ce6a56 feat: API Routes — Campaign CRUD, sofortiger Versand, Zeitplan
Implementiert vier Next.js App-Router API-Routen für das Campaign-Management:
- GET/POST /api/campaigns (Liste + Erstellen)
- GET/PATCH /api/campaigns/[id] (Einzeln abrufen + Aktualisieren)
- POST /api/campaigns/[id]/send (Sofortiger Versand — nur Draft-Status)
- POST /api/campaigns/[id]/schedule (Zeitplan setzen — once/cron/immediate)

Alle Routen lesen Tenant-ID aus x-tenant-id Header, nutzen das Result-Pattern
und validieren Eingaben über Zod-Schemas. Der Smoke-Test ist mit describe.skip
markiert, da next/server in Vitest nicht verfügbar ist.

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
2026-04-17 13:39:46 +00:00