feat(classes): optimize teacher dashboard ui and implement grade management

This commit is contained in:
SpecialX
2026-01-14 13:59:11 +08:00
parent ade8d4346c
commit 9bfc621d3f
104 changed files with 12793 additions and 2309 deletions

View File

@@ -9,10 +9,11 @@ import { revalidatePath } from "next/cache";
import { createId } from "@paralleldrive/cuid2";
import { and, eq } from "drizzle-orm";
import { z } from "zod";
import { getQuestions, type GetQuestionsParams } from "./data-access";
async function getCurrentUser() {
return {
id: "user_teacher_123",
id: "user_teacher_math",
role: "teacher",
};
}
@@ -205,25 +206,27 @@ export async function deleteQuestionAction(
): Promise<ActionState<string>> {
try {
const user = await ensureTeacher();
const canEditAll = user.role === "admin";
const canDeleteAll = user.role === "admin";
const id = formData.get("id");
if (typeof id !== "string" || id.length === 0) {
return { success: false, message: "Missing question id" };
const questionId = formData.get("questionId");
if (typeof questionId !== "string") {
return { success: false, message: "Invalid question ID" };
}
await db.transaction(async (tx) => {
const [owned] = await tx
.select({ id: questions.id })
.from(questions)
.where(canEditAll ? eq(questions.id, id) : and(eq(questions.id, id), eq(questions.authorId, user.id)))
.limit(1);
const q = await tx.query.questions.findFirst({
where: eq(questions.id, questionId),
});
if (!owned) {
if (!q) {
throw new Error("Question not found");
}
if (!canDeleteAll && q.authorId !== user.id) {
throw new Error("Unauthorized");
}
await deleteQuestionRecursive(tx, id);
await deleteQuestionRecursive(tx, questionId);
});
revalidatePath("/teacher/questions");
@@ -233,6 +236,11 @@ export async function deleteQuestionAction(
if (error instanceof Error) {
return { success: false, message: error.message };
}
return { success: false, message: "An unexpected error occurred" };
return { success: false, message: "Failed to delete question" };
}
}
export async function getQuestionsAction(params: GetQuestionsParams) {
await ensureTeacher();
return await getQuestions(params);
}