import { NextRequest, NextResponse } from 'next/server'; import { prisma } from '@/lib/prisma'; import { access, stat } from 'fs/promises'; import path from 'path'; import { createDownloadError, DownloadErrorCode } from '@/lib/download-errors'; /** * 测试下载接口(绕过登录检查) * 仅用于开发和测试,生产环境应禁用 */ export async function GET(request: NextRequest) { // 检查是否是测试环境 if (process.env.NODE_ENV === 'production') { return NextResponse.json( { error: '此接口仅用于测试' }, { status: 403 } ); } const { searchParams } = new URL(request.url); const materialId = searchParams.get('id'); if (!materialId) { return NextResponse.json( createDownloadError(DownloadErrorCode.INVALID_DOWNLOAD_TYPE, '缺少素材ID'), { status: 400 } ); } try { const material = await prisma.material.findUnique({ where: { id: materialId }, select: { id: true, productModel: true, zipFilePath: true, materialType: true, }, }); if (!material) { return NextResponse.json( createDownloadError(DownloadErrorCode.MATERIAL_NOT_FOUND), { status: 404 } ); } // 检查文件是否存在 if (!material.zipFilePath) { console.log('[Test Download] No zipFilePath for material:', material.id); return NextResponse.json( createDownloadError(DownloadErrorCode.FILE_MISSING, '没有源文件'), { status: 404 } ); } const filePath = path.join(process.cwd(), material.zipFilePath); try { await access(filePath); const fileStats = await stat(filePath); return NextResponse.json({ message: '文件存在', materialId: material.id, productModel: material.productModel, filePath: material.zipFilePath, fileSize: fileStats.size, }); } catch (error) { console.error('[Test Download] File not found:', filePath, 'error:', error); return NextResponse.json( createDownloadError(DownloadErrorCode.FILE_MISSING, '没有源文件'), { status: 404 } ); } } catch (error) { console.error('[Test Download] Error:', error); return NextResponse.json( { error: '查询失败' }, { status: 500 } ); } }