%PDF- %PDF-
Direktori : /www/varak.net/nextcloud.varak.net/apps_old/apps/circles/lib/Service/ |
Current File : //www/varak.net/nextcloud.varak.net/apps_old/apps/circles/lib/Service/EventWrapperService.php |
<?php declare(strict_types=1); /** * SPDX-FileCopyrightText: 2021 Nextcloud GmbH and Nextcloud contributors * SPDX-License-Identifier: AGPL-3.0-or-later */ namespace OCA\Circles\Service; use Exception; use OCA\Circles\Db\EventWrapperRequest; use OCA\Circles\Model\Federated\EventWrapper; use OCA\Circles\Model\Federated\FederatedEvent; use OCA\Circles\Tools\ActivityPub\NCSignature; use OCA\Circles\Tools\Traits\TNCRequest; use OCA\Circles\Tools\Traits\TStringTools; /** * Class EventWrapperService * * @package OCA\Circles\Service */ class EventWrapperService extends NCSignature { use TNCRequest; use TStringTools; public const RETRY_ASAP = 'asap'; public const RETRY_HOURLY = 'hourly'; public const RETRY_DAILY = 'daily'; public const RETRY_ERROR = 100; public static $RETRIES = [ 'asap' => [0, 5], 'hourly' => [5, 150], 'daily' => [150, 300] ]; /** @var EventWrapperRequest */ private $eventWrapperRequest; /** @var FederatedEventService */ private $federatedEventService; /** @var RemoteUpstreamService */ private $remoteUpstreamService; /** @var ConfigService */ private $configService; /** * EventWrapperService constructor. * * @param EventWrapperRequest $eventWrapperRequest * @param FederatedEventService $federatedEventService * @param RemoteUpstreamService $remoteUpstreamService * @param ConfigService $configService */ public function __construct( EventWrapperRequest $eventWrapperRequest, FederatedEventService $federatedEventService, RemoteUpstreamService $remoteUpstreamService, ConfigService $configService ) { $this->eventWrapperRequest = $eventWrapperRequest; $this->federatedEventService = $federatedEventService; $this->remoteUpstreamService = $remoteUpstreamService; $this->configService = $configService; } /** * @param string $token * @param bool $refresh */ public function confirmStatus(string $token, bool $refresh = false): void { $wrappers = $this->eventWrapperRequest->getByToken($token); foreach ($wrappers as $wrapper) { $status = $wrapper->getStatus(); if ($refresh && ($status === EventWrapper::STATUS_FAILED || $status === EventWrapper::STATUS_INIT)) { $wrapper->setStatus(EventWrapper::STATUS_INIT); $this->eventWrapperRequest->update($wrapper); $status = $this->manageWrapper($wrapper); } if ($status !== EventWrapper::STATUS_DONE) { return; } } $this->federatedEventService->manageResults($token); $this->eventWrapperRequest->updateAll($token, EventWrapper::STATUS_OVER); } /** * @param EventWrapper $wrapper * * @return int */ public function manageWrapper(EventWrapper $wrapper): int { if ($wrapper->getStatus() !== EventWrapper::STATUS_INIT) { return $wrapper->getStatus(); } $status = EventWrapper::STATUS_FAILED; $retry = $wrapper->getRetry(); try { if ($this->configService->isLocalInstance($wrapper->getInstance())) { $gs = $this->federatedEventService->getFederatedItem($wrapper->getEvent(), false); $gs->manage($wrapper->getEvent()); } else { $this->remoteUpstreamService->broadcastEvent($wrapper); } $status = EventWrapper::STATUS_DONE; } catch (Exception $e) { $retry++; } if ($wrapper->getSeverity() !== FederatedEvent::SEVERITY_HIGH) { $status = EventWrapper::STATUS_OVER; } $wrapper->setStatus($status); $wrapper->setRetry($retry); $wrapper->setResult($wrapper->getEvent()->getResult()); $this->eventWrapperRequest->update($wrapper); return $status; } /** * @param string $retry */ public function retry(string $retry) { $tokens = $this->getFailedEvents(self::$RETRIES[$retry]); foreach ($tokens as $token) { $this->confirmStatus($token, true); } } /** * @param array $retryRange * * @return array */ private function getFailedEvents(array $retryRange): array { $token = array_map( function (EventWrapper $event): string { return $event->getToken(); }, $this->eventWrapperRequest->getFailedEvents($retryRange) ); return array_values(array_unique($token)); } }