From f0f713ff33b56cc0902ab9b55729c98b5911a674 Mon Sep 17 00:00:00 2001 From: SpecialX <47072643+wangxiner55@users.noreply.github.com> Date: Wed, 24 Jun 2026 12:03:03 +0800 Subject: [PATCH] feat(exams,homework): add error collection data-access for error book integration - Add data-access-error-collection in exams module for collecting wrong exam answers - Add data-access-error-collection in homework module for collecting wrong homework answers - Update exams actions, exam-ai-generator, data-access, and types - Update homework actions and data-access-write --- src/modules/exams/actions.ts | 28 ++ .../exams/components/exam-ai-generator.tsx | 12 +- .../exams/data-access-error-collection.ts | 94 +++++++ src/modules/exams/data-access.ts | 251 +++++++++++++++++- src/modules/exams/types.ts | 62 +++++ src/modules/homework/actions.ts | 58 +++- .../homework/data-access-error-collection.ts | 136 ++++++++++ src/modules/homework/data-access-write.ts | 7 +- 8 files changed, 623 insertions(+), 25 deletions(-) create mode 100644 src/modules/exams/data-access-error-collection.ts create mode 100644 src/modules/homework/data-access-error-collection.ts diff --git a/src/modules/exams/actions.ts b/src/modules/exams/actions.ts index b212168..8a2b79c 100644 --- a/src/modules/exams/actions.ts +++ b/src/modules/exams/actions.ts @@ -19,6 +19,7 @@ import { getExamGrades, getExamPreview, getExamSubjects, + getExamsByGradeId, persistAiGeneratedExamDraft, persistExamDraft, resolveSubjectGradeNames, @@ -39,6 +40,7 @@ import type { AiPreviewData, AiRewriteQuestionData, } from "./ai-pipeline" +import type { GradeExamsResult } from "./types" export type { AiPreviewData, AiRewriteQuestionData } from "./ai-pipeline" const ExamCreateSchema = z.object({ @@ -850,4 +852,30 @@ export async function getGradesAction(): Promise> { + try { + const ctx = await requirePermission(Permissions.EXAM_READ) + + if (!gradeId || gradeId.trim().length === 0) { + return failState("Invalid grade id") + } + + const result = await getExamsByGradeId({ + gradeId, + scope: ctx.dataScope, + }) + return successState(result) + } catch (error) { + if (error instanceof PermissionDeniedError) { + return failState(error.message) + } + return handleActionError(error) + } +} + diff --git a/src/modules/exams/components/exam-ai-generator.tsx b/src/modules/exams/components/exam-ai-generator.tsx index 497bff3..6f3131e 100644 --- a/src/modules/exams/components/exam-ai-generator.tsx +++ b/src/modules/exams/components/exam-ai-generator.tsx @@ -2,8 +2,6 @@ import type { Control, UseFormReturn } from "react-hook-form" import { useTranslations } from "next-intl" -import Link from "next/link" -import { Settings } from "lucide-react" import { FormField, FormItem, @@ -86,15 +84,7 @@ export function ExamAiGenerator({ name="aiProviderId" render={({ field }) => ( -
- {t("provider.label")} - -
+ {t("provider.label")}