aboutsummaryrefslogtreecommitdiffstats
path: root/lib/private/Teams/TeamManager.php
diff options
context:
space:
mode:
Diffstat (limited to 'lib/private/Teams/TeamManager.php')
-rw-r--r--lib/private/Teams/TeamManager.php120
1 files changed, 120 insertions, 0 deletions
diff --git a/lib/private/Teams/TeamManager.php b/lib/private/Teams/TeamManager.php
new file mode 100644
index 00000000000..13d6cc459a9
--- /dev/null
+++ b/lib/private/Teams/TeamManager.php
@@ -0,0 +1,120 @@
+<?php
+
+/**
+ * SPDX-FileCopyrightText: 2024 Nextcloud GmbH and Nextcloud contributors
+ * SPDX-License-Identifier: AGPL-3.0-or-later
+ */
+
+namespace OC\Teams;
+
+use OC\AppFramework\Bootstrap\Coordinator;
+use OCA\Circles\CirclesManager;
+use OCA\Circles\Exceptions\CircleNotFoundException;
+use OCA\Circles\Model\Circle;
+use OCA\Circles\Model\Member;
+use OCP\IURLGenerator;
+use OCP\Server;
+use OCP\Teams\ITeamManager;
+use OCP\Teams\ITeamResourceProvider;
+use OCP\Teams\Team;
+use Psr\Container\ContainerExceptionInterface;
+use Psr\Container\NotFoundExceptionInterface;
+
+class TeamManager implements ITeamManager {
+
+ /** @var ?ITeamResourceProvider[] */
+ private ?array $providers = null;
+
+ public function __construct(
+ private Coordinator $bootContext,
+ private IURLGenerator $urlGenerator,
+ private ?CirclesManager $circlesManager,
+ ) {
+ }
+
+ public function hasTeamSupport(): bool {
+ return $this->circlesManager !== null;
+ }
+
+ public function getProviders(): array {
+ if (!$this->hasTeamSupport()) {
+ return [];
+ }
+
+ if ($this->providers !== null) {
+ return $this->providers;
+ }
+
+ $this->providers = [];
+ foreach ($this->bootContext->getRegistrationContext()->getTeamResourceProviders() as $providerRegistration) {
+ try {
+ /** @var ITeamResourceProvider $provider */
+ $provider = Server::get($providerRegistration->getService());
+ $this->providers[$provider->getId()] = $provider;
+ } catch (NotFoundExceptionInterface|ContainerExceptionInterface $e) {
+ }
+ }
+ return $this->providers;
+ }
+
+ public function getProvider(string $providerId): ITeamResourceProvider {
+ $providers = $this->getProviders();
+ if (isset($providers[$providerId])) {
+ return $providers[$providerId];
+ }
+
+ throw new \RuntimeException('No provider found for id ' . $providerId);
+ }
+
+ public function getSharedWith(string $teamId, string $userId): array {
+ if (!$this->hasTeamSupport()) {
+ return [];
+ }
+
+ if ($this->getTeam($teamId, $userId) === null) {
+ return [];
+ }
+
+ $resources = [];
+
+ foreach ($this->getProviders() as $provider) {
+ array_push($resources, ...$provider->getSharedWith($teamId));
+ }
+
+ return array_values($resources);
+ }
+
+ public function getTeamsForResource(string $providerId, string $resourceId, string $userId): array {
+ if (!$this->hasTeamSupport()) {
+ return [];
+ }
+
+ $provider = $this->getProvider($providerId);
+ return array_values(array_filter(array_map(function ($teamId) use ($userId) {
+ $team = $this->getTeam($teamId, $userId);
+ if ($team === null) {
+ return null;
+ }
+
+ return new Team(
+ $teamId,
+ $team->getDisplayName(),
+ $this->urlGenerator->linkToRouteAbsolute('contacts.contacts.directcircle', ['singleId' => $teamId]),
+ );
+ }, $provider->getTeamsForResource($resourceId))));
+ }
+
+ private function getTeam(string $teamId, string $userId): ?Circle {
+ if (!$this->hasTeamSupport()) {
+ return null;
+ }
+
+ try {
+ $federatedUser = $this->circlesManager->getFederatedUser($userId, Member::TYPE_USER);
+ $this->circlesManager->startSession($federatedUser);
+ return $this->circlesManager->getCircle($teamId);
+ } catch (CircleNotFoundException) {
+ return null;
+ }
+ }
+}