40 lines
1.3 KiB
TypeScript
40 lines
1.3 KiB
TypeScript
import { NextRequest, NextResponse } from "next/server";
|
|
import { decrypt } from "@/lib/session";
|
|
import { cookies } from "next/headers";
|
|
|
|
// Define all public routes here
|
|
const publicRoutes = ["/login"];
|
|
|
|
export default async function middleware(req: NextRequest) {
|
|
const path = req.nextUrl.pathname;
|
|
const isPublicRoute = publicRoutes.includes(path);
|
|
|
|
// Get the session cookie and decrypt it
|
|
const cookie = (await cookies()).get("session")?.value;
|
|
const session = await decrypt(cookie);
|
|
|
|
// If a user is NOT authenticated and is trying to access a PROTECTED route,
|
|
// redirect them to the login page.
|
|
if (!session?.user && !isPublicRoute) {
|
|
return NextResponse.redirect(new URL("/login", req.nextUrl));
|
|
}
|
|
|
|
// If a user IS authenticated and is trying to access a PUBLIC route (like /login),
|
|
// redirect them to a protected route (e.g., a dashboard or home page).
|
|
if (session?.user && isPublicRoute) {
|
|
return NextResponse.redirect(new URL("/dashboard", req.nextUrl));
|
|
}
|
|
|
|
if (session?.user && path == "/") {
|
|
return NextResponse.redirect(new URL("/dashboard", req.nextUrl));
|
|
}
|
|
|
|
// Otherwise, allow the request to proceed
|
|
return NextResponse.next();
|
|
}
|
|
|
|
// Routes Middleware should not run on
|
|
export const config = {
|
|
matcher: ["/((?!api|_next/static|_next/image|.*\\.png$).*)"],
|
|
};
|