Files
marketing/src/router/index.js
T

398 lines
15 KiB
JavaScript

import AppLayout from '@/layout/AppLayout.vue';
import AuthService from '@/service/AuthService';
import IdentityService from '@/service/IdentityService';
import { useTargetingStore } from '@/stores/targeting';
import { createRouter, createWebHistory } from 'vue-router';
const router = createRouter({
history: createWebHistory(),
routes: [
{
path: '/',
component: AppLayout,
children: [
{
path: '/',
name: 'dashboard',
component: () => import('@/views/DashboardNew.vue'),
meta: { requiresAuth: true }
},
{
path: '/dashboard-new',
name: 'dashboard-new',
component: () => import('@/views/DashboardNew.vue'),
meta: { requiresAuth: true }
},
{
path: '/uikit/formlayout',
name: 'formlayout',
component: () => import('@/views/uikit/FormLayout.vue'),
meta: { requiresAuth: true }
},
{
path: '/uikit/input',
name: 'input',
component: () => import('@/views/uikit/InputDoc.vue'),
meta: { requiresAuth: true }
},
{
path: '/uikit/button',
name: 'button',
component: () => import('@/views/uikit/ButtonDoc.vue'),
meta: { requiresAuth: true }
},
{
path: '/uikit/table',
name: 'table',
component: () => import('@/views/uikit/TableDoc.vue'),
meta: { requiresAuth: true }
},
{
path: '/uikit/list',
name: 'list',
component: () => import('@/views/uikit/ListDoc.vue'),
meta: { requiresAuth: true }
},
{
path: '/uikit/tree',
name: 'tree',
component: () => import('@/views/uikit/TreeDoc.vue'),
meta: { requiresAuth: true }
},
{
path: '/uikit/panel',
name: 'panel',
component: () => import('@/views/uikit/PanelsDoc.vue'),
meta: { requiresAuth: true }
},
{
path: '/uikit/overlay',
name: 'overlay',
component: () => import('@/views/uikit/OverlayDoc.vue'),
meta: { requiresAuth: true }
},
{
path: '/uikit/media',
name: 'media',
component: () => import('@/views/uikit/MediaDoc.vue'),
meta: { requiresAuth: true }
},
{
path: '/uikit/message',
name: 'message',
component: () => import('@/views/uikit/MessagesDoc.vue'),
meta: { requiresAuth: true }
},
{
path: '/uikit/file',
name: 'file',
component: () => import('@/views/uikit/FileDoc.vue'),
meta: { requiresAuth: true }
},
{
path: '/uikit/menu',
name: 'menu',
component: () => import('@/views/uikit/MenuDoc.vue'),
meta: { requiresAuth: true }
},
{
path: '/uikit/charts',
name: 'charts',
component: () => import('@/views/uikit/ChartDoc.vue'),
meta: { requiresAuth: true }
},
{
path: '/uikit/misc',
name: 'misc',
component: () => import('@/views/uikit/MiscDoc.vue'),
meta: { requiresAuth: true }
},
{
path: '/uikit/timeline',
name: 'timeline',
component: () => import('@/views/uikit/TimelineDoc.vue'),
meta: { requiresAuth: true }
},
{
path: '/pages/empty',
name: 'empty',
component: () => import('@/views/pages/Empty.vue'),
meta: { requiresAuth: true }
},
{
path: '/pages/crud',
name: 'crud',
component: () => import('@/views/pages/Crud.vue'),
meta: { requiresAuth: true }
},
{
path: '/documentation',
name: 'documentation',
component: () => import('@/views/pages/Documentation.vue'),
meta: { requiresAuth: true }
},
{
path: '/news',
name: 'news',
component: () => import('@/views/news/NewsList.vue'),
meta: { requiresAuth: true }
},
{
path: '/news/dashboard',
name: 'news-dashboard',
component: () => import('@/views/news/NewsDashboard.vue'),
meta: { requiresAuth: true }
},
{
path: '/news/:id',
name: 'news-detail',
component: () => import('@/views/news/NewsDetail.vue'),
meta: { requiresAuth: true }
},
{
path: '/reports',
name: 'reports',
component: () => import('@/views/reports/ReportManager.vue'),
meta: { requiresAuth: true }
},
{
path: '/reports/generator',
name: 'reports-generator',
component: () => import('@/views/reports/ReportGenerator.vue'),
meta: { requiresAuth: true }
},
{
path: '/reports/history',
name: 'reports-history',
component: () => import('@/views/reports/ReportHistory.vue'),
meta: { requiresAuth: true }
},
{
path: '/smm/campaigns',
name: 'smm-campaigns',
component: () => import('@/views/smm/CampaignList.vue'),
meta: { requiresAuth: true }
},
{
path: '/smm/channels',
name: 'smm-channels',
component: () => import('@/views/smm/ChannelList.vue'),
meta: { requiresAuth: true }
},
{
path: '/smm/content',
name: 'smm-content',
component: () => import('@/views/smm/ContentList.vue'),
meta: { requiresAuth: true }
},
{
path: '/smm/analytics',
name: 'smm-analytics',
component: () => import('@/views/smm/AnalyticsDashboard.vue'),
meta: { requiresAuth: true }
},
{
path: '/smm',
name: 'smm-dashboard',
component: () => import('@/views/smm/SmmDashboard.vue'),
meta: { requiresAuth: true }
},
{
path: '/targeting',
component: () => import('@/views/targeting/TargetingLayout.vue'),
meta: { requiresAuth: true },
children: [
{ path: '', redirect: '/targeting/input' },
{ path: 'input', name: 'targeting-input', component: () => import('@/views/targeting/TargetingInputView.vue') },
{ path: 'analysis', name: 'targeting-analysis', component: () => import('@/views/targeting/TargetingAnalysisView.vue') },
{ path: 'strategy', name: 'targeting-strategy', component: () => import('@/views/targeting/TargetingStrategyView.vue') },
{ path: 'creative', name: 'targeting-creative', component: () => import('@/views/targeting/TargetingCreativeView.vue') }
]
}
]
},
{
path: '/admin',
component: AppLayout,
children: [
{
path: 'users',
name: 'admin-users',
component: () => import('@/views/pages/AdminUsers.vue'),
meta: { requiresAuth: true, requiresAdmin: true }
},
{
path: 'news',
name: 'admin-news',
component: () => import('@/views/news/NewsAdmin.vue'),
meta: { requiresAuth: true, requiresAdmin: true }
}
]
},
{
path: '/landing',
name: 'landing',
component: () => import('@/views/pages/Landing.vue')
},
{
path: '/marketing-analysis',
name: 'marketing-main',
component: () => import('@/views/pages/marketing/MarketingMain.vue'),
meta: { requiresAuth: true }
},
{
path: '/marketing-analysis/analysis',
name: 'marketing-analysis',
component: () => import('@/views/pages/marketing/MarketingAnalysis.vue'),
meta: { requiresAuth: true }
},
{
path: '/marketing-analysis/dashboard',
name: 'marketing-analysis-dashboard',
redirect: { name: 'marketing-analysis' },
meta: { requiresAuth: true }
},
{
path: '/marketing-analysis/promotion',
name: 'marketing-promotion',
component: () => import('@/views/pages/marketing/MarketingPromotion.vue'),
meta: { requiresAuth: true }
},
{
path: '/marketing-analysis/results',
name: 'marketing-results',
component: () => import('@/views/pages/marketing/MarketingResults.vue'),
meta: { requiresAuth: true }
},
{
path: '/marketing-analysis/analyses',
name: 'marketing-analyses-list',
component: () => import('@/views/pages/marketing/MarketingAnalysesList.vue'),
meta: { requiresAuth: true }
},
{
path: '/marketing-analysis/strategies',
name: 'marketing-strategies-list',
component: () => import('@/views/pages/marketing/MarketingStrategiesList.vue'),
meta: { requiresAuth: true }
},
{
path: '/marketing-analysis/credentials',
name: 'marketing-credentials',
component: () => import('@/views/pages/marketing/MarketingCredentials.vue'),
meta: { requiresAuth: true }
},
{
path: '/marketing-analysis/v3',
name: 'marketing-v3-list',
component: () => import('@/views/pages/marketing/MarketingAnalysisV3List.vue'),
meta: { requiresAuth: true }
},
{
path: '/marketing-analysis/v3/strategies',
name: 'marketing-v3-strategies-list',
component: () => import('@/views/pages/marketing/MarketingStrategyV3List.vue'),
meta: { requiresAuth: true }
},
{
path: '/marketing-analysis/v3/new',
name: 'marketing-v3-wizard',
component: () => import('@/components/marketing/MarketingBriefWizardV3.vue'),
meta: { requiresAuth: true }
},
{
path: '/marketing-analysis/v3/strategy',
name: 'marketing-v3-strategy',
component: () => import('@/views/pages/marketing/MarketingStrategyV3.vue'),
meta: { requiresAuth: true }
},
{
path: '/marketing-analysis/ai-strategy',
name: 'marketing-ai-strategy',
component: () => import('@/views/pages/marketing/AIStrategyGeneratorPage.vue'),
meta: { requiresAuth: true }
},
{
path: '/marketing-analysis/v3/:id',
name: 'marketing-v3-analysis',
component: () => import('@/views/pages/marketing/MarketingAnalysisV3.vue'),
meta: { requiresAuth: true }
},
{
path: '/marketing-analysis/v3/targetologist/dashboard',
name: 'marketing-targetologist-dashboard',
component: () => import('@/views/pages/marketing/targetologist/TargetologistDashboard.vue'),
meta: { requiresAuth: true }
},
{
path: '/marketing-analysis/v3/targetologist/wizard',
name: 'marketing-targetologist-wizard',
component: () => import('@/views/pages/marketing/targetologist/CampaignWizard.vue'),
meta: { requiresAuth: true }
},
{
path: '/marketing-analysis/v3/targetologist/campaign/:id',
name: 'marketing-targetologist-campaign',
component: () => import('@/views/pages/marketing/targetologist/CampaignInsightsDetail.vue'),
meta: { requiresAuth: true }
},
{
path: '/pages/notfound',
name: 'notfound',
component: () => import('@/views/pages/NotFound.vue')
},
{
path: '/auth/login',
name: 'login',
component: () => import('@/views/pages/auth/Login.vue')
},
{
path: '/auth/access',
name: 'accessDenied',
component: () => import('@/views/pages/auth/Access.vue')
},
{
path: '/auth/error',
name: 'error',
component: () => import('@/views/pages/auth/Error.vue')
}
]
});
router.beforeEach(async (to) => {
const isAuthenticated = !!AuthService.getAccessToken();
if (to.meta?.requiresAuth && !isAuthenticated) {
return { name: 'login', query: { redirect: to.fullPath } };
}
if (to.name === 'login' && isAuthenticated) {
return { path: '/' };
}
if (to.meta?.requiresAdmin) {
try {
const me = await IdentityService.getCurrentUser();
const roles = Array.isArray(me?.roles) ? me.roles : [];
if (!roles.includes('ROLE_ADMIN')) {
return { name: 'accessDenied' };
}
} catch (_) {
return { name: 'login', query: { redirect: to.fullPath } };
}
}
const targetingStore = useTargetingStore();
if (to.name === 'targeting-analysis' && !targetingStore.analysis.value) {
return { name: 'targeting-input' };
}
if (to.name === 'targeting-strategy' && !targetingStore.strategy.value) {
return { name: 'targeting-input' };
}
if (to.name === 'targeting-creative' && !targetingStore.creative.value && !to.query.strategyId) {
return { name: 'targeting-input' };
}
});
export default router;