import { NextResponse } from "next/server"; const publicRoutes = ["/", "/properties", "/terms", "/privacy", "/faq", "/support"]; const authRoutes = ["/login", "/auth/choose-role", "/forgot-password", "/register/owner", "/register/tenant", "/register/agent"]; const ownerRoutes = ["/owner", "/owner/account-book", "/owner/bookings", "/owner/calendar", "/owner/profits", "/owner/properties", "/owner/reservations"]; function getRolesFromToken(token) { if (!token) return []; try { let base64 = token.split(".")[1].replace(/-/g, "+").replace(/_/g, "/"); while (base64.length % 4 !== 0) base64 += "="; const payload = JSON.parse(atob(base64)); const roles = payload["http://schemas.microsoft.com/ws/2008/06/identity/claims/role"]; if (Array.isArray(roles)) return roles; return roles ? [roles] : []; } catch { return []; } } export function middleware(request) { const { pathname } = request.nextUrl; const token = request.cookies.get("auth_token")?.value; const isOwner = getRolesFromToken(token).includes("Owner"); const isPublicRoute = publicRoutes.some((route) => pathname === route || (route !== "/" && pathname.startsWith(route))); const isAuthRoute = authRoutes.some((route) => pathname === route || pathname.startsWith(route)); const isOwnerRoute = ownerRoutes.some((route) => pathname === route || pathname.startsWith(route)); if (!token && !isPublicRoute && !isAuthRoute) { return NextResponse.redirect(new URL("/login", request.url)); } if (token && isAuthRoute) { return NextResponse.redirect(new URL("/", request.url)); } if (isOwnerRoute && !isOwner) { return NextResponse.redirect(new URL("/", request.url)); } return NextResponse.next(); } export const config = { matcher: ["/((?!api|_next/static|_next/image|favicon.ico|.*\\.(?:png|jpg|jpeg|gif|svg|ico|webp|css|js|woff|woff2|ttf|eot)$).*)"], };