, * navigation: list * }>, * agent: ?array{ * id: int, * admin_site_id: int, * admin_site_name: string, * site_code: string, * path: string, * code: string, * name: string, * depth: int, * can_create_child_agent: bool, * can_create_player: bool * }, * is_super_admin: bool, * operational_permissions: list, * delegation_ceiling: list, * accessible_sites?: list * } */ public static function fromAdmin(AdminUser $admin): array { $fresh = $admin->fresh(); $permissionSlugs = $fresh->adminPermissionSlugs(); $agent = self::agentContext($fresh); $payload = [ 'id' => $fresh->id, 'username' => $fresh->username, 'nickname' => $fresh->name, 'email' => $fresh->email, 'permissions' => $permissionSlugs, 'navigation' => AdminAuthorizationRegistry::visibleNavigationItems($permissionSlugs, $fresh), 'agent' => $agent, 'is_super_admin' => $fresh->isSuperAdmin(), 'operational_permissions' => $permissionSlugs, 'delegation_ceiling' => AgentDelegationAuthorization::delegationLegacySlugsForAdminUser($fresh), ]; if ($agent === null) { $payload['accessible_sites'] = AdminUserSiteBindingPresenter::accessibleSitesFor($fresh); } return $payload; } /** * @return array{ * id: int, * admin_site_id: int, * admin_site_name: string, * site_code: string, * path: string, * code: string, * name: string, * depth: int, * can_create_child_agent: bool, * can_create_player: bool * }|null */ private static function agentContext(AdminUser $admin): ?array { if ($admin->isSuperAdmin()) { return null; } $node = $admin->primaryAgentNode(); if (! $node instanceof AgentNode) { return null; } $site = AdminSite::query() ->where('id', (int) $node->admin_site_id) ->first(['code', 'name']); $siteCode = is_string($site?->code) ? $site->code : ''; $siteName = is_string($site?->name) ? $site->name : ''; $profile = AgentProfile::query()->where('agent_node_id', $node->id)->first(); return [ 'id' => (int) $node->id, 'admin_site_id' => (int) $node->admin_site_id, 'admin_site_name' => $siteName, 'site_code' => $siteCode !== '' ? $siteCode : '', 'path' => (string) $node->path, 'code' => (string) $node->code, 'name' => (string) $node->name, 'depth' => (int) $node->depth, 'can_create_child_agent' => (bool) ($profile?->can_create_child_agent ?? false), 'can_create_player' => (bool) ($profile?->can_create_player ?? false), ]; } }