export default defineNuxtRouteMiddleware(async (to) => { const auth = useAuthStore() const isLogin = to.path === '/login' if (!auth.checked) { await auth.ensureSession() } if (!isLogin && !auth.isAuthenticated) { return navigateTo('/login') } if (isLogin && auth.isAuthenticated) { return navigateTo('/') } // Cloisonnement portail client : un utilisateur ROLE_CLIENT "pur" (a ROLE_CLIENT // mais PAS ROLE_USER) n'a accès qu'aux pages /portal. Toute autre route interne // est redirigée vers /portal. Les ROLE_ADMIN / ROLE_USER ne sont pas concernés // (ils peuvent aussi visiter /portal pour prévisualiser). if (auth.isAuthenticated && !isLogin) { const roles = auth.user?.roles ?? [] const isPureClient = roles.includes('ROLE_CLIENT') && !roles.includes('ROLE_USER') if (isPureClient) { const isPortalRoute = to.path === '/portal' || to.path.startsWith('/portal/') if (!isPortalRoute) { return navigateTo('/portal') } } } const { loaded: sidebarLoaded, loadSidebar, resetSidebar } = useSidebar() const { loaded: modulesLoaded, loadModules, resetModules } = useModules() if (auth.isAuthenticated) { await Promise.all([ sidebarLoaded.value ? Promise.resolve() : loadSidebar(), modulesLoaded.value ? Promise.resolve() : loadModules(), ]) } else { // Logout / session expirée : purge l'état partagé pour le prochain login. resetSidebar() resetModules() } })