From fbfbcdeb2cfdd6054ac7328fddc8f27920651127 Mon Sep 17 00:00:00 2001 From: ChengLei Shao Date: Thu, 4 Jul 2024 17:32:52 +0800 Subject: [PATCH] chore: add import export permission to admin & member user (#4809) * chore: add import export permission to admin & member user * fix: test --- .../@nocobase/plugin-acl/src/server/server.ts | 2 +- .../src/server/__tests__/acl.test.ts | 22 ++++++++++++++ .../plugin-action-export/src/server/index.ts | 29 ++++++++++++++++++- .../src/server/__tests__/acl.test.ts | 22 ++++++++++++++ .../plugin-action-import/src/server/index.ts | 26 +++++++++++++++++ 5 files changed, 99 insertions(+), 2 deletions(-) create mode 100644 packages/plugins/@nocobase/plugin-action-export/src/server/__tests__/acl.test.ts create mode 100644 packages/plugins/@nocobase/plugin-action-import/src/server/__tests__/acl.test.ts diff --git a/packages/plugins/@nocobase/plugin-acl/src/server/server.ts b/packages/plugins/@nocobase/plugin-acl/src/server/server.ts index 8d823bc152f..5fe643f73af 100644 --- a/packages/plugins/@nocobase/plugin-acl/src/server/server.ts +++ b/packages/plugins/@nocobase/plugin-acl/src/server/server.ts @@ -381,7 +381,7 @@ export class PluginACLServer extends Plugin { name: 'member', title: '{{t("Member")}}', allowNewMenu: true, - strategy: { actions: ['view', 'update:own', 'destroy:own', 'create', 'importXlsx', 'export'] }, + strategy: { actions: ['view', 'update:own', 'destroy:own', 'create'] }, default: true, snippets: ['!ui.*', '!pm', '!pm.*'], }, diff --git a/packages/plugins/@nocobase/plugin-action-export/src/server/__tests__/acl.test.ts b/packages/plugins/@nocobase/plugin-action-export/src/server/__tests__/acl.test.ts new file mode 100644 index 00000000000..b343ae40c76 --- /dev/null +++ b/packages/plugins/@nocobase/plugin-action-export/src/server/__tests__/acl.test.ts @@ -0,0 +1,22 @@ +import { createMockServer, MockServer } from '@nocobase/test'; + +describe('acl', () => { + let app: MockServer; + beforeEach(async () => { + app = await createMockServer({ + plugins: ['nocobase'], + }); + }); + + afterEach(async () => { + await app.destroy(); + }); + + it('should add export action to default role strategy', async () => { + const roles = ['admin', 'member']; + for (const roleName of roles) { + const role = app.acl.getRole(roleName); + expect(role.strategy['actions']).toContain('export'); + } + }); +}); diff --git a/packages/plugins/@nocobase/plugin-action-export/src/server/index.ts b/packages/plugins/@nocobase/plugin-action-export/src/server/index.ts index 3e6cb8c10e7..ed523e098fd 100644 --- a/packages/plugins/@nocobase/plugin-action-export/src/server/index.ts +++ b/packages/plugins/@nocobase/plugin-action-export/src/server/index.ts @@ -11,7 +11,34 @@ import { Plugin } from '@nocobase/server'; import { exportXlsx } from './actions'; export class PluginActionExportServer extends Plugin { - beforeLoad() {} + beforeLoad() { + this.app.on('afterInstall', async () => { + if (!this.app.db.getRepository('roles')) { + return; + } + + const roleNames = ['admin', 'member']; + const roles = await this.app.db.getRepository('roles').find({ + filter: { + name: roleNames, + }, + }); + + for (const role of roles) { + await this.app.db.getRepository('roles').update({ + filter: { + name: role.name, + }, + values: { + strategy: { + ...role.strategy, + actions: [...role.strategy.actions, 'export'], + }, + }, + }); + } + }); + } async load() { this.app.dataSourceManager.afterAddDataSource((dataSource) => { diff --git a/packages/plugins/@nocobase/plugin-action-import/src/server/__tests__/acl.test.ts b/packages/plugins/@nocobase/plugin-action-import/src/server/__tests__/acl.test.ts new file mode 100644 index 00000000000..2111d8f3bdf --- /dev/null +++ b/packages/plugins/@nocobase/plugin-action-import/src/server/__tests__/acl.test.ts @@ -0,0 +1,22 @@ +import { createMockServer, MockServer } from '@nocobase/test'; + +describe('acl', () => { + let app: MockServer; + beforeEach(async () => { + app = await createMockServer({ + plugins: ['nocobase'], + }); + }); + + afterEach(async () => { + await app.destroy(); + }); + + it('should add importXlsx action to default role strategy', async () => { + const roles = ['admin', 'member']; + for (const roleName of roles) { + const role = app.acl.getRole(roleName); + expect(role.strategy['actions']).toContain('importXlsx'); + } + }); +}); diff --git a/packages/plugins/@nocobase/plugin-action-import/src/server/index.ts b/packages/plugins/@nocobase/plugin-action-import/src/server/index.ts index 017a04eea5e..27425c42560 100644 --- a/packages/plugins/@nocobase/plugin-action-import/src/server/index.ts +++ b/packages/plugins/@nocobase/plugin-action-import/src/server/index.ts @@ -17,6 +17,32 @@ export class PluginActionImportServer extends Plugin { beforeLoad() { this.app.i18n.addResources('zh-CN', namespace, zhCN); this.app.i18n.addResources('en-US', namespace, enUS); + + this.app.on('afterInstall', async () => { + if (!this.app.db.getRepository('roles')) { + return; + } + const roleNames = ['admin', 'member']; + const roles = await this.app.db.getRepository('roles').find({ + filter: { + name: roleNames, + }, + }); + + for (const role of roles) { + await this.app.db.getRepository('roles').update({ + filter: { + name: role.name, + }, + values: { + strategy: { + ...role.strategy, + actions: [...role.strategy.actions, 'importXlsx'], + }, + }, + }); + } + }); } async load() {