mirror of
https://github.com/cfngc4594/monaco-editor-lsp-next.git
synced 2025-07-06 19:10:52 +00:00
- 在 edit-code-panel、edit-description-panel、edit-detail-panel、edit-solution-panel 和 edit-testcase-panel 组件中添加保存逻辑 - 实现与后端 API 的交互,包括保存代码模板、题目描述、详情、解析和测试用例 -优化错误处理和用户提示,使用 toast 组件显示操作结果 - 调整界面布局和交互细节,提升用户体验
230 lines
6.4 KiB
TypeScript
230 lines
6.4 KiB
TypeScript
"use server";
|
||
|
||
import prisma from "@/lib/prisma";
|
||
import { revalidatePath } from "next/cache";
|
||
import { Difficulty, Locale, ProblemContentType, Language } from "@/generated/client";
|
||
|
||
export async function updateProblemDetail(problemId: string, data: { displayId?: number; difficulty?: Difficulty; timeLimit?: number; memoryLimit?: number; isPublished?: boolean }) {
|
||
try {
|
||
const updatedProblem = await prisma.problem.update({
|
||
where: { id: problemId },
|
||
data: {
|
||
displayId: data.displayId,
|
||
difficulty: data.difficulty,
|
||
timeLimit: data.timeLimit,
|
||
memoryLimit: data.memoryLimit,
|
||
isPublished: data.isPublished
|
||
}
|
||
});
|
||
|
||
revalidatePath(`/problem-editor/${problemId}`);
|
||
return { success: true, problem: updatedProblem };
|
||
} catch (error) {
|
||
console.error("Failed to update problem detail:", error);
|
||
return { success: false, error: "Failed to update problem detail" };
|
||
}
|
||
}
|
||
|
||
export async function updateProblemDescription(problemId: string, locale: Locale, content: string) {
|
||
try {
|
||
const updatedLocalization = await prisma.problemLocalization.upsert({
|
||
where: {
|
||
problemId_locale_type: {
|
||
problemId: problemId,
|
||
locale: locale,
|
||
type: ProblemContentType.DESCRIPTION
|
||
}
|
||
},
|
||
create: {
|
||
problemId: problemId,
|
||
locale: locale,
|
||
type: ProblemContentType.DESCRIPTION,
|
||
content: content
|
||
},
|
||
update: {
|
||
content: content
|
||
}
|
||
});
|
||
|
||
revalidatePath(`/problem-editor/${problemId}`);
|
||
return { success: true, localization: updatedLocalization };
|
||
} catch (error) {
|
||
console.error("Failed to update problem description:", error);
|
||
return { success: false, error: "Failed to update problem description" };
|
||
}
|
||
}
|
||
|
||
export async function updateProblemSolution(problemId: string, locale: Locale, content: string) {
|
||
try {
|
||
const updatedLocalization = await prisma.problemLocalization.upsert({
|
||
where: {
|
||
problemId_locale_type: {
|
||
problemId: problemId,
|
||
locale: locale,
|
||
type: ProblemContentType.SOLUTION
|
||
}
|
||
},
|
||
create: {
|
||
problemId: problemId,
|
||
locale: locale,
|
||
type: ProblemContentType.SOLUTION,
|
||
content: content
|
||
},
|
||
update: {
|
||
content: content
|
||
}
|
||
});
|
||
|
||
revalidatePath(`/problem-editor/${problemId}`);
|
||
return { success: true, localization: updatedLocalization };
|
||
} catch (error) {
|
||
console.error("Failed to update problem solution:", error);
|
||
return { success: false, error: "Failed to update problem solution" };
|
||
}
|
||
}
|
||
|
||
export async function updateProblemTemplate(problemId: string, language: Language, content: string) {
|
||
try {
|
||
const updatedTemplate = await prisma.template.upsert({
|
||
where: {
|
||
problemId_language: {
|
||
problemId: problemId,
|
||
language: language
|
||
}
|
||
},
|
||
create: {
|
||
problemId: problemId,
|
||
language: language,
|
||
content: content
|
||
},
|
||
update: {
|
||
content: content
|
||
}
|
||
});
|
||
|
||
revalidatePath(`/problem-editor/${problemId}`);
|
||
return { success: true, template: updatedTemplate };
|
||
} catch (error) {
|
||
console.error("Failed to update problem template:", error);
|
||
return { success: false, error: "Failed to update problem template" };
|
||
}
|
||
}
|
||
|
||
export async function updateProblemTestcase(problemId: string, testcaseId: string, expectedOutput: string, inputs: { name: string; value: string }[]) {
|
||
try {
|
||
// Update testcase
|
||
const updatedTestcase = await prisma.testcase.update({
|
||
where: { id: testcaseId },
|
||
data: {
|
||
expectedOutput: expectedOutput
|
||
}
|
||
});
|
||
|
||
// Delete old inputs
|
||
await prisma.testcaseInput.deleteMany({
|
||
where: { testcaseId: testcaseId }
|
||
});
|
||
|
||
// Create new inputs
|
||
const createdInputs = await prisma.testcaseInput.createMany({
|
||
data: inputs.map((input, index) => ({
|
||
testcaseId: testcaseId,
|
||
index: index,
|
||
name: input.name,
|
||
value: input.value
|
||
}))
|
||
});
|
||
|
||
revalidatePath(`/problem-editor/${problemId}`);
|
||
return {
|
||
success: true,
|
||
testcase: updatedTestcase,
|
||
inputs: createdInputs
|
||
};
|
||
} catch (error) {
|
||
console.error("Failed to update problem testcase:", error);
|
||
return { success: false, error: "Failed to update problem testcase" };
|
||
}
|
||
}
|
||
|
||
export async function addProblemTestcase(problemId: string, expectedOutput: string, inputs: { name: string; value: string }[]) {
|
||
try {
|
||
// Create testcase
|
||
const newTestcase = await prisma.testcase.create({
|
||
data: {
|
||
problemId: problemId,
|
||
expectedOutput: expectedOutput
|
||
}
|
||
});
|
||
|
||
// Create inputs
|
||
const createdInputs = await prisma.testcaseInput.createMany({
|
||
data: inputs.map((input, index) => ({
|
||
testcaseId: newTestcase.id,
|
||
index: index,
|
||
name: input.name,
|
||
value: input.value
|
||
}))
|
||
});
|
||
|
||
revalidatePath(`/problem-editor/${problemId}`);
|
||
return {
|
||
success: true,
|
||
testcase: newTestcase,
|
||
inputs: createdInputs
|
||
};
|
||
} catch (error) {
|
||
console.error("Failed to add problem testcase:", error);
|
||
return { success: false, error: "Failed to add problem testcase" };
|
||
}
|
||
}
|
||
|
||
export async function deleteProblemTestcase(problemId: string, testcaseId: string) {
|
||
try {
|
||
const deletedTestcase = await prisma.testcase.delete({
|
||
where: { id: testcaseId }
|
||
});
|
||
|
||
revalidatePath(`/problem-editor/${problemId}`);
|
||
return { success: true, testcase: deletedTestcase };
|
||
} catch (error) {
|
||
console.error("Failed to delete problem testcase:", error);
|
||
return { success: false, error: "Failed to delete problem testcase" };
|
||
}
|
||
}
|
||
|
||
/**
|
||
* 更新题目标题(TITLE)
|
||
*/
|
||
export async function updateProblemTitle(
|
||
problemId: string,
|
||
locale: Locale,
|
||
title: string
|
||
) {
|
||
try {
|
||
const updated = await prisma.problemLocalization.upsert({
|
||
where: {
|
||
problemId_locale_type: {
|
||
problemId,
|
||
locale,
|
||
type: ProblemContentType.TITLE,
|
||
},
|
||
},
|
||
create: {
|
||
problemId,
|
||
locale,
|
||
type: ProblemContentType.TITLE,
|
||
content: title,
|
||
},
|
||
update: {
|
||
content: title,
|
||
},
|
||
});
|
||
// 重新缓存编辑页
|
||
revalidatePath(`/problem-editor/${problemId}`);
|
||
return { success: true, localization: updated };
|
||
} catch (error) {
|
||
console.error("更新题目标题失败:", error);
|
||
return { success: false, error: "更新题目标题失败" };
|
||
}
|
||
} |