File size: 2,487 Bytes
f56a29b | 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 | import { after, type NextRequest } from 'next/server';
import { nanoid } from 'nanoid';
import { apiError, apiSuccess } from '@/lib/server/api-response';
import { type GenerateClassroomInput } from '@/lib/server/classroom-generation';
import { runClassroomGenerationJob } from '@/lib/server/classroom-job-runner';
import { createClassroomGenerationJob } from '@/lib/server/classroom-job-store';
import { buildRequestOrigin } from '@/lib/server/classroom-storage';
import { createLogger } from '@/lib/logger';
const log = createLogger('GenerateClassroom API');
export const maxDuration = 30;
export async function POST(req: NextRequest) {
let requirementSnippet: string | undefined;
try {
const rawBody = (await req.json()) as Partial<GenerateClassroomInput>;
requirementSnippet = rawBody.requirement?.substring(0, 60);
const body: GenerateClassroomInput = {
requirement: rawBody.requirement || '',
...(rawBody.pdfContent ? { pdfContent: rawBody.pdfContent } : {}),
...(rawBody.enableWebSearch != null ? { enableWebSearch: rawBody.enableWebSearch } : {}),
...(rawBody.enableImageGeneration != null
? { enableImageGeneration: rawBody.enableImageGeneration }
: {}),
...(rawBody.enableVideoGeneration != null
? { enableVideoGeneration: rawBody.enableVideoGeneration }
: {}),
...(rawBody.enableTTS != null ? { enableTTS: rawBody.enableTTS } : {}),
...(rawBody.agentMode ? { agentMode: rawBody.agentMode } : {}),
};
const { requirement } = body;
if (!requirement) {
return apiError('MISSING_REQUIRED_FIELD', 400, 'Missing required field: requirement');
}
const baseUrl = buildRequestOrigin(req);
const jobId = nanoid(10);
const job = await createClassroomGenerationJob(jobId, body);
const pollUrl = `${baseUrl}/api/generate-classroom/${jobId}`;
after(() => runClassroomGenerationJob(jobId, body, baseUrl));
return apiSuccess(
{
jobId,
status: job.status,
step: job.step,
message: job.message,
pollUrl,
pollIntervalMs: 5000,
},
202,
);
} catch (error) {
log.error(
`Classroom generation job creation failed [requirement="${requirementSnippet ?? 'unknown'}..."]:`,
error,
);
return apiError(
'INTERNAL_ERROR',
500,
'Failed to create classroom generation job',
error instanceof Error ? error.message : 'Unknown error',
);
}
}
|