lomavuokraus/middleware.ts
Tero Halla-aho 0bb709d9c5
Some checks failed
CI / checks (push) Has been cancelled
chore: fix audit alerts and formatting
2026-02-04 12:43:03 +02:00

47 lines
1.3 KiB
TypeScript

import { NextRequest, NextResponse } from "next/server";
import { getAuthFromRequest } from "./lib/jwt";
const ADMIN_ONLY_PATHS = ["/admin/users", "/admin/monitor", "/admin/settings"];
const MODERATOR_PATHS = ["/admin/pending"];
function buildLoginRedirect(req: NextRequest) {
const url = new URL("/auth/login", req.url);
url.searchParams.set("redirect", req.nextUrl.pathname + req.nextUrl.search);
return url;
}
export async function middleware(req: NextRequest) {
const { pathname } = req.nextUrl;
if (!pathname.startsWith("/admin")) {
return NextResponse.next();
}
const session = await getAuthFromRequest(req);
if (!session) {
return NextResponse.redirect(buildLoginRedirect(req));
}
const role = session.role;
const isAdminOnly = ADMIN_ONLY_PATHS.some((p) => pathname.startsWith(p));
if (isAdminOnly && role !== "ADMIN") {
return NextResponse.redirect(new URL("/", req.url));
}
const isModeratorPath = MODERATOR_PATHS.some((p) => pathname.startsWith(p));
if (
isModeratorPath &&
!(
role === "ADMIN" ||
role === "USER_MODERATOR" ||
role === "LISTING_MODERATOR"
)
) {
return NextResponse.redirect(new URL("/", req.url));
}
return NextResponse.next();
}
export const config = {
matcher: ["/admin/:path*"],
};