111 lines
3.6 KiB
JavaScript
111 lines
3.6 KiB
JavaScript
import { NextResponse } from 'next/server';
|
|
import templateDb from '@/lib/db/questionTemplates';
|
|
import { generateQuestionsFromTemplateEdit } from '@/lib/services/questions/template';
|
|
|
|
// 获取单个模板
|
|
export async function GET(request, { params }) {
|
|
try {
|
|
const { templateId } = params;
|
|
|
|
const template = await templateDb.getTemplateById(templateId);
|
|
|
|
if (!template) {
|
|
return NextResponse.json({ error: '模板不存在' }, { status: 404 });
|
|
}
|
|
|
|
// 获取使用统计
|
|
const usageCount = await templateDb.getTemplateUsageCount(templateId);
|
|
|
|
return NextResponse.json({
|
|
success: true,
|
|
template: {
|
|
...template,
|
|
usageCount
|
|
}
|
|
});
|
|
} catch (error) {
|
|
console.error('Failed to get template:', error);
|
|
return NextResponse.json({ error: error.message || 'Failed to get template' }, { status: 500 });
|
|
}
|
|
}
|
|
|
|
// 更新问题模板
|
|
export async function PUT(request, { params }) {
|
|
try {
|
|
const { projectId, templateId } = params;
|
|
const data = await request.json();
|
|
|
|
const { question, sourceType, answerType, description, labels, customFormat, order, autoGenerate } = data;
|
|
|
|
// 验证数据源类型
|
|
if (sourceType && !['image', 'text'].includes(sourceType)) {
|
|
return NextResponse.json({ error: '无效的数据源类型' }, { status: 400 });
|
|
}
|
|
|
|
// 验证答案类型
|
|
if (answerType && !['text', 'label', 'custom_format'].includes(answerType)) {
|
|
return NextResponse.json({ error: '无效的答案类型' }, { status: 400 });
|
|
}
|
|
|
|
const updateData = {};
|
|
if (question !== undefined) updateData.question = question;
|
|
if (sourceType !== undefined) updateData.sourceType = sourceType;
|
|
if (answerType !== undefined) updateData.answerType = answerType;
|
|
if (description !== undefined) updateData.description = description;
|
|
if (labels !== undefined) updateData.labels = labels;
|
|
if (customFormat !== undefined) updateData.customFormat = customFormat;
|
|
if (order !== undefined) updateData.order = order;
|
|
|
|
const template = await templateDb.updateTemplate(templateId, updateData);
|
|
|
|
let generationResult = null;
|
|
|
|
// 如果启用自动生成,则为还未创建此模板问题的数据源创建问题
|
|
if (autoGenerate) {
|
|
try {
|
|
generationResult = await generateQuestionsFromTemplateEdit(projectId, template);
|
|
} catch (error) {
|
|
console.error('编辑模式自动生成问题失败:', error);
|
|
generationResult = {
|
|
success: false,
|
|
successCount: 0,
|
|
failCount: 0,
|
|
message: '自动生成问题时发生错误'
|
|
};
|
|
}
|
|
}
|
|
|
|
return NextResponse.json({
|
|
success: true,
|
|
template,
|
|
generation: generationResult
|
|
});
|
|
} catch (error) {
|
|
console.error('Failed to update template:', error);
|
|
return NextResponse.json({ error: error.message || 'Failed to update template' }, { status: 500 });
|
|
}
|
|
}
|
|
|
|
// 删除问题模板
|
|
export async function DELETE(request, { params }) {
|
|
try {
|
|
const { templateId } = params;
|
|
|
|
// 检查是否有关联的问题
|
|
const usageCount = await templateDb.getTemplateUsageCount(templateId);
|
|
if (usageCount > 0) {
|
|
return NextResponse.json({ error: `此模板已被 ${usageCount} 个问题使用,无法删除` }, { status: 400 });
|
|
}
|
|
|
|
await templateDb.deleteTemplate(templateId);
|
|
|
|
return NextResponse.json({
|
|
success: true,
|
|
message: '模板删除成功'
|
|
});
|
|
} catch (error) {
|
|
console.error('Failed to delete template:', error);
|
|
return NextResponse.json({ error: error.message || 'Failed to delete template' }, { status: 500 });
|
|
}
|
|
}
|