From 4be52e05c71c5221bfa9e157e1d3b70f39d2c022 Mon Sep 17 00:00:00 2001 From: Rogee Date: Sat, 8 Aug 2026 20:28:18 +0800 Subject: [PATCH] =?UTF-8?q?fix:=20=E6=94=B6=E7=B4=A7=E5=AE=A2=E6=9C=8D?= =?UTF-8?q?=E5=8A=9F=E8=83=BD=E8=AE=BF=E9=97=AE=E6=9D=83=E9=99=90?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../dashboard/captain/captain.routes.js | 8 +++--- .../dashboard/captain/captain.routes.spec.js | 13 ++++++++++ .../dashboard/helpcenter/helpcenter.routes.js | 21 ++++++++------- .../helpcenter/helpcenter.routes.spec.js | 26 ++++++++++++++++--- 4 files changed, 51 insertions(+), 17 deletions(-) create mode 100644 frontend/app/javascript/dashboard/routes/dashboard/captain/captain.routes.spec.js diff --git a/frontend/app/javascript/dashboard/routes/dashboard/captain/captain.routes.js b/frontend/app/javascript/dashboard/routes/dashboard/captain/captain.routes.js index 1ab4fa50..764bb776 100644 --- a/frontend/app/javascript/dashboard/routes/dashboard/captain/captain.routes.js +++ b/frontend/app/javascript/dashboard/routes/dashboard/captain/captain.routes.js @@ -18,19 +18,19 @@ import ResponsesPendingIndex from './responses/Pending.vue'; import CustomToolsIndex from './tools/Index.vue'; const meta = { - permissions: ['administrator', 'agent'], + permissions: ['administrator'], featureFlag: FEATURE_FLAGS.CAPTAIN, installationTypes: [INSTALLATION_TYPES.CLOUD, INSTALLATION_TYPES.ENTERPRISE], }; const metaCustomTools = { - permissions: ['administrator', 'agent'], + permissions: ['administrator'], featureFlag: FEATURE_FLAGS.CAPTAIN_CUSTOM_TOOLS, installationTypes: [INSTALLATION_TYPES.CLOUD, INSTALLATION_TYPES.ENTERPRISE], }; const metaV2 = { - permissions: ['administrator', 'agent'], + permissions: ['administrator'], featureFlag: FEATURE_FLAGS.CAPTAIN_V2, installationTypes: [INSTALLATION_TYPES.CLOUD, INSTALLATION_TYPES.ENTERPRISE], }; @@ -106,7 +106,7 @@ const assistantRoutes = [ component: AssistantEmptyStateIndex, name: 'captain_assistants_create_index', meta: { - permissions: ['administrator', 'agent'], + permissions: ['administrator'], installationTypes: [ INSTALLATION_TYPES.CLOUD, INSTALLATION_TYPES.ENTERPRISE, diff --git a/frontend/app/javascript/dashboard/routes/dashboard/captain/captain.routes.spec.js b/frontend/app/javascript/dashboard/routes/dashboard/captain/captain.routes.spec.js new file mode 100644 index 00000000..1843f9f0 --- /dev/null +++ b/frontend/app/javascript/dashboard/routes/dashboard/captain/captain.routes.spec.js @@ -0,0 +1,13 @@ +import { readFileSync } from 'node:fs'; + +const source = readFileSync( + 'app/javascript/dashboard/routes/dashboard/captain/captain.routes.js', + 'utf8' +); + +describe('Captain routes', () => { + it('restricts the whole Captain module to administrators', () => { + expect(source).not.toContain("permissions: ['administrator', 'agent']"); + expect(source.match(/permissions: \['administrator'\]/g)?.length).toBe(4); + }); +}); diff --git a/frontend/app/javascript/dashboard/routes/dashboard/helpcenter/helpcenter.routes.js b/frontend/app/javascript/dashboard/routes/dashboard/helpcenter/helpcenter.routes.js index c4a82a89..5710e91d 100644 --- a/frontend/app/javascript/dashboard/routes/dashboard/helpcenter/helpcenter.routes.js +++ b/frontend/app/javascript/dashboard/routes/dashboard/helpcenter/helpcenter.routes.js @@ -26,6 +26,10 @@ const meta = { featureFlag: FEATURE_FLAGS.HELP_CENTER, permissions: ['administrator', 'agent', 'knowledge_base_manage'], }; +const adminMeta = { + featureFlag: FEATURE_FLAGS.HELP_CENTER, + permissions: ['administrator', 'knowledge_base_manage'], +}; const portalRoutes = [ { path: getPortalRoute(':portalSlug/:locale/:categorySlug?/articles/:tab?'), @@ -51,7 +55,7 @@ const portalRoutes = [ { path: getPortalRoute(':portalSlug/:locale/categories'), name: 'portals_categories_index', - meta, + meta: adminMeta, component: PortalsCategoriesIndexPage, }, { @@ -59,7 +63,7 @@ const portalRoutes = [ ':portalSlug/:locale/categories/:categorySlug/articles' ), name: 'portals_categories_articles_index', - meta, + meta: adminMeta, component: PortalsArticlesIndexPage, }, { @@ -67,7 +71,7 @@ const portalRoutes = [ ':portalSlug/:locale/categories/:categorySlug/articles/new' ), name: 'portals_categories_articles_new', - meta, + meta: adminMeta, component: PortalsArticlesNewPage, }, { @@ -75,28 +79,25 @@ const portalRoutes = [ ':portalSlug/:locale/categories/:categorySlug/articles/:articleSlug' ), name: 'portals_categories_articles_edit', - meta, + meta: adminMeta, component: PortalsArticlesEditPage, }, { path: getPortalRoute(':portalSlug/locales'), name: 'portals_locales_index', - meta, + meta: adminMeta, component: PortalsLocalesIndexPage, }, { path: getPortalRoute(':portalSlug/settings'), name: 'portals_settings_index', - meta, + meta: adminMeta, component: PortalsSettingsIndexPage, }, { path: getPortalRoute('new'), name: 'portals_new', - meta: { - featureFlag: FEATURE_FLAGS.HELP_CENTER, - permissions: ['administrator', 'knowledge_base_manage'], - }, + meta: adminMeta, component: PortalsNew, }, { diff --git a/frontend/app/javascript/dashboard/routes/dashboard/helpcenter/helpcenter.routes.spec.js b/frontend/app/javascript/dashboard/routes/dashboard/helpcenter/helpcenter.routes.spec.js index fbb5a913..e211b966 100644 --- a/frontend/app/javascript/dashboard/routes/dashboard/helpcenter/helpcenter.routes.spec.js +++ b/frontend/app/javascript/dashboard/routes/dashboard/helpcenter/helpcenter.routes.spec.js @@ -1,4 +1,5 @@ import helpcenterRoutes from './helpcenter.routes'; +import { routeIsAccessibleFor } from 'dashboard/helper/routeHelpers'; const findRoute = name => { const [rootRoute] = helpcenterRoutes.routes; @@ -11,9 +12,28 @@ describe('Help center routes', () => { }); it('keeps article routes accessible to agents', () => { - expect(findRoute('portals_articles_index').meta.permissions).toContain( - 'agent' - ); + [ + 'portals_articles_index', + 'portals_articles_new', + 'portals_articles_edit', + ].forEach(routeName => { + expect(findRoute(routeName).meta.permissions).toContain('agent'); + }); + }); + + it('restricts category, locale, and portal settings routes from agents', () => { + [ + 'portals_categories_index', + 'portals_categories_articles_index', + 'portals_categories_articles_new', + 'portals_categories_articles_edit', + 'portals_locales_index', + 'portals_settings_index', + ].forEach(routeName => { + const route = findRoute(routeName); + expect(routeIsAccessibleFor(route, ['agent'])).toBe(false); + expect(routeIsAccessibleFor(route, ['administrator'])).toBe(true); + }); }); it('keeps portal creation restricted to administrators or custom roles', () => {