← 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 },
    );
  }
}