Skip to content

Commit 9f5358a

Browse files
committed
feat(UserPlugin): Include teams in group search
1 parent 4d00f49 commit 9f5358a

5 files changed

Lines changed: 50 additions & 10 deletions

File tree

core/Controller/ContactsMenuController.php

Lines changed: 2 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -37,12 +37,10 @@ public function __construct(
3737
public function index(?string $filter = null, ?string $teamId = null): array {
3838
$entries = $this->manager->getEntries($this->userSession->getUser(), $filter);
3939
if ($teamId !== null) {
40-
/** @var \OC\Teams\TeamManager */
41-
$teamManager = $this->teamManager;
42-
$memberIds = $teamManager->getMembersOfTeam($teamId, $this->userSession->getUser()->getUID());
40+
$memberIds = $this->teamManager->getMembersOfTeam($teamId, $this->userSession->getUser()->getUID());
4341
$entries['contacts'] = array_filter(
4442
$entries['contacts'],
45-
fn (IEntry $entry) => in_array($entry->getProperty('UID'), $memberIds, true)
43+
fn (IEntry $entry) => array_key_exists($entry->getProperty('UID'), $memberIds)
4644
);
4745
}
4846
return $entries;

lib/private/Collaboration/Collaborators/UserPlugin.php

Lines changed: 20 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -9,6 +9,7 @@
99

1010
use OCP\Collaboration\Collaborators\ISearchPlugin;
1111
use OCP\Collaboration\Collaborators\ISearchResult;
12+
use OCP\Teams\ITeamManager;
1213
use OCP\Collaboration\Collaborators\SearchResultType;
1314
use OCP\DB\QueryBuilder\IQueryBuilder;
1415
use OCP\IAppConfig;
@@ -26,6 +27,7 @@ public function __construct(
2627
private IAppConfig $appConfig,
2728
private IUserManager $userManager,
2829
private IGroupManager $groupManager,
30+
private ITeamManager $teamManager,
2931
private IUserSession $userSession,
3032
private IUserStatusManager $userStatusManager,
3133
private IDBConnection $connection,
@@ -67,6 +69,23 @@ public function search($search, $limit, $offset, ISearchResult $searchResult): b
6769
}
6870
}
6971
}
72+
73+
// If teams are enabled, also search in them
74+
if ($this->teamManager->hasTeamSupport()) {
75+
$teams = $this->teamManager->getTeamsForUser($currentUser->getUID());
76+
foreach ($teams as $team) {
77+
$usersInTeam = $this->teamManager->getMembersOfTeam($team->getId(), $currentUser->getUID());
78+
foreach ($usersInTeam as $userId => $displayName) {
79+
if (!str_contains($userId, $search) && !str_contains($displayName, $search)) {
80+
continue;
81+
}
82+
$user = $this->userManager->get($userId);
83+
if ($user !== null && $user->isEnabled()) {
84+
$users[$userId] = ['wide', $user];
85+
}
86+
}
87+
}
88+
}
7089
}
7190

7291
if ($shareeEnumerationRestrictToPhone) {
@@ -77,6 +96,7 @@ public function search($search, $limit, $offset, ISearchResult $searchResult): b
7796
}
7897
}
7998
}
99+
80100
}
81101
}
82102

lib/private/Teams/TeamManager.php

Lines changed: 8 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -133,15 +133,21 @@ private function getTeam(string $teamId, string $userId): ?Circle {
133133
}
134134

135135
/**
136-
* @return string[]
136+
* Returns a mapping of user id to display name for all members of a given team.
137+
*
138+
* @return array<string, string> userId => displayName
137139
*/
138140
public function getMembersOfTeam(string $teamId, string $userId): array {
139141
$team = $this->getTeam($teamId, $userId);
140142
if ($team === null) {
141143
return [];
142144
}
143145
$members = $team->getInheritedMembers();
144-
return array_map(fn ($member) => $member->getUserId(), $members);
146+
$result = [];
147+
foreach ($members as $member) {
148+
$result[$member->getUserId()] = $member->getDisplayName();
149+
}
150+
return $result;
145151
}
146152

147153
/**

lib/public/Teams/ITeamManager.php

Lines changed: 16 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -56,4 +56,20 @@ public function getSharedWithList(array $teams, string $userId): array;
5656
* @since 33.0.0
5757
*/
5858
public function getTeamsForUser(string $userId): array;
59+
60+
/**
61+
* Returns a mapping of user id to display name for all members of a given team.
62+
*
63+
* @return array<string, string> userId => displayName
64+
* @since 34.0.0
65+
*/
66+
public function getMembersOfTeam(string $teamId, string $userId): array;
67+
68+
/**
69+
* Returns whether the Teams backend is available
70+
*
71+
* @return bool
72+
* @since 34.0.0
73+
*/
74+
public function hasTeamSupport(): bool;
5975
}

tests/Core/Controller/ContactsMenuControllerTest.php

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -9,18 +9,18 @@
99

1010
use OC\Contacts\ContactsMenu\Manager;
1111
use OC\Core\Controller\ContactsMenuController;
12-
use OC\Teams\TeamManager;
1312
use OCP\Contacts\ContactsMenu\IEntry;
1413
use OCP\IRequest;
1514
use OCP\IUser;
1615
use OCP\IUserSession;
16+
use OCP\Teams\ITeamManager;
1717
use PHPUnit\Framework\MockObject\MockObject;
1818
use Test\TestCase;
1919

2020
class ContactsMenuControllerTest extends TestCase {
2121
private IUserSession&MockObject $userSession;
2222
private Manager&MockObject $contactsManager;
23-
private TeamManager&MockObject $teamManager;
23+
private ITeamManager&MockObject $teamManager;
2424

2525
private ContactsMenuController $controller;
2626

@@ -30,7 +30,7 @@ protected function setUp(): void {
3030
$request = $this->createMock(IRequest::class);
3131
$this->userSession = $this->createMock(IUserSession::class);
3232
$this->contactsManager = $this->createMock(Manager::class);
33-
$this->teamManager = $this->createMock(TeamManager::class);
33+
$this->teamManager = $this->createMock(ITeamManager::class);
3434

3535
$this->controller = new ContactsMenuController(
3636
$request,
@@ -86,7 +86,7 @@ public function testIndex_withTeam(): void {
8686
$this->teamManager->expects($this->once())
8787
->method('getMembersOfTeam')
8888
->with('team-id', 'current-user')
89-
->willReturn(['member1', 'member3']);
89+
->willReturn(['member1' => 'Member 1', 'member3' => 'Member 3']);
9090

9191
$response = $this->controller->index(teamId: 'team-id');
9292

0 commit comments

Comments
 (0)