%PDF- %PDF-
Direktori : /www/varak.net/nextcloud.varak.net/apps_old/apps/circles/lib/Model/ |
Current File : //www/varak.net/nextcloud.varak.net/apps_old/apps/circles/lib/Model/ModelManager.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\Model; use OCA\Circles\AppInfo\Application; use OCA\Circles\Db\CircleRequest; use OCA\Circles\Db\CoreQueryBuilder; use OCA\Circles\Db\MemberRequest; use OCA\Circles\Db\MembershipRequest; use OCA\Circles\Exceptions\CircleNotFoundException; use OCA\Circles\Exceptions\FederatedItemException; use OCA\Circles\Exceptions\FederatedUserNotFoundException; use OCA\Circles\Exceptions\FileCacheNotFoundException; use OCA\Circles\Exceptions\MemberNotFoundException; use OCA\Circles\Exceptions\MembershipNotFoundException; use OCA\Circles\Exceptions\MountPointNotFoundException; use OCA\Circles\Exceptions\OwnerNotFoundException; use OCA\Circles\Exceptions\RemoteInstanceException; use OCA\Circles\Exceptions\RemoteNotFoundException; use OCA\Circles\Exceptions\RemoteResourceNotFoundException; use OCA\Circles\Exceptions\RequestBuilderException; use OCA\Circles\Exceptions\ShareTokenNotFoundException; use OCA\Circles\Exceptions\UnknownInterfaceException; use OCA\Circles\Exceptions\UnknownRemoteException; use OCA\Circles\IEntity; use OCA\Circles\Model\Federated\RemoteInstance; use OCA\Circles\Service\ConfigService; use OCA\Circles\Service\InterfaceService; use OCA\Circles\Service\MembershipService; use OCA\Circles\Service\RemoteService; use OCA\Circles\Tools\Traits\TNCLogger; use OCP\App\IAppManager; use OCP\IURLGenerator; /** * Class ModelManager * * @package OCA\Circles\Model */ class ModelManager { use TNCLogger; private IURLGenerator $urlGenerator; private IAppManager $appManager; private CoreQueryBuilder $coreRequestBuilder; private CircleRequest $circleRequest; private MemberRequest $memberRequest; private MembershipRequest $membershipRequest; private InterfaceService $interfaceService; private MembershipService $membershipService; private RemoteService $remoteService; private ConfigService $configService; private bool $fullDetails = false; private bool $pathLinkGenerated = false; private string $pathLinkGeneration = ''; /** * ModelManager constructor. * * @param IURLGenerator $urlGenerator * @param IAppManager $appManager * @param CoreQueryBuilder $coreRequestBuilder * @param CircleRequest $circleRequest * @param MemberRequest $memberRequest * @param MembershipRequest $membershipRequest * @param InterfaceService $interfaceService * @param MembershipService $membershipService * @param RemoteService $remoteService * @param ConfigService $configService */ public function __construct( IURLGenerator $urlGenerator, IAppManager $appManager, CoreQueryBuilder $coreRequestBuilder, CircleRequest $circleRequest, MemberRequest $memberRequest, MembershipRequest $membershipRequest, InterfaceService $interfaceService, MembershipService $membershipService, RemoteService $remoteService, ConfigService $configService ) { $this->urlGenerator = $urlGenerator; $this->appManager = $appManager; $this->coreRequestBuilder = $coreRequestBuilder; $this->circleRequest = $circleRequest; $this->memberRequest = $memberRequest; $this->membershipRequest = $membershipRequest; $this->interfaceService = $interfaceService; $this->membershipService = $membershipService; $this->remoteService = $remoteService; $this->configService = $configService; $this->setup('app', Application::APP_ID); } /** * @return ConfigService */ public function getConfigService(): ConfigService { return $this->configService; } /** * @param Circle $circle */ public function getMembers(Circle $circle): void { try { $circle->setMembers($this->memberRequest->getMembers($circle->getSingleId())); } catch (RequestBuilderException $e) { // TODO: debug log } } /** * @param Circle $circle * @param bool $detailed */ public function getInheritedMembers(Circle $circle, bool $detailed = false): void { try { $circle->setInheritedMembers( $this->memberRequest->getInheritedMembers($circle->getSingleId(), $detailed), $detailed ); } catch (RequestBuilderException $e) { // TODO: debug log } } /** * @param Circle $circle * @param bool $detailed * * @throws RemoteNotFoundException * @throws RequestBuilderException * @throws FederatedItemException * @throws RemoteInstanceException * @throws RemoteResourceNotFoundException * @throws UnknownRemoteException */ public function getRemoteInheritedMembers(Circle $circle, bool $detailed = false): void { foreach ($circle->getInheritedMembers() as $inherited) { if ($inherited->getUserType() === Member::TYPE_CIRCLE && !$this->configService->isLocalInstance($inherited->getInstance())) { try { $this->circleRequest->getCircle($inherited->getSingleId()); } catch (CircleNotFoundException $e) { $remote = $this->remoteService->getInheritedFromInstance( $inherited->getSingleId(), $inherited->getInstance() ); $circle->addInheritedMembers($remote); } } } } /** * @param IEntity $member */ public function getMemberships(IEntity $member): void { $memberships = $this->membershipRequest->getMemberships($member->getSingleId()); $member->setMemberships($memberships); } /** * @param IEntity $member * @param string $circleId * @param bool $detailed * * @return Membership * @throws MembershipNotFoundException * @throws RequestBuilderException */ public function getLink(IEntity $member, string $circleId, bool $detailed = false): Membership { return $this->membershipService->getMembership($circleId, $member->getSingleId(), $detailed); } /** * @param ManagedModel $model * @param array $data * @param string $base */ public function manageImportFromDatabase(ManagedModel $model, array $data, string $base): void { if ($model instanceof Circle) { if ($base === '') { $base = CoreQueryBuilder::CIRCLE; } } if ($model instanceof Member) { if ($base === '') { $base = CoreQueryBuilder::MEMBER; } } if ($model instanceof ShareWrapper) { if ($base === '') { $base = CoreQueryBuilder::SHARE; } } if ($model instanceof Mount) { if ($base === '') { $base = CoreQueryBuilder::MOUNT; } } foreach ($this->coreRequestBuilder->getAvailablePath($base) as $path => $prefix) { $this->importBasedOnPath($model, $data, $path, $prefix); } } private function importBasedOnPath(ManagedModel $model, array $data, string $path, string $prefix) { if ($model instanceof Circle) { $this->importIntoCircle($model, $data, $path, $prefix); } if ($model instanceof Member) { $this->importIntoMember($model, $data, $path, $prefix); } if ($model instanceof FederatedUser) { $this->importIntoFederatedUser($model, $data, $path, $prefix); } if ($model instanceof ShareWrapper) { $this->importIntoShareWrapper($model, $data, $path, $prefix); } if ($model instanceof Mount) { $this->importIntoMount($model, $data, $path, $prefix); } } /** * @param Circle $circle * @param array $data * @param string $path * @param string $prefix */ private function importIntoCircle(Circle $circle, array $data, string $path, string $prefix): void { switch ($path) { case CoreQueryBuilder::OWNER: try { $owner = new Member(); $owner->importFromDatabase($data, $prefix); $circle->setOwner($owner); } catch (MemberNotFoundException $e) { } break; case CoreQueryBuilder::INITIATOR: try { $initiator = new Member(); $initiator->importFromDatabase($data, $prefix); $circle->setInitiator($initiator); } catch (MemberNotFoundException $e) { } break; case CoreQueryBuilder::DIRECT_INITIATOR: try { $directInitiator = new Member(); $directInitiator->importFromDatabase($data, $prefix); $circle->setDirectInitiator($directInitiator); } catch (MemberNotFoundException $e) { } break; } } /** * @param Member $member * @param array $data * @param string $path * @param string $prefix */ private function importIntoMember(Member $member, array $data, string $path, string $prefix): void { switch ($path) { case CoreQueryBuilder::CIRCLE: try { $circle = new Circle(); $circle->importFromDatabase($data, $prefix); $member->setCircle($circle); } catch (CircleNotFoundException $e) { } break; case CoreQueryBuilder::BASED_ON: try { $circle = new Circle(); $circle->importFromDatabase($data, $prefix); $member->setBasedOn($circle); } catch (CircleNotFoundException $e) { } break; case CoreQueryBuilder::INHERITED_BY: try { $inheritedBy = new FederatedUser(); $inheritedBy->importFromDatabase($data, $prefix); $member->setInheritedBy($inheritedBy); } catch (FederatedUserNotFoundException $e) { } break; case CoreQueryBuilder::INVITED_BY: try { $invitedByCircle = new Circle(); $invitedByCircle->importFromDatabase($data, $prefix); $invitedBy = new FederatedUser(); $invitedBy->importFromCircle($invitedByCircle); $member->setInvitedBy($invitedBy); } catch (CircleNotFoundException | OwnerNotFoundException $e) { } break; case CoreQueryBuilder::INHERITANCE_FROM: try { $inheritanceFrom = new Member(); $inheritanceFrom->importFromDatabase($data, $prefix); $member->setInheritanceFrom($inheritanceFrom); } catch (MemberNotFoundException $e) { } break; case CoreQueryBuilder::REMOTE: try { $remoteInstance = new RemoteInstance(); $remoteInstance->importFromDatabase($data, $prefix); $member->setRemoteInstance($remoteInstance); } catch (RemoteNotFoundException $e) { } break; } } /** * @param FederatedUser $federatedUser * @param array $data * @param string $path * @param string $prefix */ private function importIntoFederatedUser( FederatedUser $federatedUser, array $data, string $path, string $prefix ): void { switch ($path) { case CoreQueryBuilder::MEMBERSHIPS: try { $membership = new Membership(); $membership->importFromDatabase($data, $prefix); $federatedUser->setInheritance($membership); } catch (MembershipNotFoundException $e) { } break; } } /** * @param ShareWrapper $shareWrapper * @param array $data * @param string $path * @param string $prefix */ private function importIntoShareWrapper( ShareWrapper $shareWrapper, array $data, string $path, string $prefix ): void { switch ($path) { case CoreQueryBuilder::CIRCLE: try { $circle = new Circle(); $circle->importFromDatabase($data, $prefix); $shareWrapper->setCircle($circle); } catch (CircleNotFoundException $e) { } break; case CoreQueryBuilder::INITIATOR: try { $initiator = new Member(); $initiator->importFromDatabase($data, $prefix); $shareWrapper->setInitiator($initiator); } catch (MemberNotFoundException $e) { } break; case CoreQueryBuilder::INHERITED_BY: try { $inheritedBy = new Member(); $inheritedBy->importFromDatabase($data, $prefix); $shareWrapper->setInitiator($inheritedBy); } catch (MemberNotFoundException $e) { } break; case CoreQueryBuilder::FILE_CACHE: try { $fileCache = new FileCacheWrapper(); $fileCache->importFromDatabase($data, $prefix); $shareWrapper->setFileCache($fileCache); } catch (FileCacheNotFoundException $e) { } break; case CoreQueryBuilder::TOKEN: try { $token = new ShareToken(); $token->importFromDatabase($data, $prefix); $shareWrapper->setShareToken($token); } catch (ShareTokenNotFoundException $e) { } break; } } /** * @param Mount $mount * @param array $data * @param string $path * @param string $prefix */ private function importIntoMount( Mount $mount, array $data, string $path, string $prefix ): void { switch ($path) { case CoreQueryBuilder::MEMBER: try { $member = new Member(); $member->importFromDatabase($data, $prefix); $mount->setOwner($member); } catch (MemberNotFoundException) { } break; case CoreQueryBuilder::INITIATOR: try { $initiator = new Member(); $initiator->importFromDatabase($data, $prefix); $mount->setInitiator($initiator); } catch (MemberNotFoundException) { } break; case CoreQueryBuilder::MOUNTPOINT: try { $mountPoint = new Mountpoint(); $mountPoint->importFromDatabase($data, $prefix); $mount->setAlternateMountPoint($mountPoint); } catch (MountPointNotFoundException) { } break; } } /** * @return string */ public function getLocalInstance(): string { return $this->interfaceService->getLocalInstance(); } /** * @param string $instance * * @return bool */ public function isLocalInstance(string $instance): bool { return $this->configService->isLocalInstance($instance); } /** * @param string $instance * * @return string * @throws UnknownInterfaceException */ public function fixInstance(string $instance): string { if (!$this->interfaceService->hasCurrentInterface()) { return $instance; } if (!$this->configService->isLocalInstance($instance)) { return $instance; } return $this->interfaceService->getCloudInstance(); } /** * @param string $singleId * * @return string */ public function generateLinkToCircle(string $singleId): string { if (!$this->pathLinkGenerated) { $this->pathLinkGenerated = true; $path = $this->configService->getAppValue(ConfigService::ROUTE_TO_CIRCLE); $pos = strpos($path, '.'); if (!$pos) { return ''; } if ($this->appManager->isInstalled(substr($path, 0, $pos))) { $this->pathLinkGeneration = $path; } } if ($this->pathLinkGeneration === '') { return ''; } return $this->urlGenerator->linkToRoute($this->pathLinkGeneration, ['singleId' => $singleId]); } /** * @param bool $full */ public function setFullDetails(bool $full): void { $this->fullDetails = $full; } /** * @return bool */ public function isFullDetails(): bool { return $this->fullDetails; } }