81 lines
2.5 KiB
TypeScript
81 lines
2.5 KiB
TypeScript
import type { Role } from "@/store/permissionSettingsStore";
|
|
import type { ManagedUser } from "@/types/ManagedUser";
|
|
|
|
type ManagedUserRole = NonNullable<ManagedUser["roleList"]>[number];
|
|
|
|
function buildRoleCode(role: Role): string {
|
|
return role.moduleCode && !role.code.includes(":") ? `${role.moduleCode}:${role.code}` : role.code;
|
|
}
|
|
|
|
function findRole(role: ManagedUserRole, roleList: Role[]): Role | undefined {
|
|
if (typeof role === "string") {
|
|
return roleList.find(roleItem => buildRoleCode(roleItem) === role);
|
|
}
|
|
return roleList.find(roleItem => roleItem.id === role.id || buildRoleCode(roleItem) === buildRoleCode(role as Role));
|
|
}
|
|
|
|
export function getManagedUserRoleList(user: ManagedUser): ManagedUserRole[] {
|
|
if (user.user?.roleEntityList?.length) {
|
|
return user.user.roleEntityList;
|
|
}
|
|
return user.roleList || user.user?.roleList || [];
|
|
}
|
|
|
|
export function getRoleDisplayName(role: ManagedUserRole | undefined, roleList: Role[]): string {
|
|
if (!role) {
|
|
return "未配置角色";
|
|
}
|
|
|
|
const fullRole = findRole(role, roleList);
|
|
if (fullRole) {
|
|
return fullRole.name || fullRole.code || "未配置角色";
|
|
}
|
|
|
|
return typeof role === "string" ? role : role.name || role.code || "未配置角色";
|
|
}
|
|
|
|
export function buildEffectiveRoleCodeSet(user: ManagedUser, roleList: Role[] = []): Set<string> {
|
|
const roleCodeSet = new Set<string>();
|
|
const visitedRoleIds = new Set<string>();
|
|
|
|
function addRole(role: ManagedUserRole | Role): void {
|
|
const roleId = typeof role === "string"
|
|
? roleList.find(item => buildRoleCode(item) === role || item.code === role)?.id
|
|
: role.id || roleList.find(item => buildRoleCode(item) === buildRoleCode(role as Role))?.id;
|
|
if (roleId && visitedRoleIds.has(roleId)) {
|
|
return;
|
|
}
|
|
if (roleId) {
|
|
visitedRoleIds.add(roleId);
|
|
}
|
|
|
|
if (typeof role === "string") {
|
|
roleCodeSet.add(role);
|
|
const separatorIndex = role.indexOf(":");
|
|
if (-1 < separatorIndex) {
|
|
roleCodeSet.add(role.slice(separatorIndex + 1));
|
|
}
|
|
} else {
|
|
roleCodeSet.add(role.code);
|
|
roleCodeSet.add(buildRoleCode(role as Role));
|
|
}
|
|
|
|
const fullRole = roleId ? roleList.find(item => item.id === roleId) : undefined;
|
|
for (const childRoleId of fullRole?.childRoleIdList || []) {
|
|
const childRole = roleList.find(item => item.id === childRoleId);
|
|
if (childRole) {
|
|
addRole(childRole);
|
|
}
|
|
}
|
|
}
|
|
|
|
for (const role of getManagedUserRoleList(user)) {
|
|
addRole(role);
|
|
}
|
|
for (const roleCode of user.user?.roleList || []) {
|
|
addRole(roleCode);
|
|
}
|
|
return roleCodeSet;
|
|
}
|
|
|