76 lines
3.1 KiB
TypeScript
76 lines
3.1 KiB
TypeScript
import { createRouter, createWebHistory } from 'vue-router'
|
||
import { useUserStore } from '../stores/user'
|
||
import { useSettingsStore } from '../stores/settings'
|
||
import Login from '../views/auth/Login.vue'
|
||
import Setup from '../views/auth/Setup.vue'
|
||
import Register from '../views/auth/Register.vue'
|
||
import Dashboard from '../views/Dashboard.vue'
|
||
import Users from '../views/Users.vue'
|
||
import Restaurants from '../views/Restaurants.vue'
|
||
import AdminSettings from '../views/AdminSettings.vue'
|
||
import Profile from '../views/Profile.vue'
|
||
import NotFound from '../views/NotFound.vue'
|
||
|
||
const routes = [
|
||
{ path: '/login', component: Login, meta: { title: 'Login', requiresAuth: false } },
|
||
{ path: '/register', component: Register, meta: { title: 'Register', requiresAuth: false } },
|
||
{ path: '/setup', component: Setup, meta: { title: 'Setup', requiresAuth: false } },
|
||
{ path: '/', redirect: '/dashboard' },
|
||
{ path: '/dashboard', component: Dashboard, meta: { requiresAuth: true, title: 'Dashboard' } },
|
||
{ path: '/users', component: Users, meta: { requiresAuth: true, requiresAdmin: true, title: 'Users' } },
|
||
{ path: '/restaurants', component: Restaurants, meta: { requiresAuth: true, title: 'Restaurants' } },
|
||
{ path: '/settings', component: AdminSettings, meta: { requiresAuth: true, requiresAdmin: true, title: 'Settings' } },
|
||
{ path: '/profile', component: Profile, meta: { requiresAuth: true, title: 'Profile' } },
|
||
{ path: '/:pathMatch(.*)*', name: 'NotFound', component: NotFound, meta: { title: 'Page Not Found', requiresAuth: false } }
|
||
]
|
||
|
||
const router = createRouter({ history: createWebHistory(), routes })
|
||
|
||
router.beforeEach(async (to, from, next) => {
|
||
const settings = useSettingsStore()
|
||
if (!settings.siteName) await settings.loadSettings()
|
||
|
||
document.title = to.meta.title ? `${to.meta.title} | ${settings.siteName}` : settings.siteName
|
||
|
||
// Проверка необходимости установки (setup)
|
||
try {
|
||
const statusRes = await fetch('/api/status')
|
||
const status = await statusRes.json()
|
||
if (status.needsSetup && to.path !== '/setup') {
|
||
next('/setup')
|
||
return
|
||
}
|
||
} catch (e) { console.error('Failed to check status', e) }
|
||
|
||
const userStore = useUserStore()
|
||
// Если профиль ещё не загружен – загружаем
|
||
if (userStore.role === '') {
|
||
await userStore.fetchProfile()
|
||
}
|
||
|
||
// Если уже залогинены и пытаемся зайти на login/register – редирект на дашборд
|
||
if (userStore.id && (to.path === '/login' || to.path === '/register')) {
|
||
next('/dashboard')
|
||
return
|
||
}
|
||
|
||
// Проверка доступности регистрации
|
||
if (to.path === '/register' && !settings.enableRegistration) {
|
||
next('/login')
|
||
return
|
||
}
|
||
|
||
const requiresAuth = to.matched.some(record => record.meta.requiresAuth)
|
||
const requiresAdmin = to.matched.some(record => record.meta.requiresAdmin)
|
||
|
||
if (requiresAuth && !userStore.id) {
|
||
next('/login')
|
||
} else if (requiresAdmin && userStore.role !== 'admin') {
|
||
next('/dashboard')
|
||
} else {
|
||
next()
|
||
}
|
||
})
|
||
|
||
export default router
|