/** * 回收站 API - 获取已删除的素材 * * GET: 获取所有已删除的素材(仅管理员) */ import { NextRequest, NextResponse } from 'next/server' import { getServerSession } from 'next-auth' import { authOptions } from '@/lib/auth' import { prisma } from '@/lib/prisma' import { rewriteMaterialStorageUrlsForClient } from '@/lib/url-rewrite' export async function GET(req: NextRequest) { try { const session = await getServerSession(authOptions) if (!session || (session.user as any).role !== 'ADMIN') { return NextResponse.json( { error: '无权限' }, { status: 403 } ) } const { searchParams } = new URL(req.url) const page = parseInt(searchParams.get('page') || '1') const pageSize = parseInt(searchParams.get('pageSize') || '20') const skip = (page - 1) * pageSize // 获取已删除的素材 const [deletedMaterials, total] = await Promise.all([ prisma.material.findMany({ where: { deletedAt: { not: null }, // 只返回已删除的素材 }, select: { id: true, userId: true, productModel: true, previewUrl: true, categoryName: true, sceneName: true, platformName: true, productCategoryName: true, materialType: true, renderer: true, authorName: true, createdAt: true, deletedAt: true, user: { select: { username: true, }, }, }, orderBy: { deletedAt: 'desc' }, skip, take: pageSize, } as any), prisma.material.count({ where: { deletedAt: { not: null }, }, } as any), ]) // 应用 URL 重写(根据用户网络位置选择内网或外网地址) const formatted = deletedMaterials.map((material: any) => rewriteMaterialStorageUrlsForClient(material, req) ) return NextResponse.json({ materials: formatted, total, page, pageSize, totalPages: Math.ceil(total / pageSize), }) } catch (error: any) { // 兼容旧数据库:如果 deletedAt 字段不存在 if (error?.meta?.column?.includes('deletedAt')) { return NextResponse.json( { error: '回收站功能需要先运行数据库迁移' }, { status: 400 } ) } console.error('[Admin Trash] GET error:', error) return NextResponse.json( { error: '获取回收站列表失败' }, { status: 500 } ) } }