]> source.dussan.org Git - nextcloud-server.git/commitdiff
Split new method in a new group backend interface
authorCarl Schwan <carl@carlschwan.eu>
Sun, 16 Oct 2022 17:57:31 +0000 (19:57 +0200)
committerCôme Chilliet <come.chilliet@nextcloud.com>
Thu, 27 Apr 2023 10:00:01 +0000 (12:00 +0200)
Better for backward compatibility, also move new interfaces to nc 26

Signed-off-by: Carl Schwan <carl@carlschwan.eu>
lib/composer/composer/autoload_classmap.php
lib/composer/composer/autoload_static.php
lib/private/Group/Database.php
lib/private/Group/Group.php
lib/private/User/LazyUser.php
lib/private/User/Manager.php
lib/public/Group/Backend/ABackend.php
lib/public/Group/Backend/ISearchableGroupBackend.php [new file with mode: 0644]
lib/public/GroupInterface.php

index eb2f3e463546df717d0094f058a12d8c95512df8..292e9b7b3af14d98ae89dc8ca3916142491f0a61 100644 (file)
@@ -412,6 +412,7 @@ return array(
     'OCP\\Group\\Backend\\IIsAdminBackend' => $baseDir . '/lib/public/Group/Backend/IIsAdminBackend.php',
     'OCP\\Group\\Backend\\INamedBackend' => $baseDir . '/lib/public/Group/Backend/INamedBackend.php',
     'OCP\\Group\\Backend\\IRemoveFromGroupBackend' => $baseDir . '/lib/public/Group/Backend/IRemoveFromGroupBackend.php',
+    'OCP\\Group\\Backend\\ISearchableGroupBackend' => $baseDir . '/lib/public/Group/Backend/ISearchableGroupBackend.php',
     'OCP\\Group\\Backend\\ISetDisplayNameBackend' => $baseDir . '/lib/public/Group/Backend/ISetDisplayNameBackend.php',
     'OCP\\Group\\Events\\BeforeGroupChangedEvent' => $baseDir . '/lib/public/Group/Events/BeforeGroupChangedEvent.php',
     'OCP\\Group\\Events\\BeforeGroupCreatedEvent' => $baseDir . '/lib/public/Group/Events/BeforeGroupCreatedEvent.php',
index 9343231a55b56eacc11d583e785ebd05f79d60c7..270d3857ca18e25b5eebd1353352bb81fe265431 100644 (file)
@@ -445,6 +445,7 @@ class ComposerStaticInit749170dad3f5e7f9ca158f5a9f04f6a2
         'OCP\\Group\\Backend\\IIsAdminBackend' => __DIR__ . '/../../..' . '/lib/public/Group/Backend/IIsAdminBackend.php',
         'OCP\\Group\\Backend\\INamedBackend' => __DIR__ . '/../../..' . '/lib/public/Group/Backend/INamedBackend.php',
         'OCP\\Group\\Backend\\IRemoveFromGroupBackend' => __DIR__ . '/../../..' . '/lib/public/Group/Backend/IRemoveFromGroupBackend.php',
+        'OCP\\Group\\Backend\\ISearchableGroupBackend' => __DIR__ . '/../../..' . '/lib/public/Group/Backend/ISearchableGroupBackend.php',
         'OCP\\Group\\Backend\\ISetDisplayNameBackend' => __DIR__ . '/../../..' . '/lib/public/Group/Backend/ISetDisplayNameBackend.php',
         'OCP\\Group\\Events\\BeforeGroupChangedEvent' => __DIR__ . '/../../..' . '/lib/public/Group/Events/BeforeGroupChangedEvent.php',
         'OCP\\Group\\Events\\BeforeGroupCreatedEvent' => __DIR__ . '/../../..' . '/lib/public/Group/Events/BeforeGroupCreatedEvent.php',
index bfc95c574e2c5e6d98e77e5171e388c1388893bd..13e4906c29852ee01beb070e1f278ea49ae0e37c 100644 (file)
@@ -40,12 +40,12 @@ use OCP\Group\Backend\IDeleteGroupBackend;
 use OCP\Group\Backend\IGetDisplayNameBackend;
 use OCP\Group\Backend\IGroupDetailsBackend;
 use OCP\Group\Backend\IRemoveFromGroupBackend;
+use OCP\Group\Backend\ISearchableGroupBackend;
 use OCP\Group\Backend\ISetDisplayNameBackend;
 use OCP\Group\Backend\INamedBackend;
 use OCP\IDBConnection;
 use OCP\IUserManager;
 use OC\User\LazyUser;
-use OC\User\DisplayNameCache;
 
 /**
  * Class for group management in a SQL Database (e.g. MySQL, SQLite)
@@ -60,6 +60,7 @@ class Database extends ABackend implements
        IGroupDetailsBackend,
        IRemoveFromGroupBackend,
        ISetDisplayNameBackend,
+       ISearchableGroupBackend,
        INamedBackend {
        /** @var string[] */
        private $groupCache = [];
@@ -327,56 +328,15 @@ class Database extends ABackend implements
        }
 
        /**
-        * get a list of all users in a group
+        * Get a list of all users in a group
         * @param string $gid
         * @param string $search
         * @param int $limit
         * @param int $offset
-        * @return array an array of user ids
+        * @return array<string> an array of user ids
         */
-       public function usersInGroup($gid, $search = '', $limit = -1, $offset = 0) {
-               $this->fixDI();
-
-               $query = $this->dbConn->getQueryBuilder();
-               $query->select('g.uid')
-                       ->from('group_user', 'g')
-                       ->where($query->expr()->eq('gid', $query->createNamedParameter($gid)))
-                       ->orderBy('g.uid', 'ASC');
-
-               if ($search !== '') {
-                       $query->leftJoin('g', 'users', 'u', $query->expr()->eq('g.uid', 'u.uid'))
-                               ->leftJoin('u', 'preferences', 'p', $query->expr()->andX(
-                                       $query->expr()->eq('p.userid', 'u.uid'),
-                                       $query->expr()->eq('p.appid', $query->expr()->literal('settings')),
-                                       $query->expr()->eq('p.configkey', $query->expr()->literal('email')))
-                               )
-                               // sqlite doesn't like re-using a single named parameter here
-                               ->andWhere(
-                                       $query->expr()->orX(
-                                               $query->expr()->ilike('g.uid', $query->createNamedParameter('%' . $this->dbConn->escapeLikeParameter($search) . '%')),
-                                               $query->expr()->ilike('u.displayname', $query->createNamedParameter('%' . $this->dbConn->escapeLikeParameter($search) . '%')),
-                                               $query->expr()->ilike('p.configvalue', $query->createNamedParameter('%' . $this->dbConn->escapeLikeParameter($search) . '%'))
-                                       )
-                               )
-                               ->orderBy('u.uid_lower', 'ASC');
-               }
-
-               if ($limit !== -1) {
-                       $query->setMaxResults($limit);
-               }
-               if ($offset !== 0) {
-                       $query->setFirstResult($offset);
-               }
-
-               $result = $query->execute();
-
-               $users = [];
-               while ($row = $result->fetch()) {
-                       $users[] = $row['uid'];
-               }
-               $result->closeCursor();
-
-               return $users;
+       public function usersInGroup($gid, $search = '', $limit = -1, $offset = 0): array {
+               return array_map(fn ($user) => $user->getUid(), $this->searchInGroup($gid, $search, $limit, $offset));
        }
 
        public function searchInGroup(string $gid, string $search = '', int $limit = -1, int $offset = 0): array {
@@ -389,7 +349,7 @@ class Database extends ABackend implements
                        ->where($query->expr()->eq('gid', $query->createNamedParameter($gid)))
                        ->orderBy('g.uid', 'ASC');
 
-               $query->leftJoin('g', 'users', 'u', $query->expr()->eq('g.uid', 'u.uid'))
+               $query->leftJoin('g', 'users', 'u', $query->expr()->eq('g.uid', 'u.uid'));
 
                if ($search !== '') {
                        $query->leftJoin('u', 'preferences', 'p', $query->expr()->andX(
@@ -419,9 +379,8 @@ class Database extends ABackend implements
 
                $users = [];
                $userManager = \OCP\Server::get(IUserManager::class);
-               $displayNameCache = \OCP\Server::get(DisplayNameCache::class);
                while ($row = $result->fetch()) {
-                       $users[$row['uid']] = new LazyUser($row['uid'], $displayNameCache, $userManager, $row['displayname'] ?? null);
+                       $users[$row['uid']] = new LazyUser($row['uid'], $userManager, $row['displayname'] ?? null);
                }
                $result->closeCursor();
 
index b2903bcdb26ea68247326cdc07d1d1286c9729f9..bfe985b266e66dfdc78fc21cfa98a7687ed5bb51 100644 (file)
 namespace OC\Group;
 
 use OC\Hooks\PublicEmitter;
+use OC\User\LazyUser;
+use OCP\GroupInterface;
 use OCP\Group\Backend\ICountDisabledInGroup;
 use OCP\Group\Backend\IGetDisplayNameBackend;
 use OCP\Group\Backend\IHideFromCollaborationBackend;
 use OCP\Group\Backend\INamedBackend;
+use OCP\Group\Backend\ISearchableGroupBackend;
 use OCP\Group\Backend\ISetDisplayNameBackend;
 use OCP\Group\Events\BeforeGroupChangedEvent;
 use OCP\Group\Events\GroupChangedEvent;
-use OCP\GroupInterface;
 use OCP\IGroup;
 use OCP\IUser;
 use OCP\IUserManager;
@@ -248,7 +250,15 @@ class Group implements IGroup {
        public function searchUsers(string $search, ?int $limit = null, ?int $offset = null): array {
                $users = [];
                foreach ($this->backends as $backend) {
-                       $users = array_merge($users, $backend->searchInGroup($this->gid, $search, $limit ?? -1, $offset ?? 0));
+                       if ($backend instanceof ISearchableGroupBackend) {
+                               $users = array_merge($users, $backend->searchInGroup($this->gid, $search, $limit ?? -1, $offset ?? 0));
+                       } else {
+                               $userIds = $backend->usersInGroup($this->gid, $search, $limit ?? -1, $offset ?? 0);
+                               $userManager = \OCP\Server::get(IUserManager::class);
+                               $users = array_merge($users, array_map(function (string $userId) use ($userManager): IUser {
+                                       return new LazyUser($userId, $userManager);
+                               }, $userIds));
+                       }
                        if (!is_null($limit) and $limit <= 0) {
                                return $users;
                        }
@@ -303,18 +313,11 @@ class Group implements IGroup {
         * @param string $search
         * @param int $limit
         * @param int $offset
-        * @return \OC\User\User[]
+        * @return IUser[]
         * @deprecated 25.0.0 Use searchUsers instead (same implementation)
         */
        public function searchDisplayName($search, $limit = null, $offset = null) {
-               $users = [];
-               foreach ($this->backends as $backend) {
-                       $users = array_merge($users, $backend->searchInGroup($this->gid, $search, $limit ?? -1, $offset ?? 0));
-                       if (!is_null($limit) and $limit <= 0) {
-                               return array_values($users);
-                       }
-               }
-               return array_values($users);
+               return $this->searchUsers($search, $limit, $offset);
        }
 
        /**
index c36ff86eff4e7fb7a76281fa194f7dc4ed872b0e..5472cf6f2b48d31335ae8d03854735d626937427 100644 (file)
@@ -65,7 +65,7 @@ class LazyUser implements IUser {
                        return $this->displayName;
                }
 
-               return $this->userManager->getDisplayName($this->uid);
+               return $this->userManager->getDisplayName($this->uid) ?? $this->uid;
        }
 
        public function setDisplayName($displayName) {
index c3275934a5af918245ba68cdba8a6b6a1ed09193..dcf9bbab2f3a53368f10db498e8fbe32044bfe49 100644 (file)
@@ -303,12 +303,11 @@ class Manager extends PublicEmitter implements IUserManager {
         */
        public function search($pattern, $limit = null, $offset = null) {
                $users = [];
-               $displayNameCache = \OCP\Server::get(DisplayNameCache::class);
                foreach ($this->backends as $backend) {
                        $backendUsers = $backend->getUsers($pattern, $limit, $offset);
                        if (is_array($backendUsers)) {
                                foreach ($backendUsers as $uid) {
-                                       $users[$uid] = new LazyUser($uid, $displayNameCache, $this, null, $backend);
+                                       $users[$uid] = new LazyUser($uid, $this, null, $backend);
                                }
                        }
                }
@@ -329,12 +328,11 @@ class Manager extends PublicEmitter implements IUserManager {
         */
        public function searchDisplayName($pattern, $limit = null, $offset = null) {
                $users = [];
-               $displayNameCache = \OCP\Server::get(DisplayNameCache::class);
                foreach ($this->backends as $backend) {
                        $backendUsers = $backend->getDisplayNames($pattern, $limit, $offset);
                        if (is_array($backendUsers)) {
                                foreach ($backendUsers as $uid => $displayName) {
-                                       $users[] = new LazyUser($uid, $displayNameCache, $this, $displayName, $backend);
+                                       $users[] = new LazyUser($uid, $this, $displayName, $backend);
                                }
                        }
                }
index e76285dfda9b6f3930c5615bdb90af8f3277c838..ee1b62c887bd7b2f18bbcc26c780e8f937fa3e87 100644 (file)
@@ -29,12 +29,11 @@ use OCP\GroupInterface;
 use OCP\IUserManager;
 use OCP\Server;
 use OC\User\LazyUser;
-use OC\User\DisplayNameCache;
 
 /**
  * @since 14.0.0
  */
-abstract class ABackend implements GroupInterface {
+abstract class ABackend implements GroupInterface, ISearchableGroupBackend {
        /**
         * @deprecated 14.0.0
         * @since 14.0.0
@@ -72,11 +71,10 @@ abstract class ABackend implements GroupInterface {
 
        public function searchInGroup(string $gid, string $search = '', int $limit = -1, int $offset = 0): array {
                // Default implementation for compatibility reasons
-               $displayNameCache = Server::get(DisplayNameCache::class);
                $userManager = Server::get(IUserManager::class);
                $users = [];
                foreach ($this->usersInGroup($gid, $search, $limit, $offset) as $userId) {
-                       $users[$userId] = new LazyUser($userId, $displayNameCache, $userManager);
+                       $users[$userId] = new LazyUser($userId, $userManager);
                }
                return $users;
        }
diff --git a/lib/public/Group/Backend/ISearchableGroupBackend.php b/lib/public/Group/Backend/ISearchableGroupBackend.php
new file mode 100644 (file)
index 0000000..4e03680
--- /dev/null
@@ -0,0 +1,52 @@
+<?php
+
+declare(strict_types=1);
+
+/**
+ * @copyright Copyright (c) 2022 Carl Schwan <carl@carlschwan.eu>
+ *
+ * @license GNU AGPL version 3 or any later version
+ *
+ * This program is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU Affero General Public License as
+ * published by the Free Software Foundation, either version 3 of the
+ * License, or (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU Affero General Public License for more details.
+ *
+ * You should have received a copy of the GNU Affero General Public License
+ * along with this program. If not, see <http://www.gnu.org/licenses/>.
+ *
+ */
+namespace OCP\Group\Backend;
+
+use OCP\IUser;
+
+/**
+ * @since 26.0.0
+ */
+interface ISearchableGroupBackend {
+
+       /**
+        * @brief Get a list of users matching the given search parameters.
+        *
+        * Implementations of this method should return lazy evaluated user objects and
+        * preload if possible the display name.
+        *
+        * <code>
+        * $users = $groupBackend->searchInGroup('admin', 'John', 10, 0);
+        * </code>
+        *
+        * @param string $gid    The group id of the user we want to search
+        * @param string $search The part of the display name or user id of the users we
+        *                       want to search. This can be empty to get all the users.
+        * @param int $limit     The limit of results
+        * @param int $offset    The offset of the results
+        * @return IUser[]
+        * @since 26.0.0
+        */
+       public function searchInGroup(string $gid, string $search = '', int $limit = -1, int $offset = 0): array;
+}
index 07fd5cb50c46754fef793f7930454e58f170bcdc..7a3c396054170cc035e6829f58412503e8360970 100644 (file)
@@ -114,27 +114,7 @@ interface GroupInterface {
         * @param int $offset
         * @return array an array of user ids
         * @since 4.5.0
-        * @deprecated 25.0.0 Use searchInGroup instead, for performance reasons
+        * @deprecated 26.0.0 Use searchInGroup instead, for performance reasons
         */
        public function usersInGroup($gid, $search = '', $limit = -1, $offset = 0);
-
-       /**
-        * @brief Get a list of users matching the given search parameters.
-        *
-        * Implementations of this method should return lazy evaluated user objects and
-        * preload if possible the display name.
-        *
-        * <code>
-        * $users = $groupBackend->searchInGroup('admin', 'John', 10, 0);
-        * </code>
-        *
-        * @param string $gid    The group id of the user we want to search
-        * @param string $search The part of the display name or user id of the users we
-        *                       want to search. This can be empty to get all the users.
-        * @param int $limit     The limit of results
-        * @param int $offset    The offset of the results
-        * @return IUser[]
-        * @since 25.0.0
-        */
-       public function searchInGroup(string $gid, string $search = '', int $limit = -1, int $offset = 0): array;
 }