diff --git a/lib/Db/CircleRequest.php b/lib/Db/CircleRequest.php index 0fc100af..4dd1f903 100644 --- a/lib/Db/CircleRequest.php +++ b/lib/Db/CircleRequest.php @@ -281,7 +281,7 @@ class CircleRequest extends CircleRequestBuilder { * @throws CircleNotFoundException * @throws RequestBuilderException */ - public function searchCircle(Circle $circle): Circle { + public function searchCircle(Circle $circle, ?IFederatedUser $initiator = null): Circle { $qb = $this->getCircleSelectSql(); $qb->leftJoinOwner(CoreRequestBuilder::CIRCLE); @@ -300,6 +300,11 @@ class CircleRequest extends CircleRequestBuilder { $qb->filterDirectMembership($aliasOwner, $circle->getOwner()); } + if (!is_null($initiator)) { + $qb->setOptions([CoreRequestBuilder::CIRCLE], ['getData' => true]); + $qb->limitToInitiator(CoreRequestBuilder::CIRCLE, $initiator); + } + return $this->getItemFromRequest($qb); } diff --git a/lib/Service/FederatedUserService.php b/lib/Service/FederatedUserService.php index c9836762..d77fd5de 100644 --- a/lib/Service/FederatedUserService.php +++ b/lib/Service/FederatedUserService.php @@ -839,6 +839,7 @@ class FederatedUserService { * @throws RemoteResourceNotFoundException * @throws SingleCircleNotFoundException * @throws UnknownRemoteException + * @throws RequestBuilderException */ public function getGroupCircle(string $groupId): Circle { $group = $this->groupManager->get($groupId); @@ -865,7 +866,7 @@ class FederatedUserService { ->setInitiator($member); try { - return $this->circleRequest->searchCircle($circle); + return $this->circleRequest->searchCircle($circle, $owner); } catch (CircleNotFoundException $e) { } diff --git a/lib/Service/RemoteDownstreamService.php b/lib/Service/RemoteDownstreamService.php index 72075e62..38560290 100644 --- a/lib/Service/RemoteDownstreamService.php +++ b/lib/Service/RemoteDownstreamService.php @@ -44,6 +44,7 @@ use OCA\Circles\Exceptions\FederatedItemException; use OCA\Circles\Exceptions\InitiatorNotConfirmedException; use OCA\Circles\Exceptions\MemberNotFoundException; use OCA\Circles\Exceptions\OwnerNotFoundException; +use OCA\Circles\Exceptions\RequestBuilderException; use OCA\Circles\Model\Federated\FederatedEvent; @@ -206,11 +207,13 @@ class RemoteDownstreamService { * * @return bool * @throws OwnerNotFoundException + * @throws RequestBuilderException */ private function verifyCircle(FederatedEvent $event): bool { $circle = $event->getCircle(); + try { - $localCircle = $this->circleRequest->getCircle($circle->getSingleId()); + $localCircle = $this->circleRequest->getCircle($circle->getSingleId(), null, null, 0); } catch (CircleNotFoundException $e) { return false; } diff --git a/lib/Service/SyncService.php b/lib/Service/SyncService.php index 54d5391e..bd97d8d2 100644 --- a/lib/Service/SyncService.php +++ b/lib/Service/SyncService.php @@ -53,7 +53,9 @@ use OCA\Circles\Exceptions\RemoteResourceNotFoundException; use OCA\Circles\Exceptions\RequestBuilderException; use OCA\Circles\Exceptions\SingleCircleNotFoundException; use OCA\Circles\Exceptions\UnknownRemoteException; +use OCA\Circles\FederatedItems\SingleMemberAdd; use OCA\Circles\Model\Circle; +use OCA\Circles\Model\Federated\FederatedEvent; use OCA\Circles\Model\FederatedUser; use OCA\Circles\Model\ManagedModel; use OCA\Circles\Model\Member; @@ -87,6 +89,9 @@ class SyncService { /** @var FederatedUserService */ private $federatedUserService; + /** @var federatedEventService */ + private $federatedEventService; + /** @var MemberService */ private $memberService; @@ -102,8 +107,10 @@ class SyncService { * * @param IUserManager $userManager * @param IGroupManager $groupManager + * @param CircleRequest $circleRequest * @param MemberRequest $memberRequest * @param FederatedUserService $federatedUserService + * @param federatedEventService $federatedEventService * @param MemberService $memberService * @param MembershipService $membershipService * @param ConfigService $configService @@ -114,6 +121,7 @@ class SyncService { CircleRequest $circleRequest, MemberRequest $memberRequest, FederatedUserService $federatedUserService, + federatedEventService $federatedEventService, MemberService $memberService, MembershipService $membershipService, ConfigService $configService @@ -123,6 +131,7 @@ class SyncService { $this->circleRequest = $circleRequest; $this->memberRequest = $memberRequest; $this->federatedUserService = $federatedUserService; + $this->federatedEventService = $federatedEventService; $this->memberService = $memberService; $this->membershipService = $membershipService; $this->configService = $configService; @@ -154,12 +163,15 @@ class SyncService { } + /** + * @return void + */ public function syncAll(): void { $this->syncNextcloudUsers(); - $this->syncNextcloudGroups(); - $this->syncContacts(); $this->syncGlobalScale(); $this->syncRemote(); + $this->syncNextcloudGroups(); + $this->syncContacts(); } @@ -226,10 +238,15 @@ class SyncService { $group = $this->groupManager->get($groupId); foreach ($group->getUsers() as $user) { $member = $this->generateGroupMember($circle, $user->getUID()); - $this->memberRequest->insertOrUpdate($member); + $event = new FederatedEvent(SingleMemberAdd::class); + $event->setCircle($circle); + $event->setMember($member); + $this->federatedEventService->newEvent($event); + +// $this->memberRequest->insertOrUpdate($member); } - $this->membershipService->onUpdate($circle->getSingleId()); +// $this->membershipService->onUpdate($circle->getSingleId()); return $circle; } @@ -336,9 +353,15 @@ class SyncService { public function groupMemberAdded(string $groupId, string $userId): void { $circle = $this->federatedUserService->getGroupCircle($groupId); $member = $this->generateGroupMember($circle, $userId); - $this->memberRequest->insertOrUpdate($member); - $this->membershipService->onUpdate($member->getSingleId()); + $event = new FederatedEvent(SingleMemberAdd::class); + $event->setCircle($circle); + $event->setMember($member); + $this->federatedEventService->newEvent($event); + +// $this->memberRequest->insertOrUpdate($member); + +// $this->membershipService->onUpdate($member->getSingleId()); }