%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/RemoteUpstreamService.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 OCA\Circles\Db\EventWrapperRequest;
use OCA\Circles\Exceptions\FederatedItemException;
use OCA\Circles\Exceptions\OwnerNotFoundException;
use OCA\Circles\Exceptions\RemoteInstanceException;
use OCA\Circles\Exceptions\RemoteNotFoundException;
use OCA\Circles\Exceptions\RemoteResourceNotFoundException;
use OCA\Circles\Exceptions\UnknownRemoteException;
use OCA\Circles\Model\Federated\EventWrapper;
use OCA\Circles\Model\Federated\FederatedEvent;
use OCA\Circles\Model\Federated\RemoteInstance;
use OCA\Circles\Tools\Model\Request;
use OCA\Circles\Tools\Model\SimpleDataStore;
use OCA\Circles\Tools\Traits\TNCRequest;
/**
* Class RemoteUpstreamService
*
* @package OCA\Circles\Service
*/
class RemoteUpstreamService {
use TNCRequest;
/** @var EventWrapperRequest */
private $eventWrapperRequest;
/** @var RemoteStreamService */
private $remoteStreamService;
/** @var InterfaceService */
private $interfaceService;
/** @var ConfigService */
private $configService;
/**
* RemoteUpstreamService constructor.
*
* @param EventWrapperRequest $eventWrapperRequest
* @param RemoteStreamService $remoteStreamService
* @param InterfaceService $interfaceService
* @param ConfigService $configService
*/
public function __construct(
EventWrapperRequest $eventWrapperRequest,
RemoteStreamService $remoteStreamService,
InterfaceService $interfaceService,
ConfigService $configService
) {
$this->eventWrapperRequest = $eventWrapperRequest;
$this->remoteStreamService = $remoteStreamService;
$this->interfaceService = $interfaceService;
$this->configService = $configService;
}
/**
* @param string $token
*
* @return EventWrapper[]
*/
public function getEventsByToken(string $token): array {
return $this->eventWrapperRequest->getByToken($token);
}
/**
* @param EventWrapper $wrapper
*
* @throws FederatedItemException
* @throws RemoteInstanceException
* @throws RemoteNotFoundException
* @throws RemoteResourceNotFoundException
* @throws UnknownRemoteException
*/
public function broadcastEvent(EventWrapper $wrapper): void {
$event = clone $wrapper->getEvent();
$event->resetInternal();
$this->interfaceService->setCurrentInterface($wrapper->getInterface());
$data = $this->remoteStreamService->resultRequestRemoteInstance(
$wrapper->getInstance(),
RemoteInstance::INCOMING,
Request::TYPE_POST,
$event
);
$wrapper->getEvent()->setResult(new SimpleDataStore($data));
}
/**
* @param FederatedEvent $event
*
* @throws FederatedItemException
* @throws OwnerNotFoundException
* @throws RemoteInstanceException
* @throws RemoteNotFoundException
* @throws RemoteResourceNotFoundException
* @throws UnknownRemoteException
*/
public function confirmEvent(FederatedEvent $event): void {
$instance = $event->getCircle()->getInstance();
$data = $this->remoteStreamService->resultRequestRemoteInstance(
$instance,
RemoteInstance::EVENT,
Request::TYPE_POST,
$event
);
$event->setOutcome($data);
}
//
//
//
// /**
// * @param array $sync
// *
// * @throws GSStatusException
// */
// public function synchronize(array $sync) {
// $this->configService->getGSStatus();
//
// $this->synchronizeCircles($sync);
// $this->removeDeprecatedCircles();
// $this->removeDeprecatedEvents();
// }
// /**
// * @param array $circles
// */
// public function synchronizeCircles(array $circles): void {
// $event = new GSEvent(GSEvent::GLOBAL_SYNC, true);
// $event->setSource($this->configService->getLocalInstance());
// $event->setData(new SimpleDataStore($circles));
//
// foreach ($this->federatedEventService->getInstances() as $instance) {
// try {
// $this->broadcastEvent($event, $instance);
// } catch (RequestContentException | RequestNetworkException | RequestResultSizeException | RequestServerException | RequestResultNotJsonException $e) {
// }
// }
// }
//
//
// /**
// *
// */
// private function removeDeprecatedCircles() {
// $knownCircles = $this->circlesRequest->forceGetCircles();
// foreach ($knownCircles as $knownItem) {
// if ($knownItem->getOwner()
// ->getInstance() === '') {
// continue;
// }
//
// try {
// $this->checkCircle($knownItem);
// } catch (GSStatusException $e) {
// }
// }
// }
//
//
// /**
// * @param DeprecatedCircle $circle
// *
// * @throws GSStatusException
// */
// private function checkCircle(DeprecatedCircle $circle): void {
// $status = $this->confirmCircleStatus($circle);
//
// if (!$status) {
// $this->circlesRequest->destroyCircle($circle->getUniqueId());
// $this->membersRequest->removeAllFromCircle($circle->getUniqueId());
// }
// }
//
//
// /**
// * @param DeprecatedCircle $circle
// *
// * @return bool
// * @throws GSStatusException
// */
// public function confirmCircleStatus(DeprecatedCircle $circle): bool {
// $event = new GSEvent(GSEvent::CIRCLE_STATUS, true);
// $event->setSource($this->configService->getLocalInstance());
// $event->setDeprecatedCircle($circle);
//
// $this->signEvent($event);
//
// $path = $this->urlGenerator->linkToRoute('circles.EventWrapper.status');
// $request = new NC22Request($path, Request::TYPE_POST);
// $this->configService->configureRequest($request);
// $request->setDataSerialize($event);
//
// $requestIssue = false;
// $notFound = false;
// $foundWithNoOwner = false;
// foreach ($this->federatedEventService->getInstances() as $instance) {
// $request->setHost($instance);
//
// try {
// $result = $this->retrieveJson($request);
// if ($this->getInt('status', $result, 0) !== 1) {
// throw new RequestContentException('result status is not good');
// }
//
// $status = $this->getInt('success.data.status', $result);
//
// // if error, we assume the circle might still exist.
// if ($status === CircleStatus::STATUS_ERROR) {
// return true;
// }
//
// if ($status === CircleStatus::STATUS_OK) {
// return true;
// }
//
// // TODO: check the data.supposedOwner entry.
// if ($status === CircleStatus::STATUS_NOT_OWNER) {
// $foundWithNoOwner = true;
// }
//
// if ($status === CircleStatus::STATUS_NOT_FOUND) {
// $notFound = true;
// }
//
// } catch (RequestContentException
// | RequestNetworkException
// | RequestResultNotJsonException
// | RequestResultSizeException
// | RequestServerException $e) {
// $requestIssue = true;
// // TODO: log instances that have network issue, after too many tries (7d), remove this circle.
// continue;
// }
// }
//
// // if no request issue, we can imagine that the instance that owns the circle is down.
// // We'll wait for more information (cf request exceptions management);
// if ($requestIssue) {
// return true;
// }
//
// // circle were not found in any other instances, we can easily says that the circle does not exists anymore
// if ($notFound && !$foundWithNoOwner) {
// return false;
// }
//
// // circle were found everywhere but with no owner on every instance. we need to assign a new owner.
// // This should be done by checking admin rights. if no admin rights, let's assume that circle should be removed.
// if (!$notFound && $foundWithNoOwner) {
// // TODO: assign a new owner and check that when changing owner, we do check that the destination instance is updated FOR SURE!
// return true;
// }
//
// // some instances returned notFound, some returned circle with no owner. let's assume the circle is deprecated.
// return false;
// }
//
// /**
// * @throws GSStatusException
// */
// public function syncEvents() {
//
// }
//
// /**
// *
// */
// private function removeDeprecatedEvents() {
//// $this->deprecatedEvents();
//
// }
}