94 lines
2.5 KiB
TypeScript
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 }
|
|
)
|
|
}
|
|
}
|