prevent loop when posting calendarrange to remote and updating remoteId

This commit is contained in:
Julien Fastré 2022-05-11 12:30:42 +02:00
parent e895da31d7
commit c892f7de7b
3 changed files with 27 additions and 14 deletions

View File

@ -25,6 +25,14 @@ trait RemoteCalendarTrait
*/ */
private string $remoteId = ''; 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 public function addRemoteAttributes(array $remoteAttributes): self
{ {
$this->remoteAttributes = array_merge($this->remoteAttributes, $remoteAttributes); $this->remoteAttributes = array_merge($this->remoteAttributes, $remoteAttributes);

View File

@ -31,6 +31,7 @@ class CalendarRangeEntityListener
public function postPersist(CalendarRange $calendarRange, LifecycleEventArgs $eventArgs): void public function postPersist(CalendarRange $calendarRange, LifecycleEventArgs $eventArgs): void
{ {
if (!$calendarRange->preventEnqueueChanges) {
$this->messageBus->dispatch( $this->messageBus->dispatch(
new CalendarRangeMessage( new CalendarRangeMessage(
$calendarRange, $calendarRange,
@ -39,9 +40,11 @@ class CalendarRangeEntityListener
) )
); );
} }
}
public function postUpdate(CalendarRange $calendarRange, LifecycleEventArgs $eventArgs): void public function postUpdate(CalendarRange $calendarRange, LifecycleEventArgs $eventArgs): void
{ {
if (!$calendarRange->preventEnqueueChanges) {
$this->messageBus->dispatch( $this->messageBus->dispatch(
new CalendarRangeMessage( new CalendarRangeMessage(
$calendarRange, $calendarRange,
@ -51,3 +54,4 @@ class CalendarRangeEntityListener
); );
} }
} }
}

View File

@ -44,6 +44,7 @@ class CalendarRangeToRemoteHandler implements MessageHandlerInterface
$range = $this->calendarRangeRepository->find($calendarRangeMessage->getCalendarRangeId()); $range = $this->calendarRangeRepository->find($calendarRangeMessage->getCalendarRangeId());
$this->remoteCalendarConnector->syncCalendarRange($range); $this->remoteCalendarConnector->syncCalendarRange($range);
$range->preventEnqueueChanges = true;
$this->entityManager->flush(); $this->entityManager->flush();
} }