2026-05-25 15:36:51 +08:00

83 lines
1.9 KiB
TypeScript

import { NextRequest, NextResponse } from 'next/server'
import { getServerSession } from 'next-auth'
import { authOptions } from '@/lib/auth'
import { prisma } from '@/lib/prisma'
import {
canManageMaterialShare,
getMaterialShareActor,
} from '@/lib/material-share-permissions'
export const dynamic = 'force-dynamic'
export async function DELETE(
_req: NextRequest,
{ params }: { params: { id: string } }
) {
try {
const session = await getServerSession(authOptions)
const actor = await getMaterialShareActor(session)
if (!actor) {
return NextResponse.json(
{ error: '请先登录' },
{ status: 401 }
)
}
const tokenId = params.id?.trim()
if (!tokenId) {
return NextResponse.json(
{ error: '缺少分享链接ID' },
{ status: 400 }
)
}
const token = await prisma.materialShareToken.findUnique({
where: { id: tokenId },
include: {
material: {
select: {
id: true,
userId: true,
ownerType: true,
ownerId: true,
createdByUserId: true,
deletedAt: true,
},
},
},
})
if (!token || token.material.deletedAt) {
return NextResponse.json(
{ error: '分享链接不存在或素材已删除' },
{ status: 404 }
)
}
if (!canManageMaterialShare(token.material, actor)) {
return NextResponse.json(
{ error: '无权撤销该分享链接' },
{ status: 403 }
)
}
if (!token.revokedAt) {
await prisma.materialShareToken.update({
where: { id: token.id },
data: { revokedAt: new Date() },
})
}
return NextResponse.json({
success: true,
id: token.id,
})
} catch (error) {
console.error('[MaterialShareTokens] DELETE error:', error)
return NextResponse.json(
{ error: '撤销分享链接失败' },
{ status: 500 }
)
}
}