monaco-editor-lsp-next/src/lib/judge-trace.ts

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;
};