create-apppaaaul
Version:
Create projects as paaauldev would
107 lines (85 loc) • 3.39 kB
text/typescript
import { NextRequest, NextResponse } from "next/server";
import { headers } from "next/headers";
import { auth } from "@/lib/auth";
// Rutas públicas que no requieren autenticación
const publicRoutes = [
"/",
"/login",
"/marketplace",
"/politica-cookies",
"/politica-privacidad",
"/terminos-condiciones",
"/api/auth",
"/dashboard"
];
// Rutas que requieren autenticación de usuario (role: user)
const userRoutes = [""];
// Rutas que requieren autenticación de admin (role: admin)
const adminRoutes = ["/admin"];
export async function proxy(request: NextRequest) {
const { pathname } = request.nextUrl;
// Verificar si la ruta es pública
const isPublicRoute = publicRoutes.some(
(route) => pathname === route || pathname.startsWith(route + "/"),
);
// Si es una ruta pública, permitir acceso
if (isPublicRoute) {
return NextResponse.next();
}
// Obtener sesión
const session = await auth.api.getSession({
headers: await headers(),
});
// Si no hay sesión, redirigir al login
if (!session) {
return NextResponse.redirect(new URL("/login", request.url));
}
const userRole = session.user.role;
// Verificar si el usuario está baneado y perfil incompleto en una sola consulta
// Solo verificar si no está ya en la página de perfil, resumen o login para evitar bucles
if (pathname !== "/dashboard" && pathname !== "/login") {
try {
const userData = await auth.api.getUser({ query: { id: session.user.id } });
if (!userData) {
// Si no se puede obtener los datos del usuario, redirigir al login
console.error("User data not found for session:", session.user.id);
return NextResponse.redirect(new URL("/login?error=user_not_found", request.url));
}
} catch (error) {
// Si hay error obteniendo los datos del usuario, log detallado y permitir continuar
console.error("Error checking user status in proxy:", {
error: error instanceof Error ? error.message : error,
userId: session.user.id,
pathname,
});
}
}
// Verificar rutas de admin
const isAdminRoute = adminRoutes.some((route) => pathname.startsWith(route));
if (isAdminRoute && userRole !== "admin") {
// Si no es admin, redirigir al panel de usuario
return NextResponse.redirect(new URL("/dashboard", request.url));
}
// Verificar rutas de usuario y dashboard
const isUserRoute = userRoutes.some((route) => pathname.startsWith(route));
if (isUserRoute && userRole !== "user" && userRole !== "admin") {
// Si no es usuario ni admin, redirigir al login
return NextResponse.redirect(new URL("/login", request.url));
}
// Si es admin y está intentando acceder a rutas de usuario, permitir
if (userRole === "admin") {
return NextResponse.next();
}
// Si es usuario normal, verificar que no esté intentando acceder a rutas de admin
if (userRole === "user" && isAdminRoute) {
return NextResponse.redirect(new URL("/dashboard", request.url));
}
return NextResponse.next();
}
export const config = {
runtime: "nodejs",
matcher: [
// Aplicar proxy a todas las rutas excepto archivos estáticos
"/((?!_next/static|_next/image|favicon.ico|.*\\.(?:svg|png|jpg|jpeg|gif|webp)$).*)",
],
};