← back to Norma
app/api/generate/route.ts
58 lines
import { NextRequest, NextResponse } from 'next/server';
import { requireRole } from '@/lib/require-role';
import { generateDailyDrafts, regenerateDraft } from '@/lib/generator';
import { auditLog } from '@/lib/audit';
import { checkRateLimit } from '@/lib/rate-limit';
/**
* POST /api/generate
* Generate a new Morning Batch (3 drafts) or regenerate a single draft.
*
* Body:
* { action: 'daily', planningAnswers?: Record<string,string> }
* { action: 'regenerate', draftId: string, constraints?: string }
*/
export async function POST(request: NextRequest) {
const auth = requireRole(request, 'admin', 'staff');
if (auth instanceof NextResponse) return auth;
const { limited, resetIn } = checkRateLimit(request);
if (limited) {
return NextResponse.json(
{ error: 'Rate limit exceeded', retryAfter: Math.ceil(resetIn / 1000) },
{ status: 429 },
);
}
try {
const body = await request.json();
const action = body.action || 'daily';
if (action === 'daily') {
const result = await generateDailyDrafts('manual', body.planningAnswers);
return NextResponse.json({
success: true,
sessionId: result.sessionId,
drafts: result.drafts,
errors: result.errors,
});
}
if (action === 'regenerate') {
if (!body.draftId) {
return NextResponse.json({ error: 'draftId required' }, { status: 400 });
}
const result = await regenerateDraft(body.draftId, body.constraints);
return NextResponse.json(result);
}
return NextResponse.json({ error: `Unknown action: ${action}` }, { status: 400 });
} catch (err) {
console.error('[generate] Error:', (err as Error).message);
return NextResponse.json(
{ error: 'Generation failed' },
{ status: 500 },
);
}
}