route.ts 2.3 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485
  1. import { type NextRequest } from 'next/server';
  2. import { randomUUID } from 'crypto';
  3. import { apiSuccess, apiError, API_ERROR_CODES } from '@/lib/server/api-response';
  4. import {
  5. buildRequestOrigin,
  6. isValidClassroomId,
  7. persistClassroom,
  8. readClassroom,
  9. } from '@/lib/server/classroom-storage';
  10. import { createLogger } from '@/lib/logger';
  11. const log = createLogger('Classroom API');
  12. export async function POST(request: NextRequest) {
  13. let stageId: string | undefined;
  14. let sceneCount: number | undefined;
  15. try {
  16. const body = await request.json();
  17. const { stage, scenes } = body;
  18. stageId = stage?.id;
  19. sceneCount = scenes?.length;
  20. if (!stage || !scenes) {
  21. return apiError(
  22. API_ERROR_CODES.MISSING_REQUIRED_FIELD,
  23. 400,
  24. 'Missing required fields: stage, scenes',
  25. );
  26. }
  27. const id = stage.id || randomUUID();
  28. const baseUrl = buildRequestOrigin(request);
  29. const persisted = await persistClassroom({ id, stage: { ...stage, id }, scenes }, baseUrl);
  30. return apiSuccess({ id: persisted.id, url: persisted.url }, 201);
  31. } catch (error) {
  32. log.error(
  33. `Classroom storage failed [stageId=${stageId ?? 'unknown'}, scenes=${sceneCount ?? 0}]:`,
  34. error,
  35. );
  36. return apiError(
  37. API_ERROR_CODES.INTERNAL_ERROR,
  38. 500,
  39. 'Failed to store classroom',
  40. error instanceof Error ? error.message : String(error),
  41. );
  42. }
  43. }
  44. export async function GET(request: NextRequest) {
  45. try {
  46. const id = request.nextUrl.searchParams.get('id');
  47. if (!id) {
  48. return apiError(
  49. API_ERROR_CODES.MISSING_REQUIRED_FIELD,
  50. 400,
  51. 'Missing required parameter: id',
  52. );
  53. }
  54. if (!isValidClassroomId(id)) {
  55. return apiError(API_ERROR_CODES.INVALID_REQUEST, 400, 'Invalid classroom id');
  56. }
  57. const classroom = await readClassroom(id);
  58. if (!classroom) {
  59. return apiError(API_ERROR_CODES.INVALID_REQUEST, 404, 'Classroom not found');
  60. }
  61. return apiSuccess({ classroom });
  62. } catch (error) {
  63. log.error(
  64. `Classroom retrieval failed [id=${request.nextUrl.searchParams.get('id') ?? 'unknown'}]:`,
  65. error,
  66. );
  67. return apiError(
  68. API_ERROR_CODES.INTERNAL_ERROR,
  69. 500,
  70. 'Failed to retrieve classroom',
  71. error instanceof Error ? error.message : String(error),
  72. );
  73. }
  74. }