diff options
Diffstat (limited to 'lib/private/UserStatus/Manager.php')
-rw-r--r-- | lib/private/UserStatus/Manager.php | 100 |
1 files changed, 100 insertions, 0 deletions
diff --git a/lib/private/UserStatus/Manager.php b/lib/private/UserStatus/Manager.php new file mode 100644 index 00000000000..4cfd1c18e79 --- /dev/null +++ b/lib/private/UserStatus/Manager.php @@ -0,0 +1,100 @@ +<?php + +declare(strict_types=1); + +/** + * SPDX-FileCopyrightText: 2020 Nextcloud GmbH and Nextcloud contributors + * SPDX-License-Identifier: AGPL-3.0-or-later + */ +namespace OC\UserStatus; + +use OCP\UserStatus\IManager; +use OCP\UserStatus\IProvider; +use Psr\Container\ContainerExceptionInterface; +use Psr\Container\ContainerInterface; +use Psr\Log\LoggerInterface; + +class Manager implements IManager { + /** @var ?class-string */ + private ?string $providerClass = null; + private ?IProvider $provider = null; + + public function __construct( + private ContainerInterface $container, + private LoggerInterface $logger, + ) { + } + + /** + * @inheritDoc + */ + public function getUserStatuses(array $userIds): array { + $this->setupProvider(); + if (!$this->provider) { + return []; + } + + return $this->provider->getUserStatuses($userIds); + } + + /** + * @param string $class + * @since 20.0.0 + * @internal + */ + public function registerProvider(string $class): void { + $this->providerClass = $class; + $this->provider = null; + } + + /** + * Lazily set up provider + */ + private function setupProvider(): void { + if ($this->provider !== null) { + return; + } + if ($this->providerClass === null) { + return; + } + + /** + * @psalm-suppress InvalidCatch + */ + try { + $provider = $this->container->get($this->providerClass); + } catch (ContainerExceptionInterface $e) { + $this->logger->error('Could not load user-status "' . $this->providerClass . '" provider dynamically: ' . $e->getMessage(), [ + 'exception' => $e, + ]); + return; + } + + $this->provider = $provider; + } + + public function setUserStatus(string $userId, string $messageId, string $status, bool $createBackup = false, ?string $customMessage = null): void { + $this->setupProvider(); + if (!$this->provider instanceof ISettableProvider) { + return; + } + + $this->provider->setUserStatus($userId, $messageId, $status, $createBackup, $customMessage); + } + + public function revertUserStatus(string $userId, string $messageId, string $status): void { + $this->setupProvider(); + if (!$this->provider instanceof ISettableProvider) { + return; + } + $this->provider->revertUserStatus($userId, $messageId, $status); + } + + public function revertMultipleUserStatus(array $userIds, string $messageId, string $status): void { + $this->setupProvider(); + if (!$this->provider instanceof ISettableProvider) { + return; + } + $this->provider->revertMultipleUserStatus($userIds, $messageId, $status); + } +} |