From ea360c74d60c7fdbb9e544519ae4f4210954bd79 Mon Sep 17 00:00:00 2001 From: Script Generator Date: Mon, 29 Jun 2026 17:22:12 +0800 Subject: [PATCH] =?UTF-8?q?fix(=E5=B0=8F=E5=AE=9D=E9=A2=84=E8=AD=A6):=20?= =?UTF-8?q?=E9=99=90=E5=AE=9A=E8=A7=92=E8=89=B2=E6=9D=83=E9=99=90=E8=BF=81?= =?UTF-8?q?=E7=A7=BB=E8=8C=83=E5=9B=B4?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../web/lib/role-permission-migration.test.ts | 20 +++++++++++++++++++ apps/web/lib/role-permission-migration.ts | 14 +++++++++---- 2 files changed, 30 insertions(+), 4 deletions(-) diff --git a/apps/web/lib/role-permission-migration.test.ts b/apps/web/lib/role-permission-migration.test.ts index 06e6e3f..595c99d 100644 --- a/apps/web/lib/role-permission-migration.test.ts +++ b/apps/web/lib/role-permission-migration.test.ts @@ -36,3 +36,23 @@ test('mergePresetRolePermissions keeps custom role permissions unchanged', () => assert.equal(result.changed, false); assert.deepEqual(result.roles[0].permissions, ['version:view']); }); + +test('mergePresetRolePermissions does not restore unrelated default permissions removed from preset roles', () => { + const roles: RoleItem[] = [ + { + id: 'role-pm', + name: '产品经理', + createdAt: '2024-01-01', + permissions: ['product:view'], + }, + ]; + + const result = mergePresetRolePermissions(roles); + + assert.equal(result.changed, true); + assert.deepEqual(result.roles[0].permissions, [ + 'product:view', + 'xiaobao.warning:view', + 'xiaobao.warning:manage', + ]); +}); diff --git a/apps/web/lib/role-permission-migration.ts b/apps/web/lib/role-permission-migration.ts index c769454..f69c240 100644 --- a/apps/web/lib/role-permission-migration.ts +++ b/apps/web/lib/role-permission-migration.ts @@ -1,12 +1,18 @@ import type { RoleItem } from './members'; -import { DEFAULT_ROLE_PERMISSIONS } from './permissions'; + +const XIAOBAO_WARNING_ROLE_PERMISSIONS: Record = { + 'role-pm': ['xiaobao.warning:view', 'xiaobao.warning:manage'], + 'role-dev': ['xiaobao.warning:view'], + 'role-test': ['xiaobao.warning:view'], + 'role-design': ['xiaobao.warning:view'], +}; export function mergePresetRolePermissions(roles: RoleItem[]): { roles: RoleItem[]; changed: boolean } { let changed = false; const next = roles.map((role) => { - const defaults = DEFAULT_ROLE_PERMISSIONS[role.id]; - if (!defaults || role.permissions.includes('*')) return role; - const merged = Array.from(new Set([...role.permissions, ...defaults])); + const xiaobaoPermissions = XIAOBAO_WARNING_ROLE_PERMISSIONS[role.id]; + if (!xiaobaoPermissions || role.permissions.includes('*')) return role; + const merged = Array.from(new Set([...role.permissions, ...xiaobaoPermissions])); if (merged.length === role.permissions.length) return role; changed = true; return { ...role, permissions: merged };