diff --git a/src/Bundle/ChillCalendarBundle/Entity/RemoteCalendarTrait.php b/src/Bundle/ChillCalendarBundle/Entity/RemoteCalendarTrait.php index 5e3b2fd22..4196de35a 100644 --- a/src/Bundle/ChillCalendarBundle/Entity/RemoteCalendarTrait.php +++ b/src/Bundle/ChillCalendarBundle/Entity/RemoteCalendarTrait.php @@ -25,6 +25,14 @@ trait RemoteCalendarTrait */ private string $remoteId = ''; + /** + * If true, the changes won't be enqueued to remote + * + * This is required to prevent update loop: a persist trigger an event creation on remote, + * which in turn change remoteId and, in turn, trigger an update change, ... + */ + public bool $preventEnqueueChanges = false; + public function addRemoteAttributes(array $remoteAttributes): self { $this->remoteAttributes = array_merge($this->remoteAttributes, $remoteAttributes); diff --git a/src/Bundle/ChillCalendarBundle/Messenger/Doctrine/CalendarRangeEntityListener.php b/src/Bundle/ChillCalendarBundle/Messenger/Doctrine/CalendarRangeEntityListener.php index 6cc881b6e..a14d944c9 100644 --- a/src/Bundle/ChillCalendarBundle/Messenger/Doctrine/CalendarRangeEntityListener.php +++ b/src/Bundle/ChillCalendarBundle/Messenger/Doctrine/CalendarRangeEntityListener.php @@ -31,23 +31,27 @@ class CalendarRangeEntityListener public function postPersist(CalendarRange $calendarRange, LifecycleEventArgs $eventArgs): void { - $this->messageBus->dispatch( - new CalendarRangeMessage( - $calendarRange, - CalendarRangeMessage::CALENDAR_RANGE_PERSIST, - $this->security->getUser() - ) - ); + if (!$calendarRange->preventEnqueueChanges) { + $this->messageBus->dispatch( + new CalendarRangeMessage( + $calendarRange, + CalendarRangeMessage::CALENDAR_RANGE_PERSIST, + $this->security->getUser() + ) + ); + } } public function postUpdate(CalendarRange $calendarRange, LifecycleEventArgs $eventArgs): void { - $this->messageBus->dispatch( - new CalendarRangeMessage( - $calendarRange, - CalendarRangeMessage::CALENDAR_RANGE_UPDATE, - $this->security->getUser() - ) - ); + if (!$calendarRange->preventEnqueueChanges) { + $this->messageBus->dispatch( + new CalendarRangeMessage( + $calendarRange, + CalendarRangeMessage::CALENDAR_RANGE_UPDATE, + $this->security->getUser() + ) + ); + } } } diff --git a/src/Bundle/ChillCalendarBundle/Messenger/Handler/CalendarRangeToRemoteHandler.php b/src/Bundle/ChillCalendarBundle/Messenger/Handler/CalendarRangeToRemoteHandler.php index a22bd7cf8..97e666b60 100644 --- a/src/Bundle/ChillCalendarBundle/Messenger/Handler/CalendarRangeToRemoteHandler.php +++ b/src/Bundle/ChillCalendarBundle/Messenger/Handler/CalendarRangeToRemoteHandler.php @@ -44,6 +44,7 @@ class CalendarRangeToRemoteHandler implements MessageHandlerInterface $range = $this->calendarRangeRepository->find($calendarRangeMessage->getCalendarRangeId()); $this->remoteCalendarConnector->syncCalendarRange($range); + $range->preventEnqueueChanges = true; $this->entityManager->flush(); }