Files
YG-Datasets/easy-dataset-main/app/api/projects/[projectId]/questions/templates/route.js

117 lines
3.9 KiB
JavaScript
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
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 });
}
}