mirror of
https://github.com/cfngc4594/monaco-editor-lsp-next.git
synced 2026-05-31 10:18:52 +00:00
102 lines
2.4 KiB
TypeScript
102 lines
2.4 KiB
TypeScript
import "server-only";
|
|
|
|
import prisma from "@/lib/prisma";
|
|
import {
|
|
JudgeRunStatus,
|
|
JudgeStatus,
|
|
Status,
|
|
} from "@/generated/client";
|
|
|
|
export const mapSubmissionStatusToJudgeStatus = (
|
|
status: Status
|
|
): JudgeStatus | null => {
|
|
switch (status) {
|
|
case Status.CP:
|
|
return JudgeStatus.COMPILING;
|
|
case Status.CE:
|
|
return JudgeStatus.COMPILATION_ERROR;
|
|
case Status.RU:
|
|
return JudgeStatus.RUNNING;
|
|
case Status.AC:
|
|
return JudgeStatus.ACCEPTED;
|
|
case Status.WA:
|
|
return JudgeStatus.WRONG_ANSWER;
|
|
case Status.TLE:
|
|
return JudgeStatus.TIME_LIMIT_EXCEEDED;
|
|
case Status.MLE:
|
|
return JudgeStatus.MEMORY_LIMIT_EXCEEDED;
|
|
case Status.RE:
|
|
return JudgeStatus.RUNTIME_ERROR;
|
|
case Status.SE:
|
|
return JudgeStatus.SYSTEM_ERROR;
|
|
default:
|
|
return null;
|
|
}
|
|
};
|
|
|
|
export const mapSubmissionStatusToJudgeRunStatus = (
|
|
status: Status
|
|
): JudgeRunStatus => {
|
|
switch (status) {
|
|
case Status.AC:
|
|
case Status.RU:
|
|
return JudgeRunStatus.ACCEPTED;
|
|
case Status.WA:
|
|
return JudgeRunStatus.WRONG_ANSWER;
|
|
case Status.TLE:
|
|
return JudgeRunStatus.TIME_LIMIT_EXCEEDED;
|
|
case Status.MLE:
|
|
return JudgeRunStatus.MEMORY_LIMIT_EXCEEDED;
|
|
case Status.RE:
|
|
return JudgeRunStatus.RUNTIME_ERROR;
|
|
case Status.SE:
|
|
return JudgeRunStatus.SYSTEM_ERROR;
|
|
default:
|
|
return JudgeRunStatus.SYSTEM_ERROR;
|
|
}
|
|
};
|
|
|
|
export const getOrCreateJudge = async (
|
|
submissionId: string,
|
|
initialStatus: JudgeStatus = JudgeStatus.COMPILING
|
|
) => {
|
|
const existing = await prisma.judge.findUnique({
|
|
where: { submissionId },
|
|
select: { id: true },
|
|
});
|
|
if (existing) return existing.id;
|
|
|
|
const created = await prisma.judge.create({
|
|
data: {
|
|
submissionId,
|
|
status: initialStatus,
|
|
},
|
|
select: { id: true },
|
|
});
|
|
return created.id;
|
|
};
|
|
|
|
export const updateJudgeBySubmission = async (
|
|
submissionId: string,
|
|
status: JudgeStatus,
|
|
extra?: {
|
|
compileOutput?: string | null;
|
|
endTime?: Date | null;
|
|
}
|
|
) => {
|
|
const judgeId = await getOrCreateJudge(submissionId, status);
|
|
|
|
await prisma.judge.update({
|
|
where: { id: judgeId },
|
|
data: {
|
|
status,
|
|
...(extra?.compileOutput !== undefined
|
|
? { compileOutput: extra.compileOutput }
|
|
: {}),
|
|
...(extra?.endTime !== undefined ? { endTime: extra.endTime } : {}),
|
|
},
|
|
});
|
|
|
|
return judgeId;
|
|
};
|