sistema-de-chamados/middleware.ts

43 lines
1.4 KiB
TypeScript

import { NextRequest, NextResponse } from "next/server"
import { getCookieCache } from "better-auth/cookies"
// Rotas públicas explícitas (não autenticadas)
const PUBLIC_PATHS = [/^\/login$/]
// Rotas somente admin
const ADMIN_ONLY_PATHS = [/^\/admin(?:$|\/)/]
const APP_HOME = "/dashboard"
export async function middleware(request: NextRequest) {
const { pathname, search } = request.nextUrl
if (PUBLIC_PATHS.some((pattern) => pattern.test(pathname))) return NextResponse.next()
const session = await getCookieCache(request)
if (!session?.user) {
const redirectUrl = new URL("/login", request.url)
redirectUrl.searchParams.set("callbackUrl", pathname + search)
return NextResponse.redirect(redirectUrl)
}
const role = (session.user as { role?: string })?.role?.toLowerCase() ?? "agent"
const isAdmin = role === "admin"
// Em desenvolvimento, evitamos bloquear rotas admin por possíveis diferenças
// de cache de cookie/sessão entre dev server e middleware. Em produção, aplica o gate.
if (
process.env.NODE_ENV === "production" &&
!isAdmin &&
ADMIN_ONLY_PATHS.some((pattern) => pattern.test(pathname))
) {
return NextResponse.redirect(new URL(APP_HOME, request.url))
}
return NextResponse.next()
}
export const config = {
runtime: "nodejs",
// Evita executar para assets e imagens estáticas
matcher: ["/((?!api|_next/static|_next/image|favicon.ico|icon.png).*)"],
}