fix(小宝预警): 限定角色权限迁移范围

This commit is contained in:
Script Generator
2026-06-29 17:22:12 +08:00
parent 46a002f817
commit ea360c74d6
2 changed files with 30 additions and 4 deletions

View File

@@ -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',
]);
});

View File

@@ -1,12 +1,18 @@
import type { RoleItem } from './members';
import { DEFAULT_ROLE_PERMISSIONS } from './permissions';
const XIAOBAO_WARNING_ROLE_PERMISSIONS: Record<string, string[]> = {
'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 };