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>
This commit is contained in:
24
src/app/api/campaigns/route.ts
Normal file
24
src/app/api/campaigns/route.ts
Normal file
@@ -0,0 +1,24 @@
|
||||
import { NextRequest, NextResponse } from 'next/server'
|
||||
import { CreateCampaignSchema } from '../../../lib/validation'
|
||||
import { createCampaign, listCampaigns } from '../../../server/db/campaigns'
|
||||
|
||||
function getTenantId(req: NextRequest): string {
|
||||
return req.headers.get('x-tenant-id') ?? 'default'
|
||||
}
|
||||
|
||||
export async function GET(req: NextRequest) {
|
||||
const tenantId = getTenantId(req)
|
||||
const result = await listCampaigns(tenantId)
|
||||
if (!result.ok) return NextResponse.json({ error: result.error.message }, { status: 500 })
|
||||
return NextResponse.json(result.data)
|
||||
}
|
||||
|
||||
export async function POST(req: NextRequest) {
|
||||
const tenantId = getTenantId(req)
|
||||
const body = await req.json()
|
||||
const parsed = CreateCampaignSchema.safeParse(body)
|
||||
if (!parsed.success) return NextResponse.json({ error: parsed.error.issues }, { status: 400 })
|
||||
const result = await createCampaign(tenantId, parsed.data)
|
||||
if (!result.ok) return NextResponse.json({ error: result.error.message }, { status: 500 })
|
||||
return NextResponse.json(result.data, { status: 201 })
|
||||
}
|
||||
Reference in New Issue
Block a user