129 lines
4.2 KiB
JavaScript
129 lines
4.2 KiB
JavaScript
|
|
import { NextResponse } from 'next/server';
|
||
|
|
import {
|
||
|
|
getDatasets,
|
||
|
|
getBalancedDatasetsByTags,
|
||
|
|
getTagsWithDatasetCounts,
|
||
|
|
getDatasetsBatch,
|
||
|
|
getBalancedDatasetsByTagsBatch,
|
||
|
|
getDatasetsByIds,
|
||
|
|
getDatasetsByIdsBatch
|
||
|
|
} from '@/lib/db/datasets';
|
||
|
|
|
||
|
|
/**
|
||
|
|
* 获取导出数据集
|
||
|
|
*/
|
||
|
|
export async function GET(request, { params }) {
|
||
|
|
try {
|
||
|
|
const { projectId } = params;
|
||
|
|
const { searchParams } = new URL(request.url);
|
||
|
|
|
||
|
|
// 验证项目ID
|
||
|
|
if (!projectId) {
|
||
|
|
return NextResponse.json({ error: 'Project ID cannot be empty' }, { status: 400 });
|
||
|
|
}
|
||
|
|
|
||
|
|
const confirmedParam = searchParams.get('confirmed');
|
||
|
|
const confirmed = confirmedParam === null ? undefined : confirmedParam === 'true';
|
||
|
|
|
||
|
|
// 获取标签统计信息
|
||
|
|
const tagStats = await getTagsWithDatasetCounts(projectId, confirmed);
|
||
|
|
return NextResponse.json(tagStats);
|
||
|
|
} catch (error) {
|
||
|
|
console.error('Failed to get tag statistics:', String(error));
|
||
|
|
return NextResponse.json(
|
||
|
|
{
|
||
|
|
error: error.message || 'Failed to get tag statistics'
|
||
|
|
},
|
||
|
|
{ status: 500 }
|
||
|
|
);
|
||
|
|
}
|
||
|
|
}
|
||
|
|
|
||
|
|
/**
|
||
|
|
* 获取标签统计信息
|
||
|
|
*/
|
||
|
|
export async function POST(request, { params }) {
|
||
|
|
try {
|
||
|
|
const { projectId } = params;
|
||
|
|
const body = await request.json();
|
||
|
|
|
||
|
|
// 验证项目ID
|
||
|
|
if (!projectId) {
|
||
|
|
return NextResponse.json({ error: 'Project ID cannot be empty' }, { status: 400 });
|
||
|
|
}
|
||
|
|
|
||
|
|
let status = body.status;
|
||
|
|
let confirmed = undefined;
|
||
|
|
if (status === 'confirmed') confirmed = true;
|
||
|
|
if (status === 'unconfirmed') confirmed = false;
|
||
|
|
|
||
|
|
// 检查是否是分批导出模式
|
||
|
|
const batchMode = body.batchMode ? 'true' : 'false';
|
||
|
|
const offset = body.offset ?? 0;
|
||
|
|
const batchSize = body.batchSize ?? 1000;
|
||
|
|
|
||
|
|
// 检查是否是平衡导出
|
||
|
|
const balanceMode = body.balanceMode ? 'true' : 'false';
|
||
|
|
const balanceConfig = body.balanceConfig;
|
||
|
|
|
||
|
|
// 检查是否有选中的数据集 ID
|
||
|
|
const selectedIds = Array.isArray(body.selectedIds) ? body.selectedIds : null;
|
||
|
|
|
||
|
|
if (batchMode === 'true') {
|
||
|
|
// 分批导出模式
|
||
|
|
if (selectedIds && selectedIds.length > 0) {
|
||
|
|
// 按选中 ID 分批导出
|
||
|
|
const datasets = await getDatasetsByIdsBatch(projectId, selectedIds, offset, batchSize);
|
||
|
|
const hasMore = datasets.length === batchSize;
|
||
|
|
return NextResponse.json({
|
||
|
|
data: datasets,
|
||
|
|
hasMore,
|
||
|
|
offset: offset + datasets.length
|
||
|
|
});
|
||
|
|
} else if (balanceMode === 'true' && balanceConfig) {
|
||
|
|
// 平衡分批导出
|
||
|
|
const parsedConfig = typeof balanceConfig === 'string' ? JSON.parse(balanceConfig) : balanceConfig;
|
||
|
|
const result = await getBalancedDatasetsByTagsBatch(projectId, parsedConfig, confirmed, offset, batchSize);
|
||
|
|
return NextResponse.json({
|
||
|
|
data: result.data,
|
||
|
|
hasMore: result.hasMore,
|
||
|
|
offset: offset + result.data.length
|
||
|
|
});
|
||
|
|
} else {
|
||
|
|
// 常规分批导出
|
||
|
|
const datasets = await getDatasetsBatch(projectId, confirmed, offset, batchSize);
|
||
|
|
const hasMore = datasets.length === batchSize;
|
||
|
|
return NextResponse.json({
|
||
|
|
data: datasets,
|
||
|
|
hasMore,
|
||
|
|
offset: offset + datasets.length
|
||
|
|
});
|
||
|
|
}
|
||
|
|
} else {
|
||
|
|
// 传统一次性导出模式(保持向后兼容)
|
||
|
|
if (selectedIds && selectedIds.length > 0) {
|
||
|
|
// 按选中 ID 导出
|
||
|
|
const datasets = await getDatasetsByIds(projectId, selectedIds);
|
||
|
|
return NextResponse.json(datasets);
|
||
|
|
} else if (balanceMode === 'true' && balanceConfig) {
|
||
|
|
// 平衡导出模式
|
||
|
|
const parsedConfig = typeof balanceConfig === 'string' ? JSON.parse(balanceConfig) : balanceConfig;
|
||
|
|
const datasets = await getBalancedDatasetsByTags(projectId, parsedConfig, confirmed);
|
||
|
|
return NextResponse.json(datasets);
|
||
|
|
} else {
|
||
|
|
// 常规导出模式
|
||
|
|
const datasets = await getDatasets(projectId, confirmed);
|
||
|
|
return NextResponse.json(datasets);
|
||
|
|
}
|
||
|
|
}
|
||
|
|
} catch (error) {
|
||
|
|
console.error('Failed to get datasets:', String(error));
|
||
|
|
return NextResponse.json(
|
||
|
|
{
|
||
|
|
error: error.message || 'Failed to get datasets'
|
||
|
|
},
|
||
|
|
{ status: 500 }
|
||
|
|
);
|
||
|
|
}
|
||
|
|
}
|