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, int $limit = 0): void { try { $circle->setMembers($this->memberRequest->getMembers($circle->getSingleId(), limit: $limit)); } 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; } }