fix: change orderBy and sort to sortMode and sortOrder. default it to uid asc. enable email search by changing query

Signed-off-by: yemkareems <yemkareems@gmail.com>
pull/45249/head
yemkareems 2 years ago
parent 33b38c6573
commit 76c875a588
  1. 14
      apps/provisioning_api/lib/Controller/UsersController.php
  2. 4
      lib/private/Group/Manager.php
  3. 12
      lib/private/User/Backend.php
  4. 35
      lib/private/User/Database.php
  5. 30
      lib/private/User/Manager.php
  6. 2
      lib/public/IUserManager.php
  7. 8
      lib/public/UserInterface.php

@ -94,7 +94,7 @@ class UsersController extends AUserData {
*
* 200: Users returned
*/
public function getUsers(string $search = '', ?int $limit = null, int $offset = 0, string $orderBy = 'lastLogin', string $sort = 'DESC'): DataResponse {
public function getUsers(string $search = '', ?int $limit = null, int $offset = 0, string $sortMode = 'uid', string $sortOrder = 'asc'): 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, $orderBy, $sort);
$users = $this->userManager->search($search, $limit, $offset, $sortMode, $sortOrder);
} elseif ($subAdminManager->isSubAdmin($user)) {
$subAdminOfGroups = $subAdminManager->getSubAdminsGroups($user);
foreach ($subAdminOfGroups as $key => $group) {
@ -131,13 +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
* @param string $sortMode Field to order the results with
* @param string $sortOrder 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, string $orderBy = 'lastLogin', string $sort = 'DESC'): DataResponse {
public function getUsersDetails(string $search = '', ?int $limit = null, int $offset = 0, string $sortMode = 'uid', string $sortOrder = 'asc'): DataResponse {
$currentUser = $this->userSession->getUser();
$users = [];
@ -145,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, $orderBy, $sort);
$users = $this->userManager->search($search, $limit, $offset, $sortMode, $sortOrder);
$users = array_keys($users);
} elseif ($subAdminManager->isSubAdmin($currentUser)) {
$subAdminOfGroups = $subAdminManager->getSubAdminsGroups($currentUser);
@ -155,7 +155,7 @@ class UsersController extends AUserData {
$users = [];
foreach ($subAdminOfGroups as $group) {
$users[] = array_keys($this->groupManager->displayNamesInGroup($group, $search, $limit, $offset, $orderBy, $sort));
$users[] = array_keys($this->groupManager->displayNamesInGroup($group, $search, $limit, $offset, $sortMode, $sortOrder));
}
$users = array_merge(...$users);
}

@ -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, $orderBy = 'uid', $sort = 'ASC') {
public function displayNamesInGroup($gid, $search = '', $limit = -1, $offset = 0, $sortMode = 'uid', $sortOrder = '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, $orderBy, $sort);
$filteredUsers = $this->userManager->searchDisplayName($search, $searchLimit, $searchOffset, $sortMode, $sortOrder);
foreach ($filteredUsers as $filteredUser) {
if ($group->inGroup($filteredUser)) {
$groupUsers[] = $filteredUser;

@ -89,11 +89,11 @@ abstract class Backend implements UserInterface {
* @param string $search
* @param null|int $limit
* @param null|int $offset
* @param string $orderBy
* @param string $sort
* @param string $sortMode
* @param string $sortOrder
* @return string[] an array of all uids
*/
public function getUsers($search = '', $limit = null, $offset = null, $orderBy = 'lastLogin', $sort = 'DESC') {
public function getUsers($search = '', $limit = null, $offset = null, string $sortMode = 'uid', string $sortOrder = 'asc') {
return [];
}
@ -130,11 +130,11 @@ abstract class Backend implements UserInterface {
* @param string $search
* @param int|null $limit
* @param int|null $offset
* @param string $orderBy
* @param string $sort
* @param string $sortMode
* @param string $sortOrder
* @return array an array of all displayNames (value) and the corresponding uids (key)
*/
public function getDisplayNames($search = '', $limit = null, $offset = null, string $orderBy = 'lastLogin', string $sort = 'DESC'): array {
public function getDisplayNames($search = '', $limit = null, $offset = null, string $sortMode = 'uid', string $sortOrder = 'asc'): array {
$displayNames = [];
$users = $this->getUsers($search, $limit, $offset);
foreach ($users as $user) {

@ -227,36 +227,43 @@ class Database extends ABackend implements
* @param string $search
* @param int|null $limit
* @param int|null $offset
* @param string $orderBy
* @param string $sort
* @param string $sortMode
* @param string $sortOrder
* @return array an array of all displayNames (value) and the corresponding uids (key)
*/
public function getDisplayNames($search = '', $limit = null, $offset = null, string $orderBy = 'lastLogin', string $sort = 'DESC'): array {
public function getDisplayNames($search = '', $limit = null, $offset = null, string $sortMode = 'uid', string $sortOrder = 'asc'): array {
$limit = $this->fixLimit($limit);
$this->fixDI();
$query = $this->dbConn->getQueryBuilder();
$appId = 'settings';
$configKey = 'email';
if($orderBy == 'lastLogin') {
$appId = 'login';
$configKey = 'lastLogin';
if ($sortMode === 'lastLogin') {
$lastLoginSubSelect = $this->dbConn->getQueryBuilder();
$lastLoginSubSelect->select('configvalue')
->from('preferences', 'p2')
->where($lastLoginSubSelect->expr()->andX(
$lastLoginSubSelect->expr()->eq('p2.userid', 'uid'),
$lastLoginSubSelect->expr()->eq('p2.appid', $lastLoginSubSelect->expr()->literal('login')),
$lastLoginSubSelect->expr()->eq('p2.configkey', $lastLoginSubSelect->expr()->literal('lastLogin')),
));
$orderByExpression = $query->createFunction('(' . $lastLoginSubSelect->getSQL() .')');
} else {
$orderByExpression = $query->func()->lower('displayname');
}
$query->select('uid', 'displayname')
$query->select('uid', 'displayname', $orderByExpression)
->from($this->table, 'u')
->leftJoin('u', 'preferences', 'p', $query->expr()->andX(
$query->expr()->eq('userid', 'uid'),
$query->expr()->eq('appid', $query->expr()->literal($appId)),
$query->expr()->eq('configkey', $query->expr()->literal($configKey)))
$query->expr()->eq('appid', $query->expr()->literal('settings')),
$query->expr()->eq('configkey', $query->expr()->literal('email')))
)
// sqlite doesn't like re-using a single named parameter here
->where($query->expr()->iLike('uid', $query->createPositionalParameter('%' . $this->dbConn->escapeLikeParameter($search) . '%')))
->orWhere($query->expr()->iLike('displayname', $query->createPositionalParameter('%' . $this->dbConn->escapeLikeParameter($search) . '%')))
->orWhere($query->expr()->iLike('configvalue', $query->createPositionalParameter('%' . $this->dbConn->escapeLikeParameter($search) . '%')))
->orderBy($query->func()->lower('configvalue'), $sort)
->orderBy($orderByExpression, $sortOrder)
->addOrderBy('uid_lower', 'ASC')
->setMaxResults($limit)
->setFirstResult($offset);
@ -394,11 +401,9 @@ class Database extends ABackend implements
$limit = $this->fixLimit($limit);
$users = $this->getDisplayNames($search, $limit, $offset, $orderBy, $sort);
$userIds = array_map(function ($uid) {
return array_map(function ($uid) {
return (string)$uid;
}, array_keys($users));
sort($userIds, SORT_STRING | SORT_FLAG_CASE);
return $userIds;
}
/**

@ -262,38 +262,38 @@ class Manager extends PublicEmitter implements IUserManager {
* @return IUser[]
* @deprecated since 27.0.0, use searchDisplayName instead
*/
public function search($pattern, $limit = null, $offset = null, $orderBy = 'uid', $sort = 'ASC'): array {
public function search($pattern, $limit = null, $offset = null, $sortMode = 'uid', $sortOrder = 'asc'): array {
$users = [];
foreach ($this->backends as $backend) {
$backendUsers = $backend->getUsers($pattern, $limit, $offset, $orderBy, $sort);
$backendUsers = $backend->getUsers($pattern, $limit, $offset, $sortMode, $sortOrder);
if (is_array($backendUsers)) {
foreach ($backendUsers as $uid) {
$users[$uid] = new LazyUser($uid, $this, null, $backend);
}
}
}
switch ($orderBy.' '.$sort) {
case 'uid DESC':
switch ($sortMode.' '.$sortOrder) {
case 'uid desc':
uasort($users, function (IUser $a, IUser $b) {
return strcasecmp($b->getUID(), $a->getUID());
});
break;
case 'lastLogin ASC':
case 'lastLogin asc':
uasort($users, function (IUser $a, IUser $b) {
return $a->getLastLogin() - $b->getLastLogin();
});
break;
case 'lastLogin DESC':
case 'lastLogin desc':
uasort($users, function (IUser $a, IUser $b) {
return $b->getLastLogin() - $a->getLastLogin();
});
break;
case 'displayName ASC':
case 'displayName asc':
uasort($users, function (IUser $a, IUser $b) {
return strcasecmp($a->getDisplayName(), $b->getDisplayName());
});
break;
case 'displayName DESC':
case 'displayName desc':
uasort($users, function (IUser $a, IUser $b) {
return strcasecmp($b->getDisplayName(), $a->getDisplayName());
});
@ -316,7 +316,7 @@ class Manager extends PublicEmitter implements IUserManager {
* @param int $offset
* @return IUser[]
*/
public function searchDisplayName($pattern, $limit = null, $offset = null, $orderBy = 'displayName', $sort = 'ASC') {
public function searchDisplayName($pattern, $limit = null, $offset = null, $sortMode = 'uid', $sortOrder = 'asc') {
$users = [];
foreach ($this->backends as $backend) {
$backendUsers = $backend->getDisplayNames($pattern, $limit, $offset);
@ -327,28 +327,28 @@ class Manager extends PublicEmitter implements IUserManager {
}
}
switch ($orderBy.' '.$sort) {
case 'uid ASC':
switch ($sortMode.' '.$sortOrder) {
case 'uid asc':
uasort($users, function (IUser $a, IUser $b) {
return strcasecmp($a->getUID(), $b->getUID());
});
break;
case 'uid DESC':
case 'uid desc':
uasort($users, function (IUser $a, IUser $b) {
return strcasecmp($b->getUID(), $a->getUID());
});
break;
case 'lastLogin ASC':
case 'lastLogin asc':
uasort($users, function (IUser $a, IUser $b) {
return $a->getLastLogin() - $b->getLastLogin();
});
break;
case 'lastLogin DESC':
case 'lastLogin desc':
uasort($users, function (IUser $a, IUser $b) {
return $b->getLastLogin() - $a->getLastLogin();
});
break;
case 'displayName DESC':
case 'displayName asc':
uasort($users, function (IUser $a, IUser $b) {
return strcasecmp($b->getDisplayName(), $a->getDisplayName());
});

@ -104,7 +104,7 @@ interface IUserManager {
* @return \OCP\IUser[]
* @since 8.0.0
*/
public function search($pattern, $limit = null, $offset = null, $orderBy = 'uid', $sort = 'ASC');
public function search($pattern, $limit = null, $offset = null, $sortMode = 'uid', $sortOrder = 'asc');
/**
* search by displayName

@ -45,7 +45,7 @@ interface UserInterface {
* @return string[] an array of all uids
* @since 4.5.0
*/
public function getUsers($search = '', $limit = null, $offset = null, $orderBy = 'lastLogin', $sort = 'DESC');
public function getUsers($search = '', $limit = null, $offset = null, string $sortMode = 'uid', string $sortOrder = 'asc');
/**
* check if a user exists
@ -69,12 +69,12 @@ interface UserInterface {
* @param string $search
* @param int|null $limit
* @param int|null $offset
* @param string $orderBy
* @param string $sort
* @param string $sortMode
* @param string $sortOrder
* @return array an array of all displayNames (value) and the corresponding uids (key)
* @since 4.5.0
*/
public function getDisplayNames($search = '', $limit = null, $offset = null, string $orderBy = 'lastLogin', string $sort = 'DESC');
public function getDisplayNames($search = '', $limit = null, $offset = null, string $sortMode = 'uid', string $sortOrder = 'asc');
/**
* Check if a user list is available or not

Loading…
Cancel
Save