{"version":3,"file":"role-hierarchy.mjs","sources":["../../../../src/lib/auth/rbac/role-hierarchy.ts"],"sourcesContent":["/**\n * Role Hierarchy\n *\n * Manages hierarchical role structures with inheritance support.\n * Allows roles to inherit permissions from parent roles.\n *\n * @module auth/rbac/role-hierarchy\n */\n\nimport type { RoleDefinition, RoleHierarchy, Permission } from './types';\n\n// =============================================================================\n// Role Hierarchy Manager\n// =============================================================================\n\n/**\n * Role Hierarchy Manager for managing role inheritance.\n *\n * Provides utilities for building and querying hierarchical role structures\n * where roles can inherit permissions from parent roles.\n *\n * @example\n * ```typescript\n * const hierarchy = new RoleHierarchyManager();\n *\n * // Define roles\n * hierarchy.addRole({ id: 'admin', name: 'Admin', permissions: ['*'], priority: 100 });\n * hierarchy.addRole({\n *   id: 'manager',\n *   name: 'Manager',\n *   permissions: ['reports:*', 'team:*'],\n *   inherits: ['user'],\n *   priority: 50,\n * });\n * hierarchy.addRole({\n *   id: 'user',\n *   name: 'User',\n *   permissions: ['profile:*', 'documents:read'],\n *   priority: 10,\n * });\n *\n * // Get all permissions for a role (including inherited)\n * const managerPerms = hierarchy.getEffectivePermissions('manager');\n * // ['reports:*', 'team:*', 'profile:*', 'documents:read']\n *\n * // Check if role inherits from another\n * hierarchy.inheritsFrom('manager', 'user'); // true\n * ```\n */\nexport class RoleHierarchyManager {\n  private roles: Map<string, RoleDefinition>;\n  private hierarchyMap: Map<string, RoleHierarchy>;\n  private permissionCache: Map<string, Set<Permission>>;\n  private ancestorCache: Map<string, Set<string>>;\n\n  constructor() {\n    this.roles = new Map();\n    this.hierarchyMap = new Map();\n    this.permissionCache = new Map();\n    this.ancestorCache = new Map();\n  }\n\n  // ===========================================================================\n  // Role Management\n  // ===========================================================================\n\n  /**\n   * Add a role to the hierarchy.\n   *\n   * @param role - Role definition to add\n   */\n  addRole(role: RoleDefinition): void {\n    this.roles.set(role.id, role);\n    this.rebuildHierarchy();\n    this.clearCaches();\n  }\n\n  /**\n   * Add multiple roles at once.\n   *\n   * @param roles - Role definitions to add\n   */\n  addRoles(roles: RoleDefinition[]): void {\n    for (const role of roles) {\n      this.roles.set(role.id, role);\n    }\n    this.rebuildHierarchy();\n    this.clearCaches();\n  }\n\n  /**\n   * Remove a role from the hierarchy.\n   *\n   * @param roleId - Role ID to remove\n   */\n  removeRole(roleId: string): void {\n    this.roles.delete(roleId);\n    this.rebuildHierarchy();\n    this.clearCaches();\n  }\n\n  /**\n   * Update a role definition.\n   *\n   * @param roleId - Role ID to update\n   * @param updates - Partial updates to apply\n   */\n  updateRole(roleId: string, updates: Partial<RoleDefinition>): void {\n    const existing = this.roles.get(roleId);\n    if (existing) {\n      this.roles.set(roleId, { ...existing, ...updates });\n      this.rebuildHierarchy();\n      this.clearCaches();\n    }\n  }\n\n  /**\n   * Get a role definition by ID.\n   *\n   * @param roleId - Role ID\n   * @returns Role definition or undefined\n   */\n  getRole(roleId: string): RoleDefinition | undefined {\n    return this.roles.get(roleId);\n  }\n\n  /**\n   * Get all role definitions.\n   *\n   * @returns Array of all role definitions\n   */\n  getAllRoles(): RoleDefinition[] {\n    return Array.from(this.roles.values());\n  }\n\n  /**\n   * Check if a role exists.\n   *\n   * @param roleId - Role ID to check\n   * @returns Whether role exists\n   */\n  hasRole(roleId: string): boolean {\n    return this.roles.has(roleId);\n  }\n\n  // ===========================================================================\n  // Hierarchy Queries\n  // ===========================================================================\n\n  /**\n   * Get hierarchy information for a role.\n   *\n   * @param roleId - Role ID\n   * @returns Role hierarchy or undefined\n   */\n  getHierarchy(roleId: string): RoleHierarchy | undefined {\n    return this.hierarchyMap.get(roleId);\n  }\n\n  /**\n   * Check if a role inherits from another role.\n   *\n   * @param roleId - Role to check\n   * @param ancestorId - Potential ancestor role\n   * @returns Whether roleId inherits from ancestorId\n   */\n  inheritsFrom(roleId: string, ancestorId: string): boolean {\n    const ancestors = this.getAncestors(roleId);\n    return ancestors.has(ancestorId);\n  }\n\n  /**\n   * Get all ancestor roles (direct and indirect parents).\n   *\n   * @param roleId - Role ID\n   * @returns Set of ancestor role IDs\n   */\n  getAncestors(roleId: string): Set<string> {\n    // Check cache\n    if (this.ancestorCache.has(roleId)) {\n      const cachedAncestors = this.ancestorCache.get(roleId);\n      if (cachedAncestors != null) {\n        return cachedAncestors;\n      }\n    }\n\n    const ancestors = new Set<string>();\n    this.collectAncestors(roleId, ancestors, new Set());\n\n    this.ancestorCache.set(roleId, ancestors);\n    return ancestors;\n  }\n\n  /**\n   * Get direct parent roles.\n   *\n   * @param roleId - Role ID\n   * @returns Array of parent role IDs\n   */\n  getParents(roleId: string): string[] {\n    const hierarchy = this.hierarchyMap.get(roleId);\n    return hierarchy?.parents ?? [];\n  }\n\n  /**\n   * Get direct child roles.\n   *\n   * @param roleId - Role ID\n   * @returns Array of child role IDs\n   */\n  getChildren(roleId: string): string[] {\n    const hierarchy = this.hierarchyMap.get(roleId);\n    return hierarchy?.children ?? [];\n  }\n\n  /**\n   * Get all descendant roles (direct and indirect children).\n   *\n   * @param roleId - Role ID\n   * @returns Set of descendant role IDs\n   */\n  getDescendants(roleId: string): Set<string> {\n    const descendants = new Set<string>();\n    this.collectDescendants(roleId, descendants, new Set());\n    return descendants;\n  }\n\n  /**\n   * Get the hierarchy level of a role (0 = root).\n   *\n   * @param roleId - Role ID\n   * @returns Hierarchy level\n   */\n  getLevel(roleId: string): number {\n    const hierarchy = this.hierarchyMap.get(roleId);\n    return hierarchy?.level ?? 0;\n  }\n\n  /**\n   * Get root roles (roles with no parents).\n   *\n   * @returns Array of root role IDs\n   */\n  getRootRoles(): string[] {\n    return Array.from(this.hierarchyMap.values())\n      .filter((h) => h.parents.length === 0)\n      .map((h) => h.roleId);\n  }\n\n  /**\n   * Get leaf roles (roles with no children).\n   *\n   * @returns Array of leaf role IDs\n   */\n  getLeafRoles(): string[] {\n    return Array.from(this.hierarchyMap.values())\n      .filter((h) => h.children.length === 0)\n      .map((h) => h.roleId);\n  }\n\n  // ===========================================================================\n  // Permission Resolution\n  // ===========================================================================\n\n  /**\n   * Get effective permissions for a role including inherited permissions.\n   *\n   * @param roleId - Role ID\n   * @returns Set of all effective permissions\n   */\n  getEffectivePermissions(roleId: string): Set<Permission> {\n    // Check cache\n    if (this.permissionCache.has(roleId)) {\n      const cachedPermissions = this.permissionCache.get(roleId);\n      if (cachedPermissions != null) {\n        return cachedPermissions;\n      }\n    }\n\n    const permissions = new Set<Permission>();\n    this.collectPermissions(roleId, permissions, new Set());\n\n    this.permissionCache.set(roleId, permissions);\n    return permissions;\n  }\n\n  /**\n   * Get effective permissions for multiple roles.\n   *\n   * @param roleIds - Array of role IDs\n   * @returns Combined set of permissions\n   */\n  getEffectivePermissionsForRoles(roleIds: string[]): Set<Permission> {\n    const permissions = new Set<Permission>();\n\n    for (const roleId of roleIds) {\n      const rolePerms = this.getEffectivePermissions(roleId);\n      rolePerms.forEach((p) => permissions.add(p));\n    }\n\n    return permissions;\n  }\n\n  /**\n   * Check if a role (including inherited) has a permission.\n   *\n   * @param roleId - Role ID\n   * @param permission - Permission to check\n   * @returns Whether role has the permission\n   */\n  hasPermission(roleId: string, permission: Permission): boolean {\n    const permissions = this.getEffectivePermissions(roleId);\n\n    if (permissions.has(permission)) {\n      return true;\n    }\n\n    // Check wildcard patterns\n    if (permissions.has('*')) {\n      return true;\n    }\n\n    const parts = permission.split(':');\n    if (parts.length >= 2) {\n      // Check resource:* pattern\n      if (permissions.has(`${parts[0]}:*`)) {\n        return true;\n      }\n      // Check *:action pattern\n      if (permissions.has(`*:${parts[1]}`)) {\n        return true;\n      }\n    }\n\n    return false;\n  }\n\n  // ===========================================================================\n  // Comparison Operations\n  // ===========================================================================\n\n  /**\n   * Compare two roles by priority.\n   *\n   * @param roleA - First role ID\n   * @param roleB - Second role ID\n   * @returns Positive if A > B, negative if A < B, 0 if equal\n   */\n  compareRoles(roleA: string, roleB: string): number {\n    const a = this.roles.get(roleA);\n    const b = this.roles.get(roleB);\n\n    if (!a || !b) return 0;\n\n    return (a.priority ?? 0) - (b.priority ?? 0);\n  }\n\n  /**\n   * Get the highest priority role from a list.\n   *\n   * @param roleIds - Array of role IDs\n   * @returns Highest priority role ID or undefined\n   */\n  getHighestPriorityRole(roleIds: string[]): string | undefined {\n    let highest: string | undefined;\n    let highestPriority = -Infinity;\n\n    for (const roleId of roleIds) {\n      const role = this.roles.get(roleId);\n      if (role && role.priority > highestPriority) {\n        highestPriority = role.priority;\n        highest = roleId;\n      }\n    }\n\n    return highest;\n  }\n\n  /**\n   * Sort roles by priority (highest first).\n   *\n   * @param roleIds - Array of role IDs\n   * @returns Sorted array of role IDs\n   */\n  sortByPriority(roleIds: string[]): string[] {\n    return [...roleIds].sort((a, b) => this.compareRoles(b, a));\n  }\n\n  // ===========================================================================\n  // Validation\n  // ===========================================================================\n\n  /**\n   * Check for circular inheritance.\n   *\n   * @returns Array of cycle descriptions if found\n   */\n  detectCycles(): string[] {\n    const cycles: string[] = [];\n\n    for (const roleId of this.roles.keys()) {\n      const visited = new Set<string>();\n      const path: string[] = [];\n\n      if (this.hasCycle(roleId, visited, path)) {\n        cycles.push(`Cycle detected: ${path.join(' -> ')}`);\n      }\n    }\n\n    return cycles;\n  }\n\n  /**\n   * Validate the role hierarchy.\n   *\n   * @returns Validation errors if any\n   */\n  validate(): string[] {\n    const errors: string[] = [];\n\n    // Check for missing parent references\n    for (const role of this.roles.values()) {\n      if (role.inherits) {\n        for (const parentId of role.inherits) {\n          if (!this.roles.has(parentId)) {\n            errors.push(`Role '${role.id}' references missing parent '${parentId}'`);\n          }\n        }\n      }\n    }\n\n    // Check for cycles\n    errors.push(...this.detectCycles());\n\n    // Check for duplicate IDs\n    const ids = new Set<string>();\n    for (const role of this.roles.values()) {\n      if (ids.has(role.id)) {\n        errors.push(`Duplicate role ID: ${role.id}`);\n      }\n      ids.add(role.id);\n    }\n\n    return errors;\n  }\n\n  // ===========================================================================\n  // Private Methods\n  // ===========================================================================\n\n  /**\n   * Rebuild the hierarchy map from role definitions.\n   */\n  private rebuildHierarchy(): void {\n    this.hierarchyMap.clear();\n\n    // Initialize hierarchy entries\n    for (const role of this.roles.values()) {\n      this.hierarchyMap.set(role.id, {\n        roleId: role.id,\n        parents: role.inherits ?? [],\n        children: [],\n        level: 0,\n      });\n    }\n\n    // Build children references\n    for (const role of this.roles.values()) {\n      if (role.inherits) {\n        for (const parentId of role.inherits) {\n          const parentHierarchy = this.hierarchyMap.get(parentId);\n          if (parentHierarchy) {\n            parentHierarchy.children.push(role.id);\n          }\n        }\n      }\n    }\n\n    // Calculate levels\n    this.calculateLevels();\n  }\n\n  /**\n   * Calculate hierarchy levels for all roles.\n   */\n  private calculateLevels(): void {\n    const calculated = new Set<string>();\n\n    const calculateLevel = (roleId: string): number => {\n      if (calculated.has(roleId)) {\n        return this.hierarchyMap.get(roleId)?.level ?? 0;\n      }\n\n      const hierarchy = this.hierarchyMap.get(roleId);\n      if (!hierarchy) return 0;\n\n      if (hierarchy.parents.length === 0) {\n        hierarchy.level = 0;\n      } else {\n        hierarchy.level = Math.max(...hierarchy.parents.map((p) => calculateLevel(p))) + 1;\n      }\n\n      calculated.add(roleId);\n      return hierarchy.level;\n    };\n\n    for (const roleId of this.roles.keys()) {\n      calculateLevel(roleId);\n    }\n  }\n\n  /**\n   * Recursively collect ancestor roles.\n   */\n  private collectAncestors(roleId: string, ancestors: Set<string>, visited: Set<string>): void {\n    if (visited.has(roleId)) return;\n    visited.add(roleId);\n\n    const role = this.roles.get(roleId);\n    if (!role?.inherits) return;\n\n    for (const parentId of role.inherits) {\n      ancestors.add(parentId);\n      this.collectAncestors(parentId, ancestors, visited);\n    }\n  }\n\n  /**\n   * Recursively collect descendant roles.\n   */\n  private collectDescendants(roleId: string, descendants: Set<string>, visited: Set<string>): void {\n    if (visited.has(roleId)) return;\n    visited.add(roleId);\n\n    const hierarchy = this.hierarchyMap.get(roleId);\n    if (!hierarchy) return;\n\n    for (const childId of hierarchy.children) {\n      descendants.add(childId);\n      this.collectDescendants(childId, descendants, visited);\n    }\n  }\n\n  /**\n   * Recursively collect permissions including inherited.\n   */\n  private collectPermissions(\n    roleId: string,\n    permissions: Set<Permission>,\n    visited: Set<string>\n  ): void {\n    if (visited.has(roleId)) return;\n    visited.add(roleId);\n\n    const role = this.roles.get(roleId);\n    if (!role) return;\n\n    // Add role's own permissions\n    for (const permission of role.permissions) {\n      permissions.add(permission);\n    }\n\n    // Collect inherited permissions\n    if (role.inherits) {\n      for (const parentId of role.inherits) {\n        this.collectPermissions(parentId, permissions, visited);\n      }\n    }\n  }\n\n  /**\n   * Check for circular inheritance.\n   */\n  private hasCycle(roleId: string, visited: Set<string>, path: string[]): boolean {\n    if (path.includes(roleId)) {\n      path.push(roleId);\n      return true;\n    }\n\n    if (visited.has(roleId)) {\n      return false;\n    }\n\n    visited.add(roleId);\n    path.push(roleId);\n\n    const role = this.roles.get(roleId);\n    if (role?.inherits) {\n      for (const parentId of role.inherits) {\n        if (this.hasCycle(parentId, visited, path)) {\n          return true;\n        }\n      }\n    }\n\n    path.pop();\n    return false;\n  }\n\n  /**\n   * Clear all caches.\n   */\n  private clearCaches(): void {\n    this.permissionCache.clear();\n    this.ancestorCache.clear();\n  }\n}\n\n// =============================================================================\n// Factory Function\n// =============================================================================\n\n/**\n * Create a new role hierarchy manager.\n *\n * @param roles - Initial role definitions\n * @returns Configured RoleHierarchyManager\n */\nexport function createRoleHierarchy(roles?: RoleDefinition[]): RoleHierarchyManager {\n  const manager = new RoleHierarchyManager();\n\n  if (roles) {\n    manager.addRoles(roles);\n  }\n\n  return manager;\n}\n\n// =============================================================================\n// Preset Role Hierarchies\n// =============================================================================\n\n/**\n * Standard 4-tier role hierarchy.\n */\nexport const STANDARD_ROLE_HIERARCHY: RoleDefinition[] = [\n  {\n    id: 'super_admin',\n    name: 'Super Administrator',\n    permissions: ['*'],\n    priority: 1000,\n    isSystem: true,\n  },\n  {\n    id: 'admin',\n    name: 'Administrator',\n    permissions: ['admin:*', 'manage:*'],\n    inherits: ['manager'],\n    priority: 100,\n  },\n  {\n    id: 'manager',\n    name: 'Manager',\n    permissions: ['team:*', 'reports:*', 'users:read'],\n    inherits: ['user'],\n    priority: 50,\n  },\n  {\n    id: 'user',\n    name: 'User',\n    permissions: ['profile:*', 'documents:own:*'],\n    inherits: ['guest'],\n    priority: 10,\n  },\n  {\n    id: 'guest',\n    name: 'Guest',\n    permissions: ['public:read'],\n    priority: 1,\n  },\n];\n\n/**\n * Healthcare-specific role hierarchy.\n */\nexport const HEALTHCARE_ROLE_HIERARCHY: RoleDefinition[] = [\n  {\n    id: 'system_admin',\n    name: 'System Administrator',\n    permissions: ['*'],\n    priority: 1000,\n    isSystem: true,\n  },\n  {\n    id: 'medical_director',\n    name: 'Medical Director',\n    permissions: ['medical:*', 'staff:*', 'reports:*'],\n    inherits: ['physician'],\n    priority: 200,\n  },\n  {\n    id: 'physician',\n    name: 'Physician',\n    permissions: ['patients:*', 'prescriptions:*', 'orders:*', 'diagnoses:*'],\n    inherits: ['clinical_staff'],\n    priority: 100,\n  },\n  {\n    id: 'nurse_manager',\n    name: 'Nurse Manager',\n    permissions: ['nursing:manage', 'schedules:*', 'reports:nursing'],\n    inherits: ['nurse'],\n    priority: 80,\n  },\n  {\n    id: 'nurse',\n    name: 'Nurse',\n    permissions: ['patients:read', 'vitals:*', 'medications:administer', 'notes:nursing'],\n    inherits: ['clinical_staff'],\n    priority: 60,\n  },\n  {\n    id: 'clinical_staff',\n    name: 'Clinical Staff',\n    permissions: ['patients:read', 'schedules:view', 'messages:*'],\n    priority: 40,\n  },\n  {\n    id: 'front_desk',\n    name: 'Front Desk',\n    permissions: ['appointments:*', 'patients:register', 'insurance:verify'],\n    priority: 30,\n  },\n  {\n    id: 'billing',\n    name: 'Billing Staff',\n    permissions: ['billing:*', 'insurance:*', 'payments:*'],\n    priority: 30,\n  },\n  {\n    id: 'patient',\n    name: 'Patient',\n    permissions: ['appointments:own:*', 'records:own:read', 'messages:own:*', 'portal:access'],\n    priority: 10,\n  },\n];\n"],"names":["RoleHierarchyManager","role","roles","roleId","updates","existing","ancestorId","cachedAncestors","ancestors","descendants","h","cachedPermissions","permissions","roleIds","p","permission","parts","roleA","roleB","a","b","highest","highestPriority","cycles","visited","path","errors","parentId","ids","parentHierarchy","calculated","calculateLevel","hierarchy","childId","createRoleHierarchy","manager","STANDARD_ROLE_HIERARCHY","HEALTHCARE_ROLE_HIERARCHY"],"mappings":"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"}