Files
service-finder/frontend/src/router/index.js

151 lines
5.5 KiB
JavaScript
Executable File

import { createRouter, createWebHistory } from 'vue-router';
// Nézetek importálása
import Dashboard from '../views/Dashboard.vue';
import Expenses from '../views/Expenses.vue';
import AddExpense from '../views/AddExpense.vue';
import Login from '../views/Login.vue';
import Register from '../views/Register.vue';
import ForgotPassword from '../views/ForgotPassword.vue';
import ResetPassword from '../views/ResetPassword.vue';
import AddVehicle from '../views/AddVehicle.vue';
import AdminStats from '../views/admin/AdminStats.vue';
import ProfileSelect from '../views/ProfileSelect.vue';
import Debug from '../views/Debug.vue';
const routes = [
// Védett útvonalak
{ path: '/', name: 'Dashboard', component: Dashboard, meta: { requiresAuth: true } },
{ path: '/expenses', name: 'Expenses', component: Expenses, meta: { requiresAuth: true } },
{ path: '/expenses/add', name: 'AddExpense', component: AddExpense, meta: { requiresAuth: true } },
{ path: '/vehicles/add', name: 'AddVehicle', component: AddVehicle, meta: { requiresAuth: true } },
// Profile selection (public but requires auth)
{ path: '/profile-select', name: 'ProfileSelect', component: ProfileSelect, meta: { requiresAuth: true } },
// ADMIN útvonal
{
path: '/admin',
name: 'Admin',
component: AdminStats,
meta: { requiresAuth: true, requiresAdmin: true }
},
// Nyilvános útvonalak
{ path: '/login', name: 'Login', component: Login },
{ path: '/register', name: 'Register', component: Register },
{ path: '/forgot-password', name: 'ForgotPassword', component: ForgotPassword },
{ path: '/reset-password', name: 'ResetPassword', component: ResetPassword },
// DEBUG útvonal (nyilvános, nincs auth check)
{ path: '/debug', name: 'Debug', component: Debug },
];
const router = createRouter({
history: createWebHistory(),
routes
});
// Helper function to check if UI mode is selected
function hasUIModeSelected() {
if (typeof window === 'undefined') return false;
const saved = localStorage.getItem('ui_mode');
// Accept both UI values (private_garage, corporate_fleet) and backend values (personal, fleet)
return saved === 'private_garage' || saved === 'corporate_fleet' || saved === 'personal' || saved === 'fleet';
}
// A "SOROMPÓ" (Auth Guard) LOGIKA
router.beforeEach((to, from, next) => {
console.group('🚀 Router Navigation Guard - Flight Recorder');
console.log(`📊 Navigation: ${from.path}${to.path}`);
console.log(`📍 To Route:`, to);
const token = localStorage.getItem('token');
const isAdmin = localStorage.getItem('is_admin') === 'true';
const uiMode = localStorage.getItem('ui_mode');
// Import stores to get real-time state
let isAuthenticated = false;
let appMode = null;
try {
// Try to get auth store state if available
const authStore = window.__pinia?.state.value?.auth;
if (authStore) {
isAuthenticated = !!authStore.token;
console.log('🔐 Auth Store State:', authStore);
}
} catch (e) {
console.warn('⚠️ Could not access auth store:', e.message);
}
try {
// Try to get app mode store state if available
const appModeStore = window.__pinia?.state.value?.appMode;
if (appModeStore) {
appMode = appModeStore.mode;
console.log('🎛️ App Mode Store State:', appModeStore);
}
} catch (e) {
console.warn('⚠️ Could not access app mode store:', e.message);
}
console.log('📋 Authentication Status:');
console.log(' • Token in localStorage:', token ? `YES (${token.substring(0, 20)}...)` : 'NO');
console.log(' • isAdmin flag:', isAdmin);
console.log(' • UI Mode in localStorage:', uiMode || 'NOT SET');
console.log(' • Auth Store isAuthenticated:', isAuthenticated);
console.log(' • App Mode Store mode:', appMode);
console.log(' • Route requiresAuth:', to.meta.requiresAuth || false);
console.log(' • Route requiresAdmin:', to.meta.requiresAdmin || false);
// Auth check
if (to.meta.requiresAuth && !token) {
console.warn('❌ AUTH FAILED: Route requires auth but no token found');
console.warn(` ↳ Redirecting to /login (from ${to.path})`);
console.groupEnd();
next('/login');
return;
}
// Admin check
if (to.meta.requiresAdmin && !isAdmin) {
console.warn('❌ ADMIN CHECK FAILED: Route requires admin but user is not admin');
console.warn(` ↳ Redirecting to / (from ${to.path})`);
console.groupEnd();
next('/');
return;
}
// UI mode selection logic
if (to.meta.requiresAuth && token) {
const hasMode = hasUIModeSelected();
console.log('🎯 UI Mode Check:');
console.log(' • hasUIModeSelected():', hasMode);
console.log(' • Target route name:', to.name);
// If user tries to access dashboard without mode selection, redirect to profile-select
if (to.name === 'Dashboard' && !hasMode) {
console.warn('⚠️ UI MODE MISSING: Dashboard access without mode selection');
console.warn(` ↳ Redirecting to /profile-select (from ${to.path})`);
console.groupEnd();
next('/profile-select');
return;
}
// If user tries to access profile-select but already has mode, redirect to dashboard
if (to.name === 'ProfileSelect' && hasMode) {
console.warn('⚠️ UI MODE ALREADY SET: Profile-select access with existing mode');
console.warn(` ↳ Redirecting to / (from ${to.path})`);
console.groupEnd();
next('/');
return;
}
}
console.log('✅ ALL CHECKS PASSED: Allowing navigation to', to.path);
console.groupEnd();
next();
});
export default router;