userSession = $userSession; $this->federatedUserService = $federatedUserService; $this->circleService = $circleService; $this->memberService = $memberService; $this->membershipService = $membershipService; $this->permissionService = $permissionService; $this->searchService = $searchService; $this->configService = $configService; $this->setup('app', 'circles'); } /** * @NoAdminRequired * * @param string $name * @param bool $personal * @param bool $local * * @return DataResponse * @throws OCSException */ public function create(string $name, bool $personal = false, bool $local = false): DataResponse { try { $this->setCurrentFederatedUser(); $this->permissionService->confirmCircleCreation(); $circle = $this->circleService->create($name, null, $personal, $local); return new DataResponse($this->serializeArray($circle)); } catch (Exception $e) { $this->e($e, ['name' => $name, 'members' => $personal, 'local' => $local]); throw new OCSException($e->getMessage(), (int)$e->getCode()); } } /** * @NoAdminRequired * * @param string $circleId * * @return DataResponse * @throws OCSException */ public function destroy(string $circleId): DataResponse { try { $this->setCurrentFederatedUser(); $circle = $this->circleService->destroy($circleId); return new DataResponse($this->serializeArray($circle)); } catch (Exception $e) { $this->e($e, ['circleId' => $circleId]); throw new OCSException($e->getMessage(), (int)$e->getCode()); } } /** * @NoAdminRequired * * @param string $term * * @return DataResponse * @throws OCSException */ public function search(string $term): DataResponse { try { $this->setCurrentFederatedUser(); return new DataResponse($this->serializeArray($this->searchService->search($term))); } catch (Exception $e) { $this->e($e, ['term' => $term]); throw new OCSException($e->getMessage(), (int)$e->getCode()); } } /** * @NoAdminRequired * * @param string $circleId * * @return DataResponse * @throws OCSException */ public function circleDetails(string $circleId): DataResponse { try { $this->setCurrentFederatedUser(); $probe = new CircleProbe(); $probe->includeNonVisibleCircles(); return new DataResponse($this->serialize($this->circleService->getCircle($circleId, $probe))); } catch (Exception $e) { $this->e($e, ['circleId' => $circleId]); throw new OCSException($e->getMessage(), (int)$e->getCode()); } } /** * @NoAdminRequired * * @param string $circleId * @param string $userId * @param int $type * * @return DataResponse * @throws OCSException */ public function memberAdd(string $circleId, string $userId, int $type): DataResponse { try { $this->setCurrentFederatedUser(); // exception in Contact if ($type === Member::TYPE_CONTACT) { $currentUser = $this->federatedUserService->getCurrentUser(); if (!$this->configService->isLocalInstance($currentUser->getInstance())) { throw new OCSException('works only from local instance', 404); } $userId = $currentUser->getUserId() . '/' . $userId; } $federatedUser = $this->federatedUserService->generateFederatedUser($userId, $type); $result = $this->memberService->addMember($circleId, $federatedUser); return new DataResponse($this->serializeArray($result)); } catch (Exception $e) { $this->e($e, ['circleId' => $circleId, 'userId' => $userId, 'type' => $type]); throw new OCSException($e->getMessage(), (int)$e->getCode()); } } /** * @NoAdminRequired * * @param string $circleId * @param array $members * * @return DataResponse * @throws OCSException */ public function membersAdd(string $circleId, array $members): DataResponse { try { $this->setCurrentFederatedUser(); $federatedUsers = []; foreach ($members as $member) { // TODO: generate Multiple FederatedUsers using a single SQL request try { $federatedUsers[] = $this->federatedUserService->generateFederatedUser( $this->get('id', $member), $this->getInt('type', $member) ); } catch (MemberNotFoundException) { } } $result = $this->memberService->addMembers($circleId, $federatedUsers); return new DataResponse($this->serializeArray($result)); } catch (Exception $e) { $this->e($e, ['circleId' => $circleId, 'members' => $members]); throw new OCSException($e->getMessage(), (int)$e->getCode()); } } /** * @NoAdminRequired * * @param string $circleId * * @return DataResponse * @throws OCSException */ public function circleJoin(string $circleId): DataResponse { try { $this->setCurrentFederatedUser(); $result = $this->circleService->circleJoin($circleId); return new DataResponse($this->serializeArray($result)); } catch (Exception $e) { $this->e($e, ['circleId' => $circleId]); throw new OCSException($e->getMessage(), (int)$e->getCode()); } } /** * @NoAdminRequired * * @param string $circleId * * @return DataResponse * @throws OCSException */ public function circleLeave(string $circleId): DataResponse { try { $this->setCurrentFederatedUser(); $result = $this->circleService->circleLeave($circleId); return new DataResponse($this->serializeArray($result)); } catch (Exception $e) { $this->e($e, ['circleId' => $circleId]); throw new OCSException($e->getMessage(), (int)$e->getCode()); } } /** * @NoAdminRequired * * @param string $circleId * @param string $memberId * @param string|int $level * * @return DataResponse * @throws OCSException */ public function memberLevel(string $circleId, string $memberId, $level): DataResponse { try { $this->setCurrentFederatedUser(); if (is_int($level)) { $level = Member::parseLevelInt($level); } else { $level = Member::parseLevelString($level); } $this->memberService->getMemberById($memberId, $circleId); $result = $this->memberService->memberLevel($memberId, $level); return new DataResponse($this->serializeArray($result)); } catch (Exception $e) { $this->e($e, ['circleId' => $circleId, 'memberId' => $memberId, 'level' => $level]); throw new OCSException($e->getMessage(), (int)$e->getCode()); } } /** * @NoAdminRequired * * @param string $circleId * @param string $memberId * * @return DataResponse * @throws OCSException */ public function memberConfirm(string $circleId, string $memberId): DataResponse { try { $this->setCurrentFederatedUser(); $member = $this->memberService->getMemberById($memberId, $circleId); $federatedUser = new FederatedUser(); $federatedUser->importFromIFederatedUser($member); $result = $this->memberService->addMember($circleId, $federatedUser); return new DataResponse($this->serializeArray($result)); } catch (Exception $e) { $this->e($e, ['circleId' => $circleId, 'memberId' => $memberId]); throw new OCSException($e->getMessage(), (int)$e->getCode()); } } /** * @NoAdminRequired * * @param string $circleId * @param string $memberId * * @return DataResponse * @throws OCSException */ public function memberRemove(string $circleId, string $memberId): DataResponse { try { $this->setCurrentFederatedUser(); $this->memberService->getMemberById($memberId, $circleId); $result = $this->memberService->removeMember($memberId); return new DataResponse($this->serializeArray($result)); } catch (Exception $e) { $this->e($e, ['circleId' => $circleId, 'memberId' => $memberId]); throw new OCSException($e->getMessage(), (int)$e->getCode()); } } /** * @NoAdminRequired * * @param int $limit * @param int $offset * * @return DataResponse * @throws OCSException */ public function circles(int $limit = -1, int $offset = 0): DataResponse { try { $this->setCurrentFederatedUser(); $probe = new CircleProbe(); $probe->filterHiddenCircles() ->filterBackendCircles() ->addDetail(BasicProbe::DETAILS_POPULATION) ->setItemsLimit($limit) ->setItemsOffset($offset); return new DataResponse($this->serializeArray($this->circleService->getCircles($probe))); } catch (Exception $e) { $this->e($e); throw new OCSException($e->getMessage(), (int)$e->getCode()); } } /** * @NoAdminRequired * * @param int $limit * @param int $offset * * @return DataResponse * @throws OCSException */ public function probeCircles(int $limit = -1, int $offset = 0): DataResponse { try { $this->setCurrentFederatedUser(); $probe = new CircleProbe(); $probe->filterHiddenCircles() ->filterBackendCircles() ->addDetail(BasicProbe::DETAILS_POPULATION) ->setItemsLimit($limit) ->setItemsOffset($offset); return new DataResponse($this->serializeArray($this->circleService->probeCircles($probe))); } catch (Exception $e) { $this->e($e); throw new OCSException($e->getMessage(), (int)$e->getCode()); } } /** * @NoAdminRequired * * @param string $circleId * @param bool $fullDetails * * @return DataResponse * @throws OCSException */ public function members(string $circleId, bool $fullDetails = false): DataResponse { try { $this->setCurrentFederatedUser(); return new DataResponse($this->serializeArray($this->memberService->getMembers($circleId, $fullDetails))); } catch (Exception $e) { $this->e($e, ['circleId' => $circleId]); throw new OCSException($e->getMessage(), (int)$e->getCode()); } } /** * @NoAdminRequired * * @param string $circleId * @param string $value * * @return DataResponse * @throws OCSException */ public function editName(string $circleId, string $value): DataResponse { try { $this->setCurrentFederatedUser(); $outcome = $this->circleService->updateName($circleId, $value); return new DataResponse($this->serializeArray($outcome)); } catch (Exception $e) { $this->e($e, ['circleId' => $circleId, 'value' => $value]); throw new OCSException($e->getMessage(), (int)$e->getCode()); } } /** * @NoAdminRequired * * @param string $circleId * @param string $value * * @return DataResponse * @throws OCSException */ public function editDescription(string $circleId, string $value): DataResponse { try { $this->setCurrentFederatedUser(); $outcome = $this->circleService->updateDescription($circleId, $value); return new DataResponse($this->serializeArray($outcome)); } catch (Exception $e) { $this->e($e, ['circleId' => $circleId, 'value' => $value]); throw new OCSException($e->getMessage(), (int)$e->getCode()); } } /** * @NoAdminRequired * * @param string $circleId * @param string $setting * @param string|null $value * * @return DataResponse * @throws OCSException */ public function editSetting(string $circleId, string $setting, ?string $value = null): DataResponse { try { $this->setCurrentFederatedUser(); $outcome = $this->circleService->updateSetting($circleId, $setting, $value); return new DataResponse($this->serializeArray($outcome)); } catch (Exception $e) { $this->e($e, ['circleId' => $circleId, 'setting' => $setting, 'value' => $value]); throw new OCSException($e->getMessage(), (int)$e->getCode()); } } /** * @NoAdminRequired * * @param string $circleId * @param int $value * * @return DataResponse * @throws OCSException */ public function editConfig(string $circleId, int $value): DataResponse { try { $this->setCurrentFederatedUser(); $outcome = $this->circleService->updateConfig($circleId, $value); return new DataResponse($this->serializeArray($outcome)); } catch (Exception $e) { $this->e($e, ['circleId' => $circleId, 'value' => $value]); throw new OCSException($e->getMessage(), (int)$e->getCode()); } } /** * @NoAdminRequired * * @param string $circleId * @param string $singleId * * @return DataResponse * @throws OCSException */ public function link(string $circleId, string $singleId): DataResponse { try { $this->setCurrentFederatedUser(); $membership = $this->membershipService->getMembership($circleId, $singleId, true); return new DataResponse($this->serialize($membership)); } catch (Exception $e) { $this->e($e, ['circleId' => $circleId, 'singleId' => $singleId]); throw new OCSException($e->getMessage(), (int)$e->getCode()); } } /** * @return void * @throws FederatedUserException * @throws FederatedUserNotFoundException * @throws FrontendException * @throws InvalidIdException * @throws RequestBuilderException * @throws SingleCircleNotFoundException */ private function setCurrentFederatedUser(): void { if (!$this->configService->getAppValueBool(ConfigService::FRONTEND_ENABLED)) { throw new FrontendException('frontend disabled'); } $user = $this->userSession->getUser(); $this->federatedUserService->setLocalCurrentUser($user); } }