116 lines
3.8 KiB
JavaScript
116 lines
3.8 KiB
JavaScript
import { createRouter, createWebHashHistory } from 'vue-router'
|
|
import Dashboard from '../views/Dashboard.vue'
|
|
import Accounts from '../views/Accounts.vue'
|
|
import Rules from '../views/Rules.vue'
|
|
import Logs from '../views/Logs.vue'
|
|
import Messages from '../views/Messages.vue'
|
|
import SystemLogs from '../views/SystemLogs.vue'
|
|
import ReceivedMessages from '../views/ReceivedMessages.vue'
|
|
import Login from '../views/Login.vue'
|
|
import Users from '../views/Users.vue'
|
|
import Roles from '../views/Roles.vue'
|
|
import Settings from '../views/Settings.vue'
|
|
import DesktopUpdate from '../views/DesktopUpdate.vue'
|
|
import PaymentSettings from '../views/PaymentSettings.vue'
|
|
import MyPaymentOrders from '../views/MyPaymentOrders.vue'
|
|
import Help from '../views/Help.vue'
|
|
import Download from '../views/Download.vue'
|
|
import { useAuthStore } from '../stores/auth'
|
|
import { firstAccessiblePath, MENU_ITEMS, menuAccessible } from '../config/menus'
|
|
|
|
|
|
const routes = [
|
|
{ path: '/login', component: Login, name: 'Login', meta: { public: true } },
|
|
{ path: '/', component: Dashboard, name: 'Dashboard', meta: { permission: 'menu.dashboard' } },
|
|
{ path: '/accounts', component: Accounts, name: 'Accounts', meta: { permission: 'menu.accounts' } },
|
|
{ path: '/messages', component: Messages, name: 'Messages', meta: { permission: 'menu.messages' } },
|
|
{ path: '/rules', component: Rules, name: 'Rules', meta: { permission: 'menu.rules' } },
|
|
{ path: '/logs', component: Logs, name: 'Logs', meta: { permission: 'menu.logs' } },
|
|
{
|
|
path: '/received-messages',
|
|
component: ReceivedMessages,
|
|
name: 'ReceivedMessages',
|
|
meta: { permission: 'menu.received_messages' }
|
|
},
|
|
{
|
|
path: '/system-logs',
|
|
component: SystemLogs,
|
|
name: 'SystemLogs',
|
|
meta: { permission: 'menu.system_logs' }
|
|
},
|
|
{ path: '/users', component: Users, name: 'Users', meta: { permission: 'menu.users' } },
|
|
{ path: '/roles', component: Roles, name: 'Roles', meta: { permission: 'menu.roles' } },
|
|
{ path: '/settings', component: Settings, name: 'Settings', meta: { permission: 'menu.settings' } },
|
|
{
|
|
path: '/desktop-update',
|
|
component: DesktopUpdate,
|
|
name: 'DesktopUpdate',
|
|
meta: { permission: 'menu.desktop_update' }
|
|
},
|
|
{
|
|
path: '/payment-settings',
|
|
component: PaymentSettings,
|
|
name: 'PaymentSettings',
|
|
meta: { permission: 'menu.payment_settings' }
|
|
},
|
|
{
|
|
path: '/payment-orders',
|
|
component: MyPaymentOrders,
|
|
name: 'MyPaymentOrders',
|
|
meta: { permission: 'menu.payment_orders' }
|
|
},
|
|
{ path: '/help', component: Help, name: 'Help', meta: { permission: 'menu.help' } },
|
|
{ path: '/download', component: Download, name: 'Download', meta: { permission: 'menu.download' } }
|
|
]
|
|
|
|
const router = createRouter({
|
|
history: createWebHashHistory(),
|
|
routes
|
|
})
|
|
|
|
router.beforeEach(async (to) => {
|
|
const auth = useAuthStore()
|
|
|
|
if (to.meta.public) {
|
|
if (auth.isLoggedIn && to.path === '/login') {
|
|
return firstAccessiblePath((code) => auth.hasPermission(code))
|
|
}
|
|
return true
|
|
}
|
|
|
|
if (!auth.isLoggedIn) {
|
|
return '/login'
|
|
}
|
|
|
|
if (!auth.user) {
|
|
try {
|
|
await auth.fetchMe()
|
|
} catch {
|
|
auth.clearSession()
|
|
return '/login'
|
|
}
|
|
} else if (!Array.isArray(auth.user.permissions)) {
|
|
// Old localStorage sessions lack the permission list.
|
|
try {
|
|
await auth.fetchMe()
|
|
} catch {
|
|
auth.clearSession()
|
|
return '/login'
|
|
}
|
|
}
|
|
|
|
const required = to.meta.permission
|
|
if (required && !auth.hasPermission(required)) {
|
|
return firstAccessiblePath((code) => auth.hasPermission(code))
|
|
}
|
|
|
|
const menuItem = MENU_ITEMS.find((item) => item.path === to.path)
|
|
if (menuItem && !menuAccessible(menuItem, (code) => auth.hasPermission(code))) {
|
|
return firstAccessiblePath((code) => auth.hasPermission(code))
|
|
}
|
|
|
|
return true
|
|
})
|
|
|
|
export default router
|