94 lines
2.5 KiB
TypeScript

/**
* 回收站 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 }
)
}
}