From 0ee676cd5123dc13e7f4e31817e02d74d657c51a Mon Sep 17 00:00:00 2001 From: yemkareems Date: Mon, 6 May 2024 17:10:18 +0530 Subject: [PATCH] feat: add ability to sort users by last_login, uid or displayName. one of these needs to be passed as orderBy and sort can be ASC or DESC Signed-off-by: yemkareems --- .../lib/Controller/UsersController.php | 12 +-- lib/private/Group/Manager.php | 4 +- lib/private/User/Manager.php | 76 +++++++++++++++++-- lib/public/IUserManager.php | 2 +- 4 files changed, 78 insertions(+), 16 deletions(-) diff --git a/apps/provisioning_api/lib/Controller/UsersController.php b/apps/provisioning_api/lib/Controller/UsersController.php index 67293ae0033..04bf3a94421 100644 --- a/apps/provisioning_api/lib/Controller/UsersController.php +++ b/apps/provisioning_api/lib/Controller/UsersController.php @@ -94,7 +94,7 @@ class UsersController extends AUserData { * * 200: Users returned */ - public function getUsers(string $search = '', ?int $limit = null, int $offset = 0): DataResponse { + public function getUsers(string $search = '', ?int $limit = null, int $offset = 0, string $orderBy = 'last_login', string $sort = 'DESC'): DataResponse { $user = $this->userSession->getUser(); $users = []; @@ -102,7 +102,7 @@ class UsersController extends AUserData { $uid = $user->getUID(); $subAdminManager = $this->groupManager->getSubAdmin(); if ($this->groupManager->isAdmin($uid)) { - $users = $this->userManager->search($search, $limit, $offset); + $users = $this->userManager->search($search, $limit, $offset, $orderBy, $sort); } elseif ($subAdminManager->isSubAdmin($user)) { $subAdminOfGroups = $subAdminManager->getSubAdminsGroups($user); foreach ($subAdminOfGroups as $key => $group) { @@ -131,11 +131,13 @@ class UsersController extends AUserData { * @param string $search Text to search for * @param int|null $limit Limit the amount of groups returned * @param int $offset Offset for searching for groups + * @param string $orderBy Field to order the results with + * @param string $sort ASC or DESC * @return DataResponse}, array{}> * * 200: Users details returned */ - public function getUsersDetails(string $search = '', ?int $limit = null, int $offset = 0): DataResponse { + public function getUsersDetails(string $search = '', ?int $limit = null, int $offset = 0, string $orderBy = 'displayName', string $sort = 'ASC'): DataResponse { $currentUser = $this->userSession->getUser(); $users = []; @@ -143,7 +145,7 @@ class UsersController extends AUserData { $uid = $currentUser->getUID(); $subAdminManager = $this->groupManager->getSubAdmin(); if ($this->groupManager->isAdmin($uid)) { - $users = $this->userManager->search($search, $limit, $offset); + $users = $this->userManager->search($search, $limit, $offset, $orderBy, $sort); $users = array_keys($users); } elseif ($subAdminManager->isSubAdmin($currentUser)) { $subAdminOfGroups = $subAdminManager->getSubAdminsGroups($currentUser); @@ -153,7 +155,7 @@ class UsersController extends AUserData { $users = []; foreach ($subAdminOfGroups as $group) { - $users[] = array_keys($this->groupManager->displayNamesInGroup($group, $search, $limit, $offset)); + $users[] = array_keys($this->groupManager->displayNamesInGroup($group, $search, $limit, $offset, $orderBy, $sort)); } $users = array_merge(...$users); } diff --git a/lib/private/Group/Manager.php b/lib/private/Group/Manager.php index 0ab64907c8b..df4aa67cba4 100644 --- a/lib/private/Group/Manager.php +++ b/lib/private/Group/Manager.php @@ -401,7 +401,7 @@ class Manager extends PublicEmitter implements IGroupManager { * @param int $offset * @return array an array of display names (value) and user ids (key) */ - public function displayNamesInGroup($gid, $search = '', $limit = -1, $offset = 0) { + public function displayNamesInGroup($gid, $search = '', $limit = -1, $offset = 0, $orderBy = 'uid', $sort = 'ASC') { $group = $this->get($gid); if (is_null($group)) { return []; @@ -419,7 +419,7 @@ class Manager extends PublicEmitter implements IGroupManager { } do { - $filteredUsers = $this->userManager->searchDisplayName($search, $searchLimit, $searchOffset); + $filteredUsers = $this->userManager->searchDisplayName($search, $searchLimit, $searchOffset, $orderBy, $sort); foreach ($filteredUsers as $filteredUser) { if ($group->inGroup($filteredUser)) { $groupUsers[] = $filteredUser; diff --git a/lib/private/User/Manager.php b/lib/private/User/Manager.php index d93431a2699..6b0c0dbd1d3 100644 --- a/lib/private/User/Manager.php +++ b/lib/private/User/Manager.php @@ -262,7 +262,7 @@ class Manager extends PublicEmitter implements IUserManager { * @return IUser[] * @deprecated since 27.0.0, use searchDisplayName instead */ - public function search($pattern, $limit = null, $offset = null) { + public function search($pattern, $limit = null, $offset = null, $orderBy = 'uid', $sort = 'ASC') { $users = []; foreach ($this->backends as $backend) { $backendUsers = $backend->getUsers($pattern, $limit, $offset); @@ -272,10 +272,39 @@ class Manager extends PublicEmitter implements IUserManager { } } } + switch ($orderBy.' '.$sort) { + case 'uid DESC': + uasort($users, function (IUser $a, IUser $b) { + return strcasecmp($b->getUID(), $a->getUID()); + }); + break; + case 'last_login ASC': + uasort($users, function (IUser $a, IUser $b) { + return strcasecmp($a->getLastLogin(), $b->getLastLogin()); + }); + break; + case 'last_login DESC': + uasort($users, function (IUser $a, IUser $b) { + return strcasecmp($b->getLastLogin(), $a->getLastLogin()); + }); + break; + case 'displayName ASC': + uasort($users, function (IUser $a, IUser $b) { + return strcasecmp($a->getDisplayName(), $b->getDisplayName()); + }); + break; + case 'displayName DESC': + uasort($users, function (IUser $a, IUser $b) { + return strcasecmp($b->getDisplayName(), $a->getDisplayName()); + }); + break; + default: + uasort($users, function (IUser $a, IUser $b) { + return strcasecmp($a->getUID(), $b->getUID()); + }); + break; + } - uasort($users, function (IUser $a, IUser $b) { - return strcasecmp($a->getUID(), $b->getUID()); - }); return $users; } @@ -287,7 +316,7 @@ class Manager extends PublicEmitter implements IUserManager { * @param int $offset * @return IUser[] */ - public function searchDisplayName($pattern, $limit = null, $offset = null) { + public function searchDisplayName($pattern, $limit = null, $offset = null, $orderBy = 'displayName', $sort= 'ASC') { $users = []; foreach ($this->backends as $backend) { $backendUsers = $backend->getDisplayNames($pattern, $limit, $offset); @@ -298,9 +327,40 @@ class Manager extends PublicEmitter implements IUserManager { } } - usort($users, function (IUser $a, IUser $b) { - return strcasecmp($a->getDisplayName(), $b->getDisplayName()); - }); + switch ($orderBy.' '.$sort) { + case 'uid ASC': + uasort($users, function (IUser $a, IUser $b) { + return strcasecmp($a->getUID(), $b->getUID()); + }); + break; + case 'uid DESC': + uasort($users, function (IUser $a, IUser $b) { + return strcasecmp($b->getUID(), $a->getUID()); + }); + break; + case 'last_login ASC': + uasort($users, function (IUser $a, IUser $b) { + return strcasecmp($a->getLastLogin(), $b->getLastLogin()); + }); + break; + case 'last_login DESC': + uasort($users, function (IUser $a, IUser $b) { + return strcasecmp($b->getLastLogin(), $a->getLastLogin()); + }); + break; + case 'displayName DESC': + uasort($users, function (IUser $a, IUser $b) { + return strcasecmp($b->getDisplayName(), $a->getDisplayName()); + }); + break; + default: + uasort($users, function (IUser $a, IUser $b) { + return strcasecmp($a->getDisplayName(), $b->getDisplayName()); + }); + break; + } + + return $users; } diff --git a/lib/public/IUserManager.php b/lib/public/IUserManager.php index 851b565f617..89cd1f71899 100644 --- a/lib/public/IUserManager.php +++ b/lib/public/IUserManager.php @@ -104,7 +104,7 @@ interface IUserManager { * @return \OCP\IUser[] * @since 8.0.0 */ - public function search($pattern, $limit = null, $offset = null); + public function search($pattern, $limit = null, $offset = null, $orderBy = 'uid', $sort = 'ASC'); /** * search by displayName -- 2.39.5