accountManagementAccess.ts 2.88 KB
import {
  ALL_ROLE_ACCESS_PERMISSION_CODES,
  hasAllRoleAccessPermissions,
} from "../types/role";

export const ROLE_ACCESS_MANAGE_PEOPLE = "manage_people";

export type AccountManagementAccessParams = {
  roleCodes?: string[] | null;
  permissionCodes?: string[] | null;
  userName?: string | null;
  /** `/auth-session/my-menus` 人类可读角色名,如 Company Admin */
  roleDisplay?: string | null;
  /** 当前用户角色勾选的访问权限(manage_people 等) */
  roleAccessPermissionCodes?: string[] | null;
};

function normalizeRoleKey(token: string): string {
  return token.trim().toLowerCase().replace(/[\s_-]+/g, "");
}

function roleTokenIsCompanyAdmin(token: string): boolean {
  const key = normalizeRoleKey(token);
  if (!key) return false;
  if (key === "companyadmin" || key.includes("companyadmin")) return true;
  return key.includes("partner");
}

/**
 * Company Admin(RoleCode=CompanyAdmin)或历史 Partner Admin。
 */
export function isCompanyAdminRole(params: AccountManagementAccessParams): boolean {
  const display = (params.roleDisplay ?? "").trim();
  if (display && roleTokenIsCompanyAdmin(display)) return true;

  for (const r of params.roleCodes ?? []) {
    if (roleTokenIsCompanyAdmin(String(r ?? ""))) return true;
  }
  return false;
}

export function hasManagePeopleRoleAccess(params: AccountManagementAccessParams): boolean {
  const codes = params.roleAccessPermissionCodes ?? [];
  if (hasAllRoleAccessPermissions(codes)) return true;
  return codes.some((c) => c.trim() === ROLE_ACCESS_MANAGE_PEOPLE);
}

/**
 * Account Management:公司 / 角色 等结构类变更,仅平台管理员可操作。
 */
export function canMutateAccountManagementStructure(params: AccountManagementAccessParams): boolean {
  const un = (params.userName ?? "").trim().toLowerCase();
  if (un === "admin") return true;

  for (const p of params.permissionCodes ?? []) {
    const t = (p ?? "").trim();
    if (t === "*:*:*" || t === "*") return true;
  }

  const adminRoles = new Set(["admin", "ccadmin"]);
  for (const r of params.roleCodes ?? []) {
    const t = (r ?? "").trim().toLowerCase();
    if (adminRoles.has(t)) return true;
  }
  return false;
}

/**
 * Region / Location 新增、编辑、删除:平台管理员、Company Admin 角色,或具备 Manage People 访问权限。
 */
export function canMutateRegionAndLocationStructure(params: AccountManagementAccessParams): boolean {
  return (
    canMutateAccountManagementStructure(params) ||
    isCompanyAdminRole(params) ||
    hasManagePeopleRoleAccess(params)
  );
}

/** Support 页全局客服电话/邮箱:仅平台管理员可编辑保存 */
export function canEditSupportContactSettings(params: AccountManagementAccessParams): boolean {
  return canMutateAccountManagementStructure(params);
}

/** 与后端 RoleAccessPermissionCodes.All 一致,供测试或其它模块引用 */
export { ALL_ROLE_ACCESS_PERMISSION_CODES };