From 59ee6035aa27d2f7b1b9de9eb14ee3e21152f45c Mon Sep 17 00:00:00 2001 From: Stefan Lender Date: Wed, 14 Oct 2026 15:43:13 +0200 Subject: [PATCH] feat(TeamSpaceProvider): expose group folder activity scopes Co-authored-by: Copilot GPT-6.1 Sol Signed-off-by: Stefan Lender --- lib/TeamSpace/TeamSpaceProvider.php | 21 ++++++++++++++++++++- lib/TeamSpace/TeamSpaceService.php | 18 +++++++++++++++++- tests/TeamSpace/TeamSpaceProviderTest.php | 20 ++++++++++++++++++++ 3 files changed, 57 insertions(+), 2 deletions(-) diff --git a/lib/TeamSpace/TeamSpaceProvider.php b/lib/TeamSpace/TeamSpaceProvider.php index dc81b9323..914ec17c3 100644 --- a/lib/TeamSpace/TeamSpaceProvider.php +++ b/lib/TeamSpace/TeamSpaceProvider.php @@ -11,12 +11,14 @@ use OCP\IL10N; use OCP\IURLGenerator; +use OCP\Teams\ITeamActivityResourceProvider; use OCP\Teams\ITeamFolderProvider; use OCP\Teams\Team; +use OCP\Teams\TeamActivityScope; use OCP\Teams\TeamFolder; use OCP\Teams\TeamResource; -class TeamSpaceProvider implements ITeamFolderProvider { +class TeamSpaceProvider implements ITeamFolderProvider, ITeamActivityResourceProvider { public function __construct( private readonly TeamSpaceService $service, private readonly IL10N $l10n, @@ -120,6 +122,23 @@ public function getSharedWith(string $teamId): array { }, $this->service->getGroupFoldersForCircle($teamId)); } + /** + * @param list $resources + * @return list + */ + #[\Override] + public function getActivityScopes(array $resources, string $userId): array { + $folderIds = []; + foreach ($resources as $resource) { + if (ctype_digit($resource->getId())) { + $folderIds[] = (int)$resource->getId(); + } + } + + $rootFileIds = $this->service->getRootFileIds(array_values(array_unique($folderIds))); + return $rootFileIds === [] ? [] : [new TeamActivityScope('files', $rootFileIds)]; + } + #[\Override] public function isSharedWithTeam(string $teamId, string $resourceId): bool { foreach ($this->service->getGroupFoldersForCircle($teamId) as $folder) { diff --git a/lib/TeamSpace/TeamSpaceService.php b/lib/TeamSpace/TeamSpaceService.php index ed8d8c9fb..6026d4ecf 100644 --- a/lib/TeamSpace/TeamSpaceService.php +++ b/lib/TeamSpace/TeamSpaceService.php @@ -233,7 +233,7 @@ public function getTeamSpaceForCircle(string $circleId): ?TeamFolder { $this->createAppDirectory($folderId); - return new TeamFolder($folder->id, $folder->mountPoint, $folder->quota); + return new TeamFolder($folder->id, $folder->mountPoint, $folder->quota, $folder->rootId); } /** @@ -275,6 +275,22 @@ public function getGroupFoldersForCircle(string $circleId): array { ); } + /** + * @param list $folderIds + * @return list + */ + public function getRootFileIds(array $folderIds): array { + $rootFileIds = []; + foreach ($folderIds as $folderId) { + $folder = $this->folderManager->getFolder($folderId); + if ($folder !== null && $folder->rootId > 0) { + $rootFileIds[] = $folder->rootId; + } + } + + return array_values(array_unique($rootFileIds)); + } + /** * Return existing folders directly available to a team that have not been * made an exclusive team folder for another team. diff --git a/tests/TeamSpace/TeamSpaceProviderTest.php b/tests/TeamSpace/TeamSpaceProviderTest.php index b02da2256..0caa79a41 100644 --- a/tests/TeamSpace/TeamSpaceProviderTest.php +++ b/tests/TeamSpace/TeamSpaceProviderTest.php @@ -13,7 +13,9 @@ use OCA\GroupFolders\TeamSpace\TeamSpaceService; use OCP\IL10N; use OCP\IURLGenerator; +use OCP\Teams\TeamActivityScope; use OCP\Teams\TeamFolder; +use OCP\Teams\TeamResource; use PHPUnit\Framework\MockObject\MockObject; use Test\TestCase; @@ -65,6 +67,24 @@ public function testGetSharedWithReturnsAllFoldersAssignedToTeam(): void { $this->assertSame('https://cloud.example/apps/files/?dir=/Shared%20projects', $resources[1]->getUrl()); } + public function testGetActivityScopesReturnsGroupFolderRoots(): void { + $resources = [ + new TeamResource($this->provider, '42', 'Engineering', 'https://cloud.example/engineering'), + new TeamResource($this->provider, '43', 'Shared projects', 'https://cloud.example/projects'), + ]; + $this->service->expects($this->once()) + ->method('getRootFileIds') + ->with([42, 43]) + ->willReturn([420, 430]); + + $scopes = $this->provider->getActivityScopes($resources, 'alice'); + + $this->assertCount(1, $scopes); + $this->assertInstanceOf(TeamActivityScope::class, $scopes[0]); + $this->assertSame('files', $scopes[0]->getObjectType()); + $this->assertSame([420, 430], $scopes[0]->getObjectIds()); + } + public function testGetLinkableTeamFoldersDelegatesToService(): void { $folders = [new TeamFolder(42, 'Engineering')]; $this->service->expects($this->once())