Skip to content

Commit e2a2fbc

Browse files
committed
feat: Implement ISearchKnownUsersBackend
Signed-off-by: Carl Schwan <carl@carlschwan.eu>
1 parent e49917d commit e2a2fbc

2 files changed

Lines changed: 49 additions & 1 deletion

File tree

lib/Db/UserMapper.php

Lines changed: 32 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -237,4 +237,36 @@ public function countUsers(): int {
237237

238238
return (int)$count;
239239
}
240+
241+
/**
242+
* @return array<string, string>
243+
*/
244+
public function searchKnownUsersByDisplayName(string $searcher, string $pattern, ?int $limit = null, ?int $offset = null): array {
245+
$query = $this->db->getQueryBuilder();
246+
247+
$query->select('u.user_id', 'u.display_name')
248+
->from($this->getTableName(), 'u')
249+
->leftJoin('u', 'known_users', 'k', $query->expr()->andX(
250+
$query->expr()->eq('k.known_user', 'u.user_id'),
251+
$query->expr()->eq('k.known_to', $query->createNamedParameter($searcher))
252+
))
253+
->where($query->expr()->eq('k.known_to', $query->createNamedParameter($searcher)))
254+
->andWhere($query->expr()->orX(
255+
$query->expr()->iLike('u.user_id', $query->createNamedParameter('%' . $this->db->escapeLikeParameter($pattern) . '%')),
256+
$query->expr()->iLike('u.display_name', $query->createNamedParameter('%' . $this->db->escapeLikeParameter($pattern) . '%'))
257+
))
258+
->orderBy('u.display_name', 'ASC')
259+
->addOrderBy('u.user_id', 'ASC')
260+
->setMaxResults($limit)
261+
->setFirstResult($offset);
262+
263+
$result = $query->executeQuery();
264+
$displayNames = [];
265+
while ($row = $result->fetch()) {
266+
$displayNames[(string)$row['uid']] = (string)$row['display_name'];
267+
}
268+
$result->closeCursor();
269+
270+
return $displayNames;
271+
}
240272
}

lib/User/Backend.php

Lines changed: 17 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -43,11 +43,12 @@
4343
use OCP\User\Backend\ICustomLogout;
4444
use OCP\User\Backend\IGetDisplayNameBackend;
4545
use OCP\User\Backend\IPasswordConfirmationBackend;
46+
use OCP\User\Backend\ISearchKnownUsersBackend;
4647
use OCP\User\Events\UserFirstTimeLoggedInEvent;
4748
use Psr\Log\LoggerInterface;
4849
use Throwable;
4950

50-
class Backend extends ABackend implements IPasswordConfirmationBackend, IGetDisplayNameBackend, IApacheBackend, ICustomLogout, ICountUsersBackend {
51+
class Backend extends ABackend implements IPasswordConfirmationBackend, IGetDisplayNameBackend, IApacheBackend, ICustomLogout, ICountUsersBackend, ISearchKnownUsersBackend {
5152
private const SESSION_USER_DATA = 'user_oidc.oidcUserData';
5253

5354
/** @var list<class-string<IBearerTokenValidator>> */
@@ -475,4 +476,19 @@ private function provisionUser(
475476
return null;
476477
}
477478
}
479+
480+
#[\Override]
481+
public function searchKnownUsersByDisplayName(string $searcher, string $pattern, ?int $limit = null, ?int $offset = null): array {
482+
$limit = $this->fixLimit($limit);
483+
484+
return $this->mapper->searchKnownUsersByDisplayName($searcher, $pattern, $limit, $offset);
485+
}
486+
487+
private function fixLimit(?int $limit): ?int {
488+
if (is_int($limit) && $limit >= 0) {
489+
return $limit;
490+
}
491+
492+
return null;
493+
}
478494
}

0 commit comments

Comments
 (0)