diff --git a/core/Controller/ContactsMenuController.php b/core/Controller/ContactsMenuController.php index b3cb7de78816c..1e81fb7d07ed2 100644 --- a/core/Controller/ContactsMenuController.php +++ b/core/Controller/ContactsMenuController.php @@ -37,12 +37,10 @@ public function __construct( public function index(?string $filter = null, ?string $teamId = null): array { $entries = $this->manager->getEntries($this->userSession->getUser(), $filter); if ($teamId !== null) { - /** @var \OC\Teams\TeamManager */ - $teamManager = $this->teamManager; - $memberIds = $teamManager->getMembersOfTeam($teamId, $this->userSession->getUser()->getUID()); + $memberIds = $this->teamManager->getMembersOfTeam($teamId, $this->userSession->getUser()->getUID()); $entries['contacts'] = array_filter( $entries['contacts'], - fn (IEntry $entry) => in_array($entry->getProperty('UID'), $memberIds, true) + fn (IEntry $entry) => array_key_exists($entry->getProperty('UID'), $memberIds) ); } return $entries; diff --git a/lib/private/Collaboration/Collaborators/UserPlugin.php b/lib/private/Collaboration/Collaborators/UserPlugin.php index aa9ec26094ffe..e1ea079c2fdee 100644 --- a/lib/private/Collaboration/Collaborators/UserPlugin.php +++ b/lib/private/Collaboration/Collaborators/UserPlugin.php @@ -18,6 +18,7 @@ use OCP\IUserManager; use OCP\IUserSession; use OCP\Share\IShare; +use OCP\Teams\ITeamManager; use OCP\UserStatus\IManager as IUserStatusManager; use OCP\UserStatus\IUserStatus; @@ -26,6 +27,7 @@ public function __construct( private IAppConfig $appConfig, private IUserManager $userManager, private IGroupManager $groupManager, + private ITeamManager $teamManager, private IUserSession $userSession, private IUserStatusManager $userStatusManager, private IDBConnection $connection, @@ -67,6 +69,23 @@ public function search($search, $limit, $offset, ISearchResult $searchResult): b } } } + + // If teams are enabled, also search in them + if ($this->teamManager->hasTeamSupport()) { + $teams = $this->teamManager->getTeamsForUser($currentUser->getUID()); + foreach ($teams as $team) { + $usersInTeam = $this->teamManager->getMembersOfTeam($team->getId(), $currentUser->getUID()); + foreach ($usersInTeam as $userId => $displayName) { + if (!str_contains($userId, $search) && !str_contains($displayName, $search)) { + continue; + } + $user = $this->userManager->get($userId); + if ($user !== null && $user->isEnabled()) { + $users[$userId] = ['wide', $user]; + } + } + } + } } if ($shareeEnumerationRestrictToPhone) { diff --git a/lib/private/Teams/TeamManager.php b/lib/private/Teams/TeamManager.php index 057bc3aab0e93..7023a683a4dd8 100644 --- a/lib/private/Teams/TeamManager.php +++ b/lib/private/Teams/TeamManager.php @@ -133,7 +133,9 @@ private function getTeam(string $teamId, string $userId): ?Circle { } /** - * @return string[] + * Returns a mapping of user id to display name for all members of a given team. + * + * @return array userId => displayName */ public function getMembersOfTeam(string $teamId, string $userId): array { $team = $this->getTeam($teamId, $userId); @@ -141,7 +143,11 @@ public function getMembersOfTeam(string $teamId, string $userId): array { return []; } $members = $team->getInheritedMembers(); - return array_map(fn ($member) => $member->getUserId(), $members); + $result = []; + foreach ($members as $member) { + $result[$member->getUserId()] = $member->getDisplayName(); + } + return $result; } /** diff --git a/lib/public/Teams/ITeamManager.php b/lib/public/Teams/ITeamManager.php index 2a94f44a70f90..607b500027463 100644 --- a/lib/public/Teams/ITeamManager.php +++ b/lib/public/Teams/ITeamManager.php @@ -56,4 +56,20 @@ public function getSharedWithList(array $teams, string $userId): array; * @since 33.0.0 */ public function getTeamsForUser(string $userId): array; + + /** + * Returns a mapping of user id to display name for all members of a given team. + * + * @return array userId => displayName + * @since 34.0.0 + */ + public function getMembersOfTeam(string $teamId, string $userId): array; + + /** + * Returns whether the Teams backend is available + * + * @return bool + * @since 34.0.0 + */ + public function hasTeamSupport(): bool; } diff --git a/tests/Core/Controller/ContactsMenuControllerTest.php b/tests/Core/Controller/ContactsMenuControllerTest.php index a1147aebc227e..6f8bf9ee61005 100644 --- a/tests/Core/Controller/ContactsMenuControllerTest.php +++ b/tests/Core/Controller/ContactsMenuControllerTest.php @@ -9,18 +9,18 @@ use OC\Contacts\ContactsMenu\Manager; use OC\Core\Controller\ContactsMenuController; -use OC\Teams\TeamManager; use OCP\Contacts\ContactsMenu\IEntry; use OCP\IRequest; use OCP\IUser; use OCP\IUserSession; +use OCP\Teams\ITeamManager; use PHPUnit\Framework\MockObject\MockObject; use Test\TestCase; class ContactsMenuControllerTest extends TestCase { private IUserSession&MockObject $userSession; private Manager&MockObject $contactsManager; - private TeamManager&MockObject $teamManager; + private ITeamManager&MockObject $teamManager; private ContactsMenuController $controller; @@ -30,7 +30,7 @@ protected function setUp(): void { $request = $this->createMock(IRequest::class); $this->userSession = $this->createMock(IUserSession::class); $this->contactsManager = $this->createMock(Manager::class); - $this->teamManager = $this->createMock(TeamManager::class); + $this->teamManager = $this->createMock(ITeamManager::class); $this->controller = new ContactsMenuController( $request, @@ -86,7 +86,7 @@ public function testIndex_withTeam(): void { $this->teamManager->expects($this->once()) ->method('getMembersOfTeam') ->with('team-id', 'current-user') - ->willReturn(['member1', 'member3']); + ->willReturn(['member1' => 'Member 1', 'member3' => 'Member 3']); $response = $this->controller->index(teamId: 'team-id');