This commit is contained in:
1 parent
e85e4d74ea
commit
2e4ed76121
378 files changed
+22404
-20686
No files matched your search
+25
-19
@@ -1,38 +1,44 @@
|
||||
import type { NextRequest } from 'next/server'
|
||||
import { NextResponse } from 'next/server'
|
||||
import { logAuthorizationEvent } from '@/lib/admin/authorization-events'
|
||||
import { canAccess, getApiAdminContext } from '@/lib/permissions'
|
||||
import { logServerError } from '@/lib/server-log'
|
||||
import type { NextRequest } from "next/server";
|
||||
import { NextResponse } from "next/server";
|
||||
import { logAuthorizationEvent } from "@/lib/admin/authorization-events";
|
||||
import { canAccess, getApiAdminContext } from "@/lib/permissions";
|
||||
import { logServerError } from "@/lib/server-log";
|
||||
|
||||
type AdminContext = NonNullable<Awaited<ReturnType<typeof getApiAdminContext>>>
|
||||
type RouteContext = { params?: Promise<Record<string, string | string[]>> }
|
||||
type AdminContext = NonNullable<Awaited<ReturnType<typeof getApiAdminContext>>>;
|
||||
type RouteContext = { params?: Promise<Record<string, string | string[]>> };
|
||||
type AdminHandler = (
|
||||
request: NextRequest,
|
||||
context: AdminContext,
|
||||
routeContext: RouteContext,
|
||||
) => Promise<Response> | Response
|
||||
) => Promise<Response> | Response;
|
||||
|
||||
export function withAdmin(options: { permission?: string }, handler: AdminHandler) {
|
||||
return async (request: NextRequest, routeContext: RouteContext = {}) => {
|
||||
const context = await getApiAdminContext()
|
||||
if (!context) return NextResponse.json({ ok: false, error: 'Unauthorized' }, { status: 401 })
|
||||
if (options.permission && !canAccess(context.permissions, options.permission, context.session.user.rank)) {
|
||||
const context = await getApiAdminContext();
|
||||
if (!context) return NextResponse.json({ ok: false, error: "Unauthorized" }, { status: 401 });
|
||||
if (
|
||||
options.permission &&
|
||||
!canAccess(context.permissions, options.permission, context.session.user.rank)
|
||||
) {
|
||||
await logAuthorizationEvent({
|
||||
kind: 'permission.denied',
|
||||
kind: "permission.denied",
|
||||
userId: context.session.user.id,
|
||||
username: context.session.user.username,
|
||||
rank: context.session.user.rank,
|
||||
permission: options.permission,
|
||||
source: request.nextUrl.pathname,
|
||||
reason: 'API permission check denied',
|
||||
})
|
||||
return NextResponse.json({ ok: false, error: 'Forbidden' }, { status: 403 })
|
||||
reason: "API permission check denied",
|
||||
});
|
||||
return NextResponse.json({ ok: false, error: "Forbidden" }, { status: 403 });
|
||||
}
|
||||
try {
|
||||
return await handler(request, context, routeContext)
|
||||
return await handler(request, context, routeContext);
|
||||
} catch (error) {
|
||||
logServerError('admin.api_failed', error, { path: request.nextUrl.pathname, userId: context.session.user.id })
|
||||
return NextResponse.json({ ok: false, error: 'Internal server error' }, { status: 500 })
|
||||
logServerError("admin.api_failed", error, {
|
||||
path: request.nextUrl.pathname,
|
||||
userId: context.session.user.id,
|
||||
});
|
||||
return NextResponse.json({ ok: false, error: "Internal server error" }, { status: 500 });
|
||||
}
|
||||
}
|
||||
};
|
||||
}
|
||||
Reference in new issue
Block a user