first-update
This commit is contained in:
@@ -0,0 +1,190 @@
|
||||
import { NextResponse } from 'next/server';
|
||||
import { db } from '@/lib/db/index';
|
||||
|
||||
/**
|
||||
* Get blind-test task details
|
||||
* Results are fetched from EvalResults table
|
||||
*/
|
||||
export async function GET(request, { params }) {
|
||||
try {
|
||||
const { projectId, taskId } = params;
|
||||
|
||||
const task = await db.task.findFirst({
|
||||
where: {
|
||||
id: taskId,
|
||||
projectId,
|
||||
taskType: 'blind-test'
|
||||
}
|
||||
});
|
||||
|
||||
if (!task) {
|
||||
return NextResponse.json({ code: 404, error: 'Task not found' }, { status: 404 });
|
||||
}
|
||||
|
||||
let detail = {};
|
||||
let modelInfo = {};
|
||||
try {
|
||||
detail = task.detail ? JSON.parse(task.detail) : {};
|
||||
modelInfo = task.modelInfo ? JSON.parse(task.modelInfo) : {};
|
||||
} catch (e) {
|
||||
console.error('Failed to parse task detail:', e);
|
||||
}
|
||||
|
||||
// Fetch all related evaluation questions
|
||||
const evalDatasetIds = detail.evalDatasetIds || [];
|
||||
const evalDatasets = await db.evalDatasets.findMany({
|
||||
where: {
|
||||
id: { in: evalDatasetIds }
|
||||
},
|
||||
select: {
|
||||
id: true,
|
||||
question: true,
|
||||
questionType: true,
|
||||
correctAnswer: true,
|
||||
tags: true
|
||||
}
|
||||
});
|
||||
|
||||
// Sort by evalDatasetIds order
|
||||
const orderedDatasets = evalDatasetIds.map(id => evalDatasets.find(d => d.id === id)).filter(Boolean);
|
||||
|
||||
// Fetch results from EvalResults table
|
||||
const evalResults = await db.evalResults.findMany({
|
||||
where: { taskId },
|
||||
orderBy: { createAt: 'asc' }
|
||||
});
|
||||
|
||||
// Parse results into the format expected by frontend
|
||||
const results = evalResults.map(r => {
|
||||
let modelAnswer = {};
|
||||
let judgeData = {};
|
||||
try {
|
||||
modelAnswer = JSON.parse(r.modelAnswer || '{}');
|
||||
judgeData = JSON.parse(r.judgeResponse || '{}');
|
||||
} catch (e) {
|
||||
// Ignore parse errors
|
||||
}
|
||||
return {
|
||||
questionId: r.evalDatasetId,
|
||||
vote: judgeData.vote,
|
||||
isSwapped: judgeData.isSwapped,
|
||||
modelAScore: judgeData.modelAScore || 0,
|
||||
modelBScore: judgeData.modelBScore || 0,
|
||||
leftAnswer: modelAnswer.leftAnswer || '',
|
||||
rightAnswer: modelAnswer.rightAnswer || '',
|
||||
timestamp: r.createAt
|
||||
};
|
||||
});
|
||||
|
||||
return NextResponse.json({
|
||||
code: 0,
|
||||
data: {
|
||||
...task,
|
||||
detail: {
|
||||
...detail,
|
||||
results // Include results from EvalResults table
|
||||
},
|
||||
modelInfo,
|
||||
evalDatasets: orderedDatasets
|
||||
}
|
||||
});
|
||||
} catch (error) {
|
||||
console.error('Failed to fetch blind-test task details:', error);
|
||||
return NextResponse.json(
|
||||
{ code: 500, error: 'Failed to fetch blind-test task details', message: error.message },
|
||||
{ status: 500 }
|
||||
);
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* Update blind-test task (interrupt/stop)
|
||||
*/
|
||||
export async function PUT(request, { params }) {
|
||||
try {
|
||||
const { projectId, taskId } = params;
|
||||
const { action } = await request.json();
|
||||
|
||||
const task = await db.task.findFirst({
|
||||
where: {
|
||||
id: taskId,
|
||||
projectId,
|
||||
taskType: 'blind-test'
|
||||
}
|
||||
});
|
||||
|
||||
if (!task) {
|
||||
return NextResponse.json({ code: 404, error: 'Task not found' }, { status: 404 });
|
||||
}
|
||||
|
||||
if (action === 'interrupt') {
|
||||
if (task.status !== 0) {
|
||||
return NextResponse.json({ code: 400, error: 'Only running tasks can be interrupted' }, { status: 400 });
|
||||
}
|
||||
|
||||
const updatedTask = await db.task.update({
|
||||
where: { id: taskId },
|
||||
data: {
|
||||
status: 3, // Interrupted
|
||||
endTime: new Date()
|
||||
}
|
||||
});
|
||||
|
||||
return NextResponse.json({
|
||||
code: 0,
|
||||
data: updatedTask,
|
||||
message: 'Task interrupted'
|
||||
});
|
||||
}
|
||||
|
||||
return NextResponse.json({ code: 400, error: 'Unknown action' }, { status: 400 });
|
||||
} catch (error) {
|
||||
console.error('Failed to update blind-test task:', error);
|
||||
return NextResponse.json(
|
||||
{ code: 500, error: 'Failed to update blind-test task', message: error.message },
|
||||
{ status: 500 }
|
||||
);
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* Delete blind-test task and its results
|
||||
*/
|
||||
export async function DELETE(request, { params }) {
|
||||
try {
|
||||
const { projectId, taskId } = params;
|
||||
|
||||
const task = await db.task.findFirst({
|
||||
where: {
|
||||
id: taskId,
|
||||
projectId,
|
||||
taskType: 'blind-test'
|
||||
}
|
||||
});
|
||||
|
||||
if (!task) {
|
||||
return NextResponse.json({ code: 404, error: 'Task not found' }, { status: 404 });
|
||||
}
|
||||
|
||||
// Delete related EvalResults first
|
||||
await db.evalResults.deleteMany({
|
||||
where: { taskId }
|
||||
});
|
||||
|
||||
// Then delete the task
|
||||
await db.task.delete({
|
||||
where: { id: taskId }
|
||||
});
|
||||
|
||||
return NextResponse.json({
|
||||
code: 0,
|
||||
message: 'Task deleted'
|
||||
});
|
||||
} catch (error) {
|
||||
console.error('Failed to delete blind-test task:', error);
|
||||
return NextResponse.json(
|
||||
{ code: 500, error: 'Failed to delete blind-test task', message: error.message },
|
||||
{ status: 500 }
|
||||
);
|
||||
}
|
||||
}
|
||||
Reference in New Issue
Block a user