4040use OCP \Group \Backend \IGetDisplayNameBackend ;
4141use OCP \Group \Backend \IGroupDetailsBackend ;
4242use OCP \Group \Backend \IRemoveFromGroupBackend ;
43+ use OCP \Group \Backend \ISearchableGroupBackend ;
4344use OCP \Group \Backend \ISetDisplayNameBackend ;
4445use OCP \Group \Backend \INamedBackend ;
4546use OCP \IDBConnection ;
47+ use OCP \IUserManager ;
48+ use OC \User \LazyUser ;
4649
4750/**
4851 * Class for group management in a SQL Database (e.g. MySQL, SQLite)
@@ -57,6 +60,7 @@ class Database extends ABackend implements
5760 IGroupDetailsBackend,
5861 IRemoveFromGroupBackend,
5962 ISetDisplayNameBackend,
63+ ISearchableGroupBackend,
6064 INamedBackend {
6165 /** @var string[] */
6266 private $ groupCache = [];
@@ -324,29 +328,35 @@ public function groupExists($gid) {
324328 }
325329
326330 /**
327- * get a list of all users in a group
331+ * Get a list of all users in a group
328332 * @param string $gid
329333 * @param string $search
330334 * @param int $limit
331335 * @param int $offset
332- * @return array an array of user ids
336+ * @return array<int,string> an array of user ids
333337 */
334- public function usersInGroup ($ gid , $ search = '' , $ limit = -1 , $ offset = 0 ) {
338+ public function usersInGroup ($ gid , $ search = '' , $ limit = -1 , $ offset = 0 ): array {
339+ return array_values (array_map (fn ($ user ) => $ user ->getUid (), $ this ->searchInGroup ($ gid , $ search , $ limit , $ offset )));
340+ }
341+
342+ public function searchInGroup (string $ gid , string $ search = '' , int $ limit = -1 , int $ offset = 0 ): array {
335343 $ this ->fixDI ();
336344
337345 $ query = $ this ->dbConn ->getQueryBuilder ();
338- $ query ->select ('g.uid ' )
339- ->from ('group_user ' , 'g ' )
346+ $ query ->select ('g.uid ' , 'u.displayname ' );
347+
348+ $ query ->from ('group_user ' , 'g ' )
340349 ->where ($ query ->expr ()->eq ('gid ' , $ query ->createNamedParameter ($ gid )))
341350 ->orderBy ('g.uid ' , 'ASC ' );
342351
352+ $ query ->leftJoin ('g ' , 'users ' , 'u ' , $ query ->expr ()->eq ('g.uid ' , 'u.uid ' ));
353+
343354 if ($ search !== '' ) {
344- $ query ->leftJoin ('g ' , 'users ' , 'u ' , $ query ->expr ()->eq ('g.uid ' , 'u.uid ' ))
345- ->leftJoin ('u ' , 'preferences ' , 'p ' , $ query ->expr ()->andX (
346- $ query ->expr ()->eq ('p.userid ' , 'u.uid ' ),
347- $ query ->expr ()->eq ('p.appid ' , $ query ->expr ()->literal ('settings ' )),
348- $ query ->expr ()->eq ('p.configkey ' , $ query ->expr ()->literal ('email ' )))
349- )
355+ $ query ->leftJoin ('u ' , 'preferences ' , 'p ' , $ query ->expr ()->andX (
356+ $ query ->expr ()->eq ('p.userid ' , 'u.uid ' ),
357+ $ query ->expr ()->eq ('p.appid ' , $ query ->expr ()->literal ('settings ' )),
358+ $ query ->expr ()->eq ('p.configkey ' , $ query ->expr ()->literal ('email ' ))
359+ ))
350360 // sqlite doesn't like re-using a single named parameter here
351361 ->andWhere (
352362 $ query ->expr ()->orX (
@@ -365,11 +375,12 @@ public function usersInGroup($gid, $search = '', $limit = -1, $offset = 0) {
365375 $ query ->setFirstResult ($ offset );
366376 }
367377
368- $ result = $ query ->execute ();
378+ $ result = $ query ->executeQuery ();
369379
370380 $ users = [];
381+ $ userManager = \OCP \Server::get (IUserManager::class);
371382 while ($ row = $ result ->fetch ()) {
372- $ users [] = $ row ['uid ' ];
383+ $ users [$ row [ ' uid ' ]] = new LazyUser ( $ row ['uid ' ], $ userManager , $ row [ ' displayname ' ] ?? null ) ;
373384 }
374385 $ result ->closeCursor ();
375386
0 commit comments