diff --git a/apps/provisioning_api/lib/Controller/AUserDataOCSController.php b/apps/provisioning_api/lib/Controller/AUserDataOCSController.php index 50a883caef18a..bb6e1778ac038 100644 --- a/apps/provisioning_api/lib/Controller/AUserDataOCSController.php +++ b/apps/provisioning_api/lib/Controller/AUserDataOCSController.php @@ -106,11 +106,7 @@ protected function getUserData(string $userId, bool $includeScopes = false): ?ar // Get groups data $userAccount = $this->accountManager->getAccount($targetUserObject); - $groups = $this->groupManager->getUserGroups($targetUserObject); - $gids = []; - foreach ($groups as $group) { - $gids[] = $group->getGID(); - } + $gids = $this->groupManager->getUserGroupIds($targetUserObject); if ($isAdmin || $isDelegatedAdmin) { try { @@ -279,10 +275,13 @@ protected function findGroupsWithDisplayname(array $userDetails): array { $groupIds = array_unique($groupIds); sort($groupIds); - return array_map(function ($groupId) { - $displayname = $this->groupDisplayNameCache->getDisplayName($groupId) ?? $groupId; - return ['id' => $groupId, 'displayname' => $displayname]; - }, $groupIds); + $info = []; + foreach ($this->groupDisplayNameCache->getDisplayNames($groupIds) as $groupId => $displayName) { + if ($displayName !== null) { + $info[] = ['id' => $groupId, 'displayname' => $displayName]; + } + } + return $info; } /** diff --git a/apps/provisioning_api/lib/Controller/UsersController.php b/apps/provisioning_api/lib/Controller/UsersController.php index 543892d673884..370528af6d909 100644 --- a/apps/provisioning_api/lib/Controller/UsersController.php +++ b/apps/provisioning_api/lib/Controller/UsersController.php @@ -1080,8 +1080,7 @@ public function editUserMultiField( } if ($groups !== null) { - $currentGroups = $this->groupManager->getUserGroups($targetUser); - $currentGroupIds = array_map(fn (IGroup $g) => $g->getGID(), $currentGroups); + $currentGroupIds = $this->groupManager->getUserGroupIds($targetUser); foreach (array_diff($currentGroupIds, $groups) as $gid) { $this->groupManager->get($gid)?->removeUser($targetUser); } diff --git a/apps/provisioning_api/tests/Controller/GroupsControllerTest.php b/apps/provisioning_api/tests/Controller/GroupsControllerTest.php index 983fddb3352e3..d463b0aa79f26 100644 --- a/apps/provisioning_api/tests/Controller/GroupsControllerTest.php +++ b/apps/provisioning_api/tests/Controller/GroupsControllerTest.php @@ -483,8 +483,8 @@ public function testGetGroupUsersDetails(): void { ->with($gid) ->willReturn($group); $this->groupManager->expects($this->any()) - ->method('getUserGroups') - ->willReturn([$group]); + ->method('getUserGroupIds') + ->willReturn(['ncg1']); /** @var MockObject */ $this->subAdminManager->expects($this->any()) @@ -538,8 +538,8 @@ public function testGetGroupUsersDetailsEncoded(): void { ->with($gid) ->willReturn($group); $this->groupManager->expects($this->any()) - ->method('getUserGroups') - ->willReturn([$group]); + ->method('getUserGroupIds') + ->willReturn(['Department A/B C/D']); /** @var MockObject */ $this->subAdminManager->expects($this->any()) diff --git a/apps/provisioning_api/tests/Controller/UsersControllerTest.php b/apps/provisioning_api/tests/Controller/UsersControllerTest.php index b1ba3c2cf4e8d..a565199e671b1 100644 --- a/apps/provisioning_api/tests/Controller/UsersControllerTest.php +++ b/apps/provisioning_api/tests/Controller/UsersControllerTest.php @@ -1196,8 +1196,8 @@ public function testGetUserDataAsAdmin(): void { ->willReturn(true); $this->groupManager ->expects($this->any()) - ->method('getUserGroups') - ->willReturn([$group0, $group1, $group2]); + ->method('getUserGroupIds') + ->willReturn(['group0', 'group1', 'group2']); $this->groupManager ->expects($this->once()) ->method('getSubAdmin') @@ -1206,15 +1206,6 @@ public function testGetUserDataAsAdmin(): void { ->expects($this->once()) ->method('getSubAdminsGroups') ->willReturn([$group3]); - $group0->expects($this->exactly(1)) - ->method('getGID') - ->willReturn('group0'); - $group1->expects($this->exactly(1)) - ->method('getGID') - ->willReturn('group1'); - $group2->expects($this->exactly(1)) - ->method('getGID') - ->willReturn('group2'); $group3->expects($this->once()) ->method('getGID') ->willReturn('group3'); @@ -2759,7 +2750,7 @@ public function testUpdateUserGroupDiff(): void { $newGroup = $this->createMock(IGroup::class); $newGroup->method('getGID')->willReturn('newgroup'); - $this->groupManager->method('getUserGroups')->willReturn([$oldGroup]); + $this->groupManager->method('getUserGroupIds')->willReturn(['oldgroup']); $this->groupManager->method('groupExists')->willReturn(true); $this->groupManager->method('get')->willReturnMap([ ['newgroup', $newGroup], diff --git a/lib/private/Group/DisplayNameCache.php b/lib/private/Group/DisplayNameCache.php index 815f74dd9fb03..39e26bcdf2e66 100644 --- a/lib/private/Group/DisplayNameCache.php +++ b/lib/private/Group/DisplayNameCache.php @@ -57,6 +57,44 @@ public function getDisplayName(string $groupId): ?string { return $displayName; } + /** + * @param list $groupIds + * @return array + */ + public function getDisplayNames(array $groupIds): array { + $result = []; + $missing = []; + foreach ($groupIds as $groupId) { + if (isset($this->cache[$groupId])) { + $result[$groupId] = $this->cache[$groupId]; + } else { + $displayName = $this->memCache->get($groupId); + if ($displayName) { + $this->cache[$groupId] = $displayName; + $result[$groupId] = $displayName; + } else { + $missing[] = $groupId; + } + } + } + + /** @var Manager $groupManager */ + $groupManager = $this->groupManager; + $groups = $groupManager->getGroupsObjects($missing); + $stillMissingGroups = array_diff($missing, array_keys($groups)); + foreach ($groups as $groupId => $group) { + $this->cache[$groupId] = $group->getDisplayName(); + $this->memCache->set($groupId, $displayName, 60 * 10); // 10 minutes + $result[$groupId] = $group->getDisplayName(); + } + + foreach ($stillMissingGroups as $groupId) { + $result[$groupId] = null; + } + + return $result; + } + public function clear(): void { $this->cache = new CappedMemoryCache(); $this->memCache->clear(); diff --git a/lib/private/Group/Manager.php b/lib/private/Group/Manager.php index 3ebb229e44b9d..43f08333b2d8f 100644 --- a/lib/private/Group/Manager.php +++ b/lib/private/Group/Manager.php @@ -181,7 +181,7 @@ protected function getGroupObject($gid, $displayName = null) { * @param array $displayNames Array containing already know display name for a groupId * @return array */ - protected function getGroupsObjects(array $gids, array $displayNames = []): array { + public function getGroupsObjects(array $gids, array $displayNames = []): array { $backends = []; $groups = []; foreach ($gids as $gid) {