62 lines
1.8 KiB
TypeScript
62 lines
1.8 KiB
TypeScript
import { NextResponse } from 'next/server'
|
|
import { getServerSession } from 'next-auth'
|
|
|
|
import { authOptions } from '@/lib/auth'
|
|
import { isSuperAdmin } from '@/lib/department-permission'
|
|
import {
|
|
type NotificationCenterAdminActor,
|
|
NotificationCenterAdminError,
|
|
} from '@/lib/notification-center-admin'
|
|
|
|
export async function requireNotificationCenterSuperAdmin(): Promise<
|
|
{ actor: NotificationCenterAdminActor; session: unknown } | { response: NextResponse }
|
|
> {
|
|
const session = await getServerSession(authOptions)
|
|
const user = (session as {
|
|
user?: { id?: string; username?: string; realName?: string | null; email?: string | null }
|
|
} | null)?.user
|
|
|
|
if (!user?.id) {
|
|
return {
|
|
response: NextResponse.json({ success: false, error: '未登录' }, { status: 401 }),
|
|
}
|
|
}
|
|
|
|
if (!(await isSuperAdmin(user.id))) {
|
|
return {
|
|
response: NextResponse.json({ success: false, error: '仅超级管理员可访问通知中心管理接口' }, { status: 403 }),
|
|
}
|
|
}
|
|
|
|
return {
|
|
actor: {
|
|
userId: user.id,
|
|
username: user.username || null,
|
|
realName: user.realName || null,
|
|
email: user.email || null,
|
|
},
|
|
session,
|
|
}
|
|
}
|
|
|
|
export function toNotificationCenterAdminErrorResponse(error: unknown) {
|
|
if (error instanceof NotificationCenterAdminError) {
|
|
return NextResponse.json(
|
|
{
|
|
success: false,
|
|
error: error.message,
|
|
...(error.details ? { details: error.details } : {}),
|
|
code: error.code,
|
|
},
|
|
{ status: error.statusCode },
|
|
)
|
|
}
|
|
|
|
const message = error instanceof Error ? error.message : '通知中心请求失败'
|
|
console.error('[notification-center-admin] route error:', message)
|
|
return NextResponse.json(
|
|
{ success: false, error: '通知中心请求失败,请稍后重试', code: 'NOTIFICATION_CENTER_ADMIN_ROUTE_ERROR' },
|
|
{ status: 500 },
|
|
)
|
|
}
|