76 lines
2.3 KiB
TypeScript
76 lines
2.3 KiB
TypeScript
import { NextRequest } from "next/server";
|
||
import {
|
||
createTask,
|
||
getEstimatedTime,
|
||
findRunningTaskByEnglishName,
|
||
processTask,
|
||
} from "@/lib/testcase-backend";
|
||
|
||
export async function POST(req: NextRequest) {
|
||
try {
|
||
const body = await req.json();
|
||
const {
|
||
title,
|
||
englishName,
|
||
description,
|
||
standardCode,
|
||
serviceLevel = "standard",
|
||
testCaseCount: rawCount,
|
||
} = body;
|
||
|
||
if (!title || !englishName || !description || !standardCode) {
|
||
return Response.json(
|
||
{ success: false, error: "请填写必填字段:题目标题、题目英文名、题目描述、C++标准程序" },
|
||
{ status: 400 }
|
||
);
|
||
}
|
||
|
||
if (!/^[a-z][a-z0-9_]*$/.test(String(englishName).trim())) {
|
||
return Response.json(
|
||
{ success: false, error: "题目英文名格式错误:只能包含小写字母、数字和下划线,必须以字母开头" },
|
||
{ status: 400 }
|
||
);
|
||
}
|
||
|
||
const testCaseCount = Math.min(100, Math.max(1, parseInt(String(rawCount), 10) || 10));
|
||
|
||
const existing = findRunningTaskByEnglishName(String(englishName));
|
||
if (existing) {
|
||
return Response.json(
|
||
{ success: false, error: "相同英文名的任务正在处理中,请稍后再试或使用不同的英文名" },
|
||
{ status: 409 }
|
||
);
|
||
}
|
||
|
||
const taskId = "task_" + Date.now() + "_" + Math.random().toString(36).slice(2, 11);
|
||
createTask(taskId, {
|
||
title: String(title).trim(),
|
||
englishName: String(englishName).trim().toLowerCase(),
|
||
description: String(description).trim(),
|
||
standardCode: String(standardCode).trim(),
|
||
testCaseCount,
|
||
serviceLevel: String(serviceLevel),
|
||
});
|
||
|
||
setImmediate(() => {
|
||
processTask(taskId).catch((err) => {
|
||
console.error(`[testcase] processTask error:`, err);
|
||
});
|
||
});
|
||
|
||
const estimated_time = getEstimatedTime(String(serviceLevel), testCaseCount);
|
||
return Response.json({
|
||
success: true,
|
||
task_id: taskId,
|
||
message: "任务已创建,正在处理中...",
|
||
estimated_time,
|
||
});
|
||
} catch (e) {
|
||
const message = e instanceof Error ? e.message : String(e);
|
||
return Response.json(
|
||
{ success: false, error: "创建任务时发生错误,请重试:" + message },
|
||
{ status: 500 }
|
||
);
|
||
}
|
||
}
|