Refactor Study Desk application structure

This commit is contained in:
Elijah 2026-08-07 19:31:23 -07:00
parent faaccf8a7e
commit 089439ed90
145 changed files with 8087 additions and 3412 deletions

View file

@ -1,35 +1,43 @@
import { NextRequest, NextResponse } from "next/server";
import * as quizService from "@/services/quizService";
import { quizImportSchema } from "@/lib/validation/importSchemas";
import { quizImportRequestSchema } from "@/lib/validation/importSchemas";
import { readLimitedJson, RequestTooLargeError } from "@/lib/limitedJson";
export async function POST(request: NextRequest) {
const body = await request.json().catch(() => null);
if (!body) {
return NextResponse.json({ error: "Invalid request body" }, { status: 400 });
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 { classId, data, name, groupId } = body;
if (!classId || typeof classId !== "string") {
return NextResponse.json({ error: "classId is required" }, { status: 400 });
}
// Server-side validation
const parsed = quizImportSchema.safeParse(data);
const parsed = quizImportRequestSchema.safeParse(body);
if (!parsed.success) {
return NextResponse.json(
{ error: "Validation failed", details: parsed.error.issues },
{
error: "Invalid quiz import. SATA questions need at least two correct options.",
details: parsed.error.issues,
},
{ status: 400 }
);
}
const quizSet = await quizService.createQuizSetFromImport(
classId,
parsed.data,
name?.trim() || undefined,
groupId || null
);
return NextResponse.json(quizSet, { status: 201 });
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 });
}
}