route.ts 2.5 KB

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