40 lines
1.0 KiB
TypeScript
40 lines
1.0 KiB
TypeScript
import type { NextRequest } from "next/server";
|
|
import { SESSION_COOKIE_NAME, getUserFromSessionToken } from "@/lib/auth";
|
|
import type { HttpError, UserRecord } from "@/lib/types";
|
|
|
|
export function getApiCurrentUser(request: NextRequest): UserRecord | null {
|
|
const sessionToken = request.cookies.get(SESSION_COOKIE_NAME)?.value;
|
|
|
|
return getUserFromSessionToken(sessionToken);
|
|
}
|
|
|
|
export function requireApiUser(request: NextRequest): UserRecord {
|
|
const user = getApiCurrentUser(request);
|
|
|
|
if (!user) {
|
|
const error = new Error("请先登录。") as HttpError;
|
|
error.statusCode = 401;
|
|
throw error;
|
|
}
|
|
|
|
if (!user.isActive) {
|
|
const error = new Error("当前账号已被禁用。") as HttpError;
|
|
error.statusCode = 403;
|
|
throw error;
|
|
}
|
|
|
|
return user;
|
|
}
|
|
|
|
export function requireApiAdmin(request: NextRequest): UserRecord {
|
|
const user = requireApiUser(request);
|
|
|
|
if (user.role !== "admin") {
|
|
const error = new Error("需要管理员权限。") as HttpError;
|
|
error.statusCode = 403;
|
|
throw error;
|
|
}
|
|
|
|
return user;
|
|
}
|