177 lines
5.9 KiB
JavaScript
177 lines
5.9 KiB
JavaScript
import { NextResponse } from 'next/server';
|
||
import { getUploadFileInfoById } from '@/lib/db/upload-files';
|
||
import { createGaPairs, getGaPairsByFileId } from '@/lib/db/ga-pairs';
|
||
|
||
/**
|
||
* 批量手动添加 GA 对到多个文件
|
||
*/
|
||
export async function POST(request, { params }) {
|
||
try {
|
||
const { projectId } = params;
|
||
const body = await request.json();
|
||
|
||
if (!projectId) {
|
||
return NextResponse.json({ error: 'Project ID is required' }, { status: 400 });
|
||
}
|
||
|
||
const { fileIds, gaPair, appendMode = false } = body;
|
||
|
||
if (!fileIds || !Array.isArray(fileIds) || fileIds.length === 0) {
|
||
return NextResponse.json({ error: 'File IDs array is required' }, { status: 400 });
|
||
}
|
||
|
||
if (!gaPair || !gaPair.genreTitle || !gaPair.audienceTitle) {
|
||
return NextResponse.json({ error: 'GA pair with genreTitle and audienceTitle is required' }, { status: 400 });
|
||
}
|
||
|
||
console.log('开始处理批量手动添加GA对请求');
|
||
console.log('项目ID:', projectId);
|
||
console.log('请求的文件IDs:', fileIds);
|
||
console.log('GA对:', gaPair);
|
||
|
||
// 使用 getUploadFileInfoById 逐个验证文件
|
||
const validFiles = [];
|
||
const invalidFileIds = [];
|
||
|
||
for (const fileId of fileIds) {
|
||
try {
|
||
console.log(`正在验证文件: ${fileId}`);
|
||
const fileInfo = await getUploadFileInfoById(fileId);
|
||
|
||
if (fileInfo && fileInfo.projectId === projectId) {
|
||
console.log(`文件验证成功: ${fileInfo.fileName}`);
|
||
validFiles.push(fileInfo);
|
||
} else if (fileInfo) {
|
||
console.log(`文件属于其他项目: ${fileInfo.projectId} != ${projectId}`);
|
||
invalidFileIds.push(fileId);
|
||
} else {
|
||
console.log(`文件不存在: ${fileId}`);
|
||
invalidFileIds.push(fileId);
|
||
}
|
||
} catch (error) {
|
||
console.error(`验证文件 ${fileId} 时出错:`, String(error));
|
||
invalidFileIds.push(fileId);
|
||
}
|
||
}
|
||
|
||
console.log(`文件验证完成: 有效${validFiles.length}个, 无效${invalidFileIds.length}个`);
|
||
|
||
if (validFiles.length === 0) {
|
||
return NextResponse.json(
|
||
{
|
||
error: 'No valid files found',
|
||
debug: {
|
||
projectId,
|
||
requestedIds: fileIds,
|
||
invalidIds: invalidFileIds,
|
||
message: 'None of the requested files belong to this project or exist in the database'
|
||
}
|
||
},
|
||
{ status: 404 }
|
||
);
|
||
}
|
||
|
||
// 批量手动添加 GA 对
|
||
console.log('开始批量手动添加GA对...');
|
||
console.log('追加模式:', appendMode);
|
||
const results = [];
|
||
|
||
for (const file of validFiles) {
|
||
try {
|
||
console.log(`处理文件: ${file.fileName}`);
|
||
|
||
// 检查是否已存在 GA 对
|
||
const existingPairs = await getGaPairsByFileId(file.id);
|
||
|
||
let pairNumber = 1;
|
||
if (appendMode && existingPairs && existingPairs.length > 0) {
|
||
// 追加模式:在现有 GA 对后面添加
|
||
pairNumber = existingPairs.length + 1;
|
||
} else if (!appendMode && existingPairs && existingPairs.length > 0) {
|
||
// 非追加模式:如果已存在 GA 对则跳过
|
||
console.log(`文件 ${file.fileName} 已存在GA对,跳过`);
|
||
results.push({
|
||
fileId: file.id,
|
||
fileName: file.fileName,
|
||
success: true,
|
||
skipped: true,
|
||
message: 'GA pairs already exist'
|
||
});
|
||
continue;
|
||
}
|
||
|
||
// 创建 GA 对数据
|
||
const gaPairData = [
|
||
{
|
||
projectId,
|
||
fileId: file.id,
|
||
pairNumber,
|
||
genreTitle: gaPair.genreTitle.trim(),
|
||
genreDesc: gaPair.genreDesc?.trim() || '',
|
||
audienceTitle: gaPair.audienceTitle.trim(),
|
||
audienceDesc: gaPair.audienceDesc?.trim() || '',
|
||
isActive: true
|
||
}
|
||
];
|
||
|
||
// 保存 GA 对
|
||
if (appendMode) {
|
||
// 追加模式:只创建新的 GA 对
|
||
await createGaPairs(gaPairData);
|
||
} else {
|
||
// 非追加模式:使用 saveGaPairs 替换现有的
|
||
const { saveGaPairs } = await import('@/lib/db/ga-pairs');
|
||
await saveGaPairs(projectId, file.id, [
|
||
{
|
||
genre: { title: gaPair.genreTitle.trim(), description: gaPair.genreDesc?.trim() || '' },
|
||
audience: { title: gaPair.audienceTitle.trim(), description: gaPair.audienceDesc?.trim() || '' }
|
||
}
|
||
]);
|
||
}
|
||
|
||
results.push({
|
||
fileId: file.id,
|
||
fileName: file.fileName,
|
||
success: true,
|
||
skipped: false,
|
||
message: 'GA pair added successfully'
|
||
});
|
||
|
||
console.log(`成功为文件 ${file.fileName} 添加GA对`);
|
||
} catch (error) {
|
||
console.error(`为文件 ${file.fileName} 添加GA对失败:`, error);
|
||
results.push({
|
||
fileId: file.id,
|
||
fileName: file.fileName,
|
||
success: false,
|
||
skipped: false,
|
||
error: error.message,
|
||
message: `Failed: ${error.message}`
|
||
});
|
||
}
|
||
}
|
||
|
||
// 统计结果
|
||
const successCount = results.filter(r => r.success).length;
|
||
const failureCount = results.filter(r => !r.success).length;
|
||
|
||
console.log(`批量手动添加完成: 成功${successCount}个, 失败${failureCount}个`);
|
||
|
||
return NextResponse.json({
|
||
success: true,
|
||
data: results,
|
||
summary: {
|
||
total: results.length,
|
||
success: successCount,
|
||
failure: failureCount,
|
||
processed: validFiles.length,
|
||
skipped: invalidFileIds.length
|
||
},
|
||
message: `Added GA pairs to ${successCount} files, ${failureCount} failed, ${invalidFileIds.length} files not found`
|
||
});
|
||
} catch (error) {
|
||
console.error('Error batch adding manual GA pairs:', String(error));
|
||
return NextResponse.json({ error: String(error) || 'Failed to batch add manual GA pairs' }, { status: 500 });
|
||
}
|
||
}
|