fix: simplify login flow - JWT role instant, no DB queries blocking navigation
This commit is contained in:
@ -1,6 +1,7 @@
|
||||
/** Vue Router configuration */
|
||||
import { createRouter, createWebHistory } from 'vue-router'
|
||||
import { supabase } from '@/supabase'
|
||||
import { useAuthStore } from '@/stores/auth'
|
||||
|
||||
const router = createRouter({
|
||||
history: createWebHistory(import.meta.env.BASE_URL),
|
||||
@ -147,48 +148,34 @@ const router = createRouter({
|
||||
})
|
||||
|
||||
router.beforeEach(async (to, _from, next) => {
|
||||
// Rutas completamente públicas (splash, login)
|
||||
const publicRoutes = ['/login', '/splash', '/']
|
||||
if (publicRoutes.includes(to.path)) {
|
||||
// Rutas sin protección → pasar directo
|
||||
if (!to.meta.requiresAuth && !to.meta.role) {
|
||||
return next()
|
||||
}
|
||||
|
||||
// Leer sesión activa de Supabase
|
||||
// Verificar sesión activa
|
||||
const { data: { session } } = await supabase.auth.getSession()
|
||||
|
||||
// Ruta protegida sin sesión → redirige a login
|
||||
if (to.meta.requiresAuth && !session) {
|
||||
// Sin sesión en ruta protegida → login
|
||||
if (!session) {
|
||||
return next('/login')
|
||||
}
|
||||
|
||||
// Si hay sesión, obtener el rol real del usuario
|
||||
if (session) {
|
||||
const { data: profile } = await supabase
|
||||
.from('users')
|
||||
.select('role')
|
||||
.eq('id', session.user.id)
|
||||
.single()
|
||||
// Si la ruta requiere un rol específico, verificar usando el store
|
||||
if (to.meta.role) {
|
||||
// Usar el store de auth (ya tiene el rol cargado desde el JWT)
|
||||
const authStore = useAuthStore()
|
||||
const userRole = authStore.role?.toUpperCase() || 'PASSENGER'
|
||||
|
||||
const userRole = profile?.role?.toUpperCase() || 'PASSENGER'
|
||||
const allowedRoles = Array.isArray(to.meta.role)
|
||||
? (to.meta.role as string[]).map(r => r.toUpperCase())
|
||||
: [(to.meta.role as string).toUpperCase()]
|
||||
|
||||
// Si el admin entra a rutas de pasajero → redirigir al panel admin
|
||||
const passengerRoutes = ['/map', '/schedule', '/discover', '/transport', '/favorites', '/profile', '/coupons']
|
||||
if (userRole === 'ADMIN' && passengerRoutes.some(r => to.path.startsWith(r))) {
|
||||
return next('/admin')
|
||||
}
|
||||
|
||||
// Ruta con restricción de rol → verificar permiso
|
||||
if (to.meta.role) {
|
||||
const allowedRoles = Array.isArray(to.meta.role)
|
||||
? (to.meta.role as string[]).map(r => r.toUpperCase())
|
||||
: [(to.meta.role as string).toUpperCase()]
|
||||
|
||||
if (!allowedRoles.includes(userRole)) {
|
||||
if (userRole === 'ADMIN') return next('/admin')
|
||||
else if (userRole === 'DRIVER') return next('/driver')
|
||||
else if (userRole === 'PROMOTER') return next('/promoter')
|
||||
else return next('/map')
|
||||
}
|
||||
if (!allowedRoles.includes(userRole)) {
|
||||
if (userRole === 'ADMIN') return next('/admin')
|
||||
else if (userRole === 'DRIVER') return next('/driver')
|
||||
else if (userRole === 'PROMOTER') return next('/promoter')
|
||||
else return next('/map')
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
Reference in New Issue
Block a user