117 lines
3.9 KiB
JavaScript
117 lines
3.9 KiB
JavaScript
import { NextResponse } from 'next/server';
|
||
import templateDb from '@/lib/db/questionTemplates';
|
||
import { generateQuestionsFromTemplate, checkTemplateGenerationAvailability } from '@/lib/services/questions/template';
|
||
|
||
// 获取问题模板列表
|
||
export async function GET(request, { params }) {
|
||
try {
|
||
const { projectId } = params;
|
||
const { searchParams } = new URL(request.url);
|
||
const sourceType = searchParams.get('sourceType');
|
||
const search = searchParams.get('search');
|
||
|
||
const templates = await templateDb.getTemplates(projectId, { sourceType, search });
|
||
|
||
// 获取使用统计
|
||
const templateIds = templates.map(t => t.id);
|
||
const usageCounts = await templateDb.getTemplatesUsageCount(templateIds);
|
||
|
||
// 添加使用统计到模板数据
|
||
const templatesWithUsage = templates.map(template => ({
|
||
...template,
|
||
usageCount: usageCounts[template.id] || 0
|
||
}));
|
||
|
||
return NextResponse.json({
|
||
success: true,
|
||
templates: templatesWithUsage
|
||
});
|
||
} catch (error) {
|
||
console.error('Failed to get templates:', error);
|
||
return NextResponse.json({ error: error.message || 'Failed to get templates' }, { status: 500 });
|
||
}
|
||
}
|
||
|
||
// 创建问题模板
|
||
export async function POST(request, { params }) {
|
||
try {
|
||
const { projectId } = params;
|
||
const data = await request.json();
|
||
|
||
const { question, sourceType, answerType, description, labels, customFormat, order, autoGenerate } = data;
|
||
|
||
// 验证必填字段
|
||
if (!question || !sourceType || !answerType) {
|
||
return NextResponse.json({ error: '缺少必要参数:question, sourceType, answerType' }, { status: 400 });
|
||
}
|
||
|
||
// 验证数据源类型
|
||
if (!['image', 'text'].includes(sourceType)) {
|
||
return NextResponse.json({ error: '无效的数据源类型' }, { status: 400 });
|
||
}
|
||
|
||
// 验证答案类型
|
||
if (!['text', 'label', 'custom_format'].includes(answerType)) {
|
||
return NextResponse.json({ error: '无效的答案类型' }, { status: 400 });
|
||
}
|
||
|
||
// 如果是标签类型,验证 labels
|
||
if (answerType === 'label' && (!labels || !Array.isArray(labels) || labels.length === 0)) {
|
||
return NextResponse.json({ error: '标签类型问题必须提供标签列表' }, { status: 400 });
|
||
}
|
||
|
||
// 如果是自定义格式,验证 customFormat
|
||
if (answerType === 'custom_format' && !customFormat) {
|
||
return NextResponse.json({ error: '自定义格式问题必须提供格式定义' }, { status: 400 });
|
||
}
|
||
|
||
const template = await templateDb.createTemplate(projectId, {
|
||
question,
|
||
sourceType,
|
||
answerType,
|
||
description,
|
||
labels: answerType === 'label' ? labels : [],
|
||
customFormat: answerType === 'custom_format' ? customFormat : null,
|
||
order: order || 0
|
||
});
|
||
|
||
let generationResult = null;
|
||
|
||
// 如果启用自动生成,则为所有相关数据源创建问题
|
||
if (autoGenerate) {
|
||
try {
|
||
// 先检查是否有可用的数据源
|
||
const availability = await checkTemplateGenerationAvailability(projectId, sourceType);
|
||
|
||
if (availability.available) {
|
||
generationResult = await generateQuestionsFromTemplate(projectId, template);
|
||
} else {
|
||
generationResult = {
|
||
success: false,
|
||
successCount: 0,
|
||
failCount: 0,
|
||
message: availability.message
|
||
};
|
||
}
|
||
} 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 create template:', error);
|
||
return NextResponse.json({ error: error.message || 'Failed to create template' }, { status: 500 });
|
||
}
|
||
}
|