]> source.dussan.org Git - nextcloud-server.git/commitdiff
feat: add ability to sort users by last_login, uid or displayName. one of these needs...
authoryemkareems <yemkareems@gmail.com>
Mon, 6 May 2024 11:40:18 +0000 (17:10 +0530)
committeryemkareems <yemkareems@gmail.com>
Mon, 8 Jul 2024 10:12:55 +0000 (15:42 +0530)
Signed-off-by: yemkareems <yemkareems@gmail.com>
apps/provisioning_api/lib/Controller/UsersController.php
lib/private/Group/Manager.php
lib/private/User/Manager.php
lib/public/IUserManager.php

index 67293ae00335f322d40ea41830c81a08d0628546..04bf3a94421f85234899c6f97d2ba9975070b0b4 100644 (file)
@@ -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<Http::STATUS_OK, array{users: array<string, Provisioning_APIUserDetails|array{id: string}>}, 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);
                }
index 0ab64907c8bb182f32fd81624c6106198c9af86f..df4aa67cba48e537d5da7bd3bed25525caf28d9f 100644 (file)
@@ -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;
index d93431a2699f40b4546aa02b88d207968e6419e2..6b0c0dbd1d303590ff79935c7d2665378f94b1ca 100644 (file)
@@ -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;
        }
 
index 851b565f617464eb33f408d7ab57df81b47f0e1f..89cd1f71899daa654efa1cc58877f247dd3c58a5 100644 (file)
@@ -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