Study/src/app/api/quizzes/[id]/attempt/route.ts

47 lines
1.4 KiB
TypeScript

import { NextRequest, NextResponse } from "next/server";
import {
QuizAttemptValidationError,
QuizNotFoundError,
listQuizAttempts,
submitQuizAttempt,
} from "@/services/quizService";
import { quizAttemptSchema } from "@/lib/validation/attemptSchemas";
export async function POST(
request: NextRequest,
ctx: RouteContext<"/api/quizzes/[id]/attempt">
) {
const { id } = await ctx.params;
const parsed = quizAttemptSchema.safeParse(
await request.json().catch(() => null)
);
if (!parsed.success) {
return NextResponse.json(
{ error: parsed.error.issues[0]?.message ?? "Invalid attempt" },
{ status: 400 }
);
}
try {
return NextResponse.json(await submitQuizAttempt(id, parsed.data), {
status: 201,
});
} catch (error) {
if (error instanceof QuizNotFoundError) {
return NextResponse.json({ error: error.message }, { status: 404 });
}
if (error instanceof QuizAttemptValidationError) {
return NextResponse.json({ error: error.message }, { status: 400 });
}
console.error("Failed to submit quiz attempt", error);
return NextResponse.json({ error: "Failed to submit attempt" }, { status: 500 });
}
}
export async function GET(
_request: NextRequest,
ctx: RouteContext<"/api/quizzes/[id]/attempt">
) {
const { id } = await ctx.params;
const attempts = await listQuizAttempts(id);
return NextResponse.json(attempts);
}