page ?? 1)); $perPage = min(self::MAX_PER_PAGE, max(1, (int) ($request->per_page ?? self::DEFAULT_PER_PAGE))); $search = sanitize_text_field((string) ($request->search ?? '')); $args = [ 'number' => $perPage, 'offset' => ($page - 1) * $perPage, 'orderby' => 'display_name', 'order' => 'ASC', ]; if ($search !== '') { $args['search'] = '*' . $search . '*'; $args['search_columns'] = ['user_login', 'user_email', 'display_name']; } $query = new WP_User_Query($args); $totalUsers = (int) $query->get_total(); $users = $query->get_results(); return Response::success( [ 'users' => array_map([$this, 'formatUser'], $users), 'total' => $totalUsers, 'page' => $page, 'per_page' => $perPage, 'total_pages' => (int) ceil($totalUsers / $perPage), ] ); } /** * Removes all user-level forum capability overrides, restoring role defaults. */ public function resetUserCapabilities(ResetUserCapabilitiesRequest $request) { $userId = (int) $request->id; $user = get_userdata($userId); if (!$user instanceof WP_User) { return Response::error(__('User not found.', 'bit-connect'))->httpStatus(404); } foreach (ExtensionPoints::capabilities() as $cap) { $user->remove_cap($cap); } return Response::success($this->formatUser($user)); } // ------------------------------------------------------------------------- // Internals // ------------------------------------------------------------------------- /** * One row of the member list. * * Delegates so any other endpoint that returns a member answers in exactly * this shape. See MemberPresenter. */ private function formatUser(WP_User $user): array { return MemberPresenter::format($user); } }