From d3b13a0ca728a0b6c3c27b6fd49319809081bc67 Mon Sep 17 00:00:00 2001 From: Jonas Date: Wed, 20 Nov 2024 10:34:31 +0100 Subject: [PATCH] feat(CirclesManager): Add flag to enforce synchronous event execution Required for testing (where only one php thread is available), but as well for clients that require the event to be excecuted immediately. Signed-off-by: Jonas --- lib/CirclesManager.php | 14 +++++++++----- lib/Model/Federated/FederatedEvent.php | 11 +++++++++++ lib/Service/CircleService.php | 4 +++- lib/Service/FederatedEventService.php | 2 +- lib/Service/MemberService.php | 7 +++++-- 5 files changed, 29 insertions(+), 9 deletions(-) diff --git a/lib/CirclesManager.php b/lib/CirclesManager.php index 9dbcfa76c..4c4c0d908 100644 --- a/lib/CirclesManager.php +++ b/lib/CirclesManager.php @@ -89,6 +89,7 @@ class CirclesManager { /** @var CirclesQueryHelper */ private $circlesQueryHelper; + private bool $forceSync = false; /** * CirclesManager constructor. @@ -172,7 +173,8 @@ public function getLocalFederatedUser(string $userId): FederatedUser { * @throws InvalidIdException * @throws FederatedUserException */ - public function startSession(?FederatedUser $federatedUser = null): void { + public function startSession(?FederatedUser $federatedUser = null, bool $forceSync = false): void { + $this->forceSync = $forceSync; if (is_null($federatedUser)) { $this->federatedUserService->initCurrentUser(); } else { @@ -183,7 +185,8 @@ public function startSession(?FederatedUser $federatedUser = null): void { /** * */ - public function startSuperSession(): void { + public function startSuperSession(bool $forceSync = false): void { + $this->forceSync = $forceSync; $this->federatedUserService->unsetCurrentUser(); $this->federatedUserService->bypassCurrentUserCondition(true); } @@ -244,6 +247,7 @@ public function startOccSession( public function stopSession(): void { $this->federatedUserService->unsetCurrentUser(); $this->federatedUserService->bypassCurrentUserCondition(false); + $this->forceSync = false; } @@ -318,7 +322,7 @@ public function createCircle( * @throws UnknownRemoteException */ public function destroyCircle(string $singleId): void { - $this->circleService->destroy($singleId); + $this->circleService->destroy($singleId, $this->forceSync); } @@ -446,7 +450,7 @@ public function flagAsAppManaged(string $circleId, bool $enabled = true): void { * @throws UnknownRemoteException */ public function addMember(string $circleId, FederatedUser $federatedUser): Member { - $outcome = $this->memberService->addMember($circleId, $federatedUser); + $outcome = $this->memberService->addMember($circleId, $federatedUser, $this->forceSync); $member = new Member(); $member->import($outcome); @@ -495,7 +499,7 @@ public function levelMember(string $memberId, int $level): Member { * @throws UnknownRemoteException */ public function removeMember(string $memberId): void { - $this->memberService->removeMember($memberId); + $this->memberService->removeMember($memberId, $this->forceSync); } diff --git a/lib/Model/Federated/FederatedEvent.php b/lib/Model/Federated/FederatedEvent.php index 8443f67c9..762a5c5a2 100644 --- a/lib/Model/Federated/FederatedEvent.php +++ b/lib/Model/Federated/FederatedEvent.php @@ -114,6 +114,8 @@ class FederatedEvent implements JsonSerializable { /** @var int */ private $bypass = 0; + private bool $forceSync = false; + /** * FederatedEvent constructor. @@ -572,6 +574,15 @@ public function canBypass(int $flag): bool { return (($this->bypass & $flag) !== 0); } + public function forceSync(bool $forceSync): self { + $this->forceSync = $forceSync; + return $this; + } + + public function isForceSync(): bool { + return $this->forceSync; + } + /** * @param array $data diff --git a/lib/Service/CircleService.php b/lib/Service/CircleService.php index 475ed968d..f31d22a23 100644 --- a/lib/Service/CircleService.php +++ b/lib/Service/CircleService.php @@ -241,6 +241,7 @@ public function create( /** * @param string $circleId + * @param bool $forceSync * * @return array * @throws CircleNotFoundException @@ -255,13 +256,14 @@ public function create( * @throws RequestBuilderException * @throws UnknownRemoteException */ - public function destroy(string $circleId): array { + public function destroy(string $circleId, bool $forceSync = false): array { $this->federatedUserService->mustHaveCurrentUser(); $circle = $this->getCircle($circleId); $event = new FederatedEvent(CircleDestroy::class); $event->setCircle($circle); + $event->forceSync($forceSync); $this->federatedEventService->newEvent($event); return $event->getOutcome(); diff --git a/lib/Service/FederatedEventService.php b/lib/Service/FederatedEventService.php index 2bf3e7752..dc6cbaf22 100644 --- a/lib/Service/FederatedEventService.php +++ b/lib/Service/FederatedEventService.php @@ -384,7 +384,7 @@ private function confirmSharedItem(FederatedEvent $event, IFederatedItem $item): * @param IFederatedItem $item */ private function configureEvent(FederatedEvent $event, IFederatedItem $item) { - if ($item instanceof IFederatedItemAsyncProcess) { + if ($item instanceof IFederatedItemAsyncProcess && !$event->isForceSync()) { $event->setAsync(true); } if ($item instanceof IFederatedItemLimitedToInstanceWithMembership) { diff --git a/lib/Service/MemberService.php b/lib/Service/MemberService.php index 138816ba0..f3a3a2cb8 100644 --- a/lib/Service/MemberService.php +++ b/lib/Service/MemberService.php @@ -212,7 +212,7 @@ public function getMembers(string $circleId): array { * @throws InvalidIdException * @throws SingleCircleNotFoundException */ - public function addMember(string $circleId, FederatedUser $federatedUser): array { + public function addMember(string $circleId, FederatedUser $federatedUser, bool $forceSync = false): array { $this->federatedUserService->mustHaveCurrentUser(); $circle = $this->circleRequest->getCircle($circleId, $this->federatedUserService->getCurrentUser()); @@ -224,6 +224,7 @@ public function addMember(string $circleId, FederatedUser $federatedUser): array $event = new FederatedEvent(SingleMemberAdd::class); $event->setCircle($circle); $event->setMember($member); + $event->forceSync($forceSync); $this->federatedEventService->newEvent($event); @@ -281,6 +282,7 @@ function (FederatedUser $federatedUser) use ($patron) { /** * @param string $memberId + * @param bool $forceSync * * @return array * @throws FederatedEventException @@ -294,7 +296,7 @@ function (FederatedUser $federatedUser) use ($patron) { * @throws UnknownRemoteException * @throws RequestBuilderException */ - public function removeMember(string $memberId): array { + public function removeMember(string $memberId, bool $forceSync = false): array { $this->federatedUserService->mustHaveCurrentUser(); $member = $this->memberRequest->getMemberById( $memberId, @@ -304,6 +306,7 @@ public function removeMember(string $memberId): array { $event = new FederatedEvent(MemberRemove::class); $event->setCircle($member->getCircle()); $event->setMember($member); + $event->forceSync($forceSync); $this->federatedEventService->newEvent($event);