/** * 模板素材迁移 API * * POST: 将使用指定模板的素材迁移到另一个模板 */ import { NextRequest, NextResponse } from 'next/server' import { getServerSession } from 'next-auth' import { authOptions } from '@/lib/auth' import { prisma } from '@/lib/prisma' async function ensureAdmin() { const session = await getServerSession(authOptions) if (!session || (session.user as any)?.role !== 'ADMIN') { return null } return session } /** * POST /api/admin/upload-templates/[id]/migrate * * 将使用源模板的素材迁移到目标模板 * * Body: * - targetTemplateId: 目标模板ID * - updateMaterialType: 是否同时更新素材的 materialType 字段(可选,默认 true) */ export async function POST( req: NextRequest, { params }: { params: { id: string } } ) { try { const session = await ensureAdmin() if (!session) { return NextResponse.json({ error: '无权限' }, { status: 403 }) } const sourceTemplateId = params.id const body = await req.json() const { targetTemplateId, updateMaterialType = true } = body if (!targetTemplateId) { return NextResponse.json({ error: '请选择目标模板', errorCode: 'MISSING_TARGET', }, { status: 400 }) } if (sourceTemplateId === targetTemplateId) { return NextResponse.json({ error: '源模板和目标模板不能相同', errorCode: 'SAME_TEMPLATE', }, { status: 400 }) } // 检查源模板是否存在 const sourceTemplate = await prisma.uploadTemplate.findUnique({ where: { id: sourceTemplateId }, select: { id: true, name: true, materialType: true, _count: { select: { materials: true } } }, }) if (!sourceTemplate) { return NextResponse.json({ error: '源模板不存在', errorCode: 'SOURCE_NOT_FOUND', }, { status: 404 }) } // 检查目标模板是否存在 const targetTemplate = await prisma.uploadTemplate.findUnique({ where: { id: targetTemplateId }, select: { id: true, name: true, materialType: true, }, }) if (!targetTemplate) { return NextResponse.json({ error: '目标模板不存在', errorCode: 'TARGET_NOT_FOUND', }, { status: 404 }) } const materialCount = sourceTemplate._count.materials if (materialCount === 0) { return NextResponse.json({ success: true, migratedCount: 0, message: '没有需要迁移的素材', }) } console.log('[TemplateMigrate] Starting migration:', { sourceTemplateId, sourceTemplateName: sourceTemplate.name, targetTemplateId, targetTemplateName: targetTemplate.name, materialCount, updateMaterialType, }) // 构建更新数据 const updateData: any = { templateId: targetTemplateId, } // 如果需要更新 materialType if (updateMaterialType && targetTemplate.materialType) { updateData.materialType = targetTemplate.materialType } // 批量更新素材 const result = await prisma.material.updateMany({ where: { templateId: sourceTemplateId }, data: updateData, }) console.log('[TemplateMigrate] Migration completed:', { sourceTemplateId, targetTemplateId, migratedCount: result.count, }) return NextResponse.json({ success: true, migratedCount: result.count, message: `成功将 ${result.count} 个素材从"${sourceTemplate.name}"迁移到"${targetTemplate.name}"`, sourceTemplate: { id: sourceTemplate.id, name: sourceTemplate.name, }, targetTemplate: { id: targetTemplate.id, name: targetTemplate.name, }, }) } catch (error: any) { console.error('[TemplateMigrate] Migration error:', { sourceTemplateId: params.id, error: error?.message, stack: error?.stack, }) return NextResponse.json({ error: error?.message || '迁移失败', errorCode: 'MIGRATION_FAILED', }, { status: 500 }) } }