43 lines
1.4 KiB
TypeScript
43 lines
1.4 KiB
TypeScript
import { NextRequest, NextResponse } from "next/server";
|
|
import * as quizService from "@/services/quizService";
|
|
import { quizImportRequestSchema } from "@/lib/validation/importSchemas";
|
|
import { readLimitedJson, RequestTooLargeError } from "@/lib/limitedJson";
|
|
|
|
export async function POST(request: NextRequest) {
|
|
let body: unknown;
|
|
try {
|
|
body = await readLimitedJson(request);
|
|
} catch (error) {
|
|
if (error instanceof RequestTooLargeError) {
|
|
return NextResponse.json({ error: error.message }, { status: 413 });
|
|
}
|
|
throw error;
|
|
}
|
|
|
|
const parsed = quizImportRequestSchema.safeParse(body);
|
|
if (!parsed.success) {
|
|
return NextResponse.json(
|
|
{
|
|
error: "Invalid quiz import. SATA questions need at least two correct options.",
|
|
details: parsed.error.issues,
|
|
},
|
|
{ status: 400 }
|
|
);
|
|
}
|
|
|
|
try {
|
|
const quiz = await quizService.createQuizSetFromImport(
|
|
parsed.data.classId,
|
|
parsed.data.data,
|
|
parsed.data.name,
|
|
parsed.data.groupId ?? null
|
|
);
|
|
return NextResponse.json(quiz, { status: 201 });
|
|
} catch (error) {
|
|
if (error instanceof quizService.QuizContentValidationError) {
|
|
return NextResponse.json({ error: error.message }, { status: error.status });
|
|
}
|
|
console.error("Failed to create quiz", error);
|
|
return NextResponse.json({ error: "Failed to create quiz" }, { status: 500 });
|
|
}
|
|
}
|