import { type NextRequest } from 'next/server'; import { randomUUID } from 'crypto'; import { apiSuccess, apiError, API_ERROR_CODES } from '@/lib/server/api-response'; import { buildRequestOrigin, isValidClassroomId, persistClassroom, readClassroom, } from '@/lib/server/classroom-storage'; import { createLogger } from '@/lib/logger'; const log = createLogger('Classroom API'); export async function POST(request: NextRequest) { let stageId: string | undefined; let sceneCount: number | undefined; try { const body = await request.json(); const { stage, scenes } = body; stageId = stage?.id; sceneCount = scenes?.length; if (!stage || !scenes) { return apiError( API_ERROR_CODES.MISSING_REQUIRED_FIELD, 400, 'Missing required fields: stage, scenes', ); } const id = stage.id || randomUUID(); const baseUrl = buildRequestOrigin(request); const persisted = await persistClassroom({ id, stage: { ...stage, id }, scenes }, baseUrl); return apiSuccess({ id: persisted.id, url: persisted.url }, 201); } catch (error) { log.error( `Classroom storage failed [stageId=${stageId ?? 'unknown'}, scenes=${sceneCount ?? 0}]:`, error, ); return apiError( API_ERROR_CODES.INTERNAL_ERROR, 500, 'Failed to store classroom', error instanceof Error ? error.message : String(error), ); } } export async function GET(request: NextRequest) { try { const id = request.nextUrl.searchParams.get('id'); if (!id) { return apiError( API_ERROR_CODES.MISSING_REQUIRED_FIELD, 400, 'Missing required parameter: id', ); } if (!isValidClassroomId(id)) { return apiError(API_ERROR_CODES.INVALID_REQUEST, 400, 'Invalid classroom id'); } const classroom = await readClassroom(id); if (!classroom) { return apiError(API_ERROR_CODES.INVALID_REQUEST, 404, 'Classroom not found'); } return apiSuccess({ classroom }); } catch (error) { log.error( `Classroom retrieval failed [id=${request.nextUrl.searchParams.get('id') ?? 'unknown'}]:`, error, ); return apiError( API_ERROR_CODES.INTERNAL_ERROR, 500, 'Failed to retrieve classroom', error instanceof Error ? error.message : String(error), ); } }