Files

165 lines
4.6 KiB
JavaScript
Raw Permalink Normal View History

2026-03-17 14:36:31 +08:00
import { NextResponse } from 'next/server';
import path from 'path';
import fs from 'fs/promises';
import { getProjectRoot } from '@/lib/db/base';
import { getTaskConfig } from '@/lib/db/projects';
import { processTask } from '@/lib/services/tasks';
import { db } from '@/lib/db/index';
function normalizeModelEndpoint(endpoint = '') {
let normalizedEndpoint = String(endpoint).trim();
if (!normalizedEndpoint) {
return '';
}
if (normalizedEndpoint.includes('/chat/completions')) {
normalizedEndpoint = normalizedEndpoint.replace('/chat/completions', '');
}
return normalizedEndpoint;
}
function normalizeTaskModelInfo(modelInfo) {
if (!modelInfo) {
return {};
}
let parsedModelInfo = modelInfo;
if (typeof modelInfo === 'string') {
try {
parsedModelInfo = JSON.parse(modelInfo);
} catch (error) {
return {};
}
}
if (parsedModelInfo && typeof parsedModelInfo === 'object' && parsedModelInfo.endpoint) {
parsedModelInfo.endpoint = normalizeModelEndpoint(parsedModelInfo.endpoint);
}
return parsedModelInfo;
}
// 获取任务配置
export async function GET(request, { params }) {
try {
const { projectId } = params;
// 验证项目 ID
if (!projectId) {
return NextResponse.json({ error: 'Project ID is required' }, { status: 400 });
}
// 获取项目根目录
const projectRoot = await getProjectRoot();
const projectPath = path.join(projectRoot, projectId);
// 检查项目是否存在
try {
await fs.access(projectPath);
} catch (error) {
return NextResponse.json({ error: 'Project does not exist' + projectPath }, { status: 404 });
}
const taskConfig = await getTaskConfig(projectId);
return NextResponse.json(taskConfig);
} catch (error) {
console.error('Failed to obtain task configuration:', String(error));
return NextResponse.json({ error: 'Failed to obtain task configuration' }, { status: 500 });
}
}
// 更新任务配置
export async function PUT(request, { params }) {
try {
const { projectId } = params;
// 验证项目 ID
if (!projectId) {
return NextResponse.json({ error: 'Project ID is required' }, { status: 400 });
}
// 获取请求体
const taskConfig = await request.json();
// 验证请求体
if (!taskConfig) {
return NextResponse.json({ error: 'Task configuration cannot be empty' }, { status: 400 });
}
// 获取项目根目录
const projectRoot = await getProjectRoot();
const projectPath = path.join(projectRoot, projectId);
// 检查项目是否存在
try {
await fs.access(projectPath);
} catch (error) {
return NextResponse.json({ error: 'Project does not exist' }, { status: 404 });
}
// 获取任务配置文件路径
const taskConfigPath = path.join(projectPath, 'task-config.json');
// 写入任务配置文件
await fs.writeFile(taskConfigPath, JSON.stringify(taskConfig, null, 2), 'utf-8');
return NextResponse.json({ message: 'Task configuration updated successfully' });
} catch (error) {
console.error('Failed to update task configuration:', String(error));
return NextResponse.json({ error: 'Failed to update task configuration' }, { status: 500 });
}
}
// 创建新任务
export async function POST(request, { params }) {
try {
const { projectId } = params;
const data = await request.json();
// 验证必填字段
const { taskType, modelInfo, language, detail = '', totalCount = 0, note } = data;
if (!taskType) {
return NextResponse.json(
{
code: 400,
error: 'Missing required parameter: taskType'
},
{ status: 400 }
);
}
// 创建新任务
const newTask = await db.task.create({
data: {
projectId,
taskType,
status: 0, // 初始状态: 处理中
modelInfo: JSON.stringify(normalizeTaskModelInfo(modelInfo)),
language: language || 'zh-CN',
detail: detail || '',
totalCount,
note: note ? JSON.stringify(note) : '',
completedCount: 0
}
});
// 异步启动任务处理
processTask(newTask.id).catch(err => {
console.error(`Task startup failed: ${newTask.id}`, String(err));
});
return NextResponse.json({
code: 0,
data: newTask,
message: 'Task created successfully'
});
} catch (error) {
console.error('Failed to create task:', String(error));
return NextResponse.json(
{
code: 500,
error: 'Failed to create task',
message: error.message
},
{ status: 500 }
);
}
}