File size: 2,355 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 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 | 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),
);
}
}
|