From d150a8251b0e45d56c06e3020945cda7b2e65a1d Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Julien=20Fastr=C3=A9?= Date: Wed, 11 May 2022 15:01:32 +0200 Subject: [PATCH] calendar range: remove on remote after removal in the database --- .../Doctrine/CalendarRangeEntityListener.php | 13 +++++ .../CalendarRangeRemoveToRemoteHandler.php | 43 ++++++++++++++ .../Message/CalendarRangeRemovedMessage.php | 57 +++++++++++++++++++ .../Connector/MSGraph/MachineHttpClient.php | 1 + .../MSGraphRemoteCalendarConnector.php | 26 +++++++++ .../Connector/NullRemoteCalendarConnector.php | 4 ++ .../RemoteCalendarConnectorInterface.php | 2 + .../Resources/config/services/event.yml | 4 ++ 8 files changed, 150 insertions(+) create mode 100644 src/Bundle/ChillCalendarBundle/Messenger/Handler/CalendarRangeRemoveToRemoteHandler.php create mode 100644 src/Bundle/ChillCalendarBundle/Messenger/Message/CalendarRangeRemovedMessage.php diff --git a/src/Bundle/ChillCalendarBundle/Messenger/Doctrine/CalendarRangeEntityListener.php b/src/Bundle/ChillCalendarBundle/Messenger/Doctrine/CalendarRangeEntityListener.php index a14d944c9..7d85a7537 100644 --- a/src/Bundle/ChillCalendarBundle/Messenger/Doctrine/CalendarRangeEntityListener.php +++ b/src/Bundle/ChillCalendarBundle/Messenger/Doctrine/CalendarRangeEntityListener.php @@ -13,6 +13,7 @@ namespace Chill\CalendarBundle\Messenger\Doctrine; use Chill\CalendarBundle\Entity\CalendarRange; use Chill\CalendarBundle\Messenger\Message\CalendarRangeMessage; +use Chill\CalendarBundle\Messenger\Message\CalendarRangeRemovedMessage; use Doctrine\ORM\Event\LifecycleEventArgs; use Symfony\Component\Messenger\MessageBusInterface; use Symfony\Component\Security\Core\Security; @@ -42,6 +43,18 @@ class CalendarRangeEntityListener } } + public function postRemove(CalendarRange $calendarRange, LifecycleEventArgs $eventArgs): void + { + if (!$calendarRange->preventEnqueueChanges) { + $this->messageBus->dispatch( + new CalendarRangeRemovedMessage( + $calendarRange, + $this->security->getUser() + ) + ); + } + } + public function postUpdate(CalendarRange $calendarRange, LifecycleEventArgs $eventArgs): void { if (!$calendarRange->preventEnqueueChanges) { diff --git a/src/Bundle/ChillCalendarBundle/Messenger/Handler/CalendarRangeRemoveToRemoteHandler.php b/src/Bundle/ChillCalendarBundle/Messenger/Handler/CalendarRangeRemoveToRemoteHandler.php new file mode 100644 index 000000000..0181195ed --- /dev/null +++ b/src/Bundle/ChillCalendarBundle/Messenger/Handler/CalendarRangeRemoveToRemoteHandler.php @@ -0,0 +1,43 @@ +remoteCalendarConnector = $remoteCalendarConnector; + $this->userRepository = $userRepository; + } + + public function __invoke(CalendarRangeRemovedMessage $calendarRangeRemovedMessage) + { + $this->remoteCalendarConnector->removeCalendarRange( + $calendarRangeRemovedMessage->getRemoteId(), + $calendarRangeRemovedMessage->getRemoteAttributes(), + $this->userRepository->find($calendarRangeRemovedMessage->getCalendarRangeUserId()) + ); + } +} diff --git a/src/Bundle/ChillCalendarBundle/Messenger/Message/CalendarRangeRemovedMessage.php b/src/Bundle/ChillCalendarBundle/Messenger/Message/CalendarRangeRemovedMessage.php new file mode 100644 index 000000000..e855f91a3 --- /dev/null +++ b/src/Bundle/ChillCalendarBundle/Messenger/Message/CalendarRangeRemovedMessage.php @@ -0,0 +1,57 @@ +remoteId = $calendarRange->getRemoteId(); + $this->remoteAttributes = $calendarRange->getRemoteAttributes(); + $this->calendarRangeUserId = $calendarRange->getUser()->getId(); + + if (null !== $byUser) { + $this->byUserId = $byUser->getId(); + } + } + + public function getByUserId(): ?int + { + return $this->byUserId; + } + + public function getCalendarRangeUserId(): ?int + { + return $this->calendarRangeUserId; + } + + public function getRemoteAttributes(): array + { + return $this->remoteAttributes; + } + + public function getRemoteId(): string + { + return $this->remoteId; + } +} diff --git a/src/Bundle/ChillCalendarBundle/RemoteCalendar/Connector/MSGraph/MachineHttpClient.php b/src/Bundle/ChillCalendarBundle/RemoteCalendar/Connector/MSGraph/MachineHttpClient.php index c9a3f982e..680aaa0a7 100644 --- a/src/Bundle/ChillCalendarBundle/RemoteCalendar/Connector/MSGraph/MachineHttpClient.php +++ b/src/Bundle/ChillCalendarBundle/RemoteCalendar/Connector/MSGraph/MachineHttpClient.php @@ -45,6 +45,7 @@ class MachineHttpClient implements HttpClientInterface switch ($method) { case 'GET': case 'HEAD': + case 'DELETE': $options['headers']['Accept'] = 'application/json'; break; diff --git a/src/Bundle/ChillCalendarBundle/RemoteCalendar/Connector/MSGraphRemoteCalendarConnector.php b/src/Bundle/ChillCalendarBundle/RemoteCalendar/Connector/MSGraphRemoteCalendarConnector.php index db02b4903..8e384ff33 100644 --- a/src/Bundle/ChillCalendarBundle/RemoteCalendar/Connector/MSGraphRemoteCalendarConnector.php +++ b/src/Bundle/ChillCalendarBundle/RemoteCalendar/Connector/MSGraphRemoteCalendarConnector.php @@ -106,6 +106,15 @@ class MSGraphRemoteCalendarConnector implements RemoteCalendarConnectorInterface } } + public function removeCalendarRange(string $remoteId, array $remoteAttributes, User $user): void + { + if ('' === $remoteId) { + return; + } + + $this->removeEvent($remoteId, $user); + } + public function syncCalendarRange(CalendarRange $calendarRange): void { if ($calendarRange->hasRemoteId()) { @@ -200,6 +209,23 @@ class MSGraphRemoteCalendarConnector implements RemoteCalendarConnectorInterface ); } + private function removeEvent($remoteId, User $user): void + { + $userId = $this->mapCalendarToUser->getUserId($user); + + try { + $this->machineHttpClient->request( + 'DELETE', + 'users/' . $userId . '/calendar/events/' . $remoteId + ); + } catch (ClientExceptionInterface $e) { + $this->logger->warning('could not remove event from calendar', [ + 'event_remote_id' => $remoteId, + 'user_id' => $user->getId(), + ]); + } + } + private function updateRemoteCalendarRange(CalendarRange $calendarRange): void { $userId = $this->mapCalendarToUser->getUserId($calendarRange->getUser()); diff --git a/src/Bundle/ChillCalendarBundle/RemoteCalendar/Connector/NullRemoteCalendarConnector.php b/src/Bundle/ChillCalendarBundle/RemoteCalendar/Connector/NullRemoteCalendarConnector.php index 800eb1369..45025274d 100644 --- a/src/Bundle/ChillCalendarBundle/RemoteCalendar/Connector/NullRemoteCalendarConnector.php +++ b/src/Bundle/ChillCalendarBundle/RemoteCalendar/Connector/NullRemoteCalendarConnector.php @@ -34,6 +34,10 @@ class NullRemoteCalendarConnector implements RemoteCalendarConnectorInterface return []; } + public function removeCalendarRange(string $remoteId, array $remoteAttributes, User $user): void + { + } + public function syncCalendarRange(CalendarRange $calendarRange): void { } diff --git a/src/Bundle/ChillCalendarBundle/RemoteCalendar/Connector/RemoteCalendarConnectorInterface.php b/src/Bundle/ChillCalendarBundle/RemoteCalendar/Connector/RemoteCalendarConnectorInterface.php index 298334309..c8e9fe21e 100644 --- a/src/Bundle/ChillCalendarBundle/RemoteCalendar/Connector/RemoteCalendarConnectorInterface.php +++ b/src/Bundle/ChillCalendarBundle/RemoteCalendar/Connector/RemoteCalendarConnectorInterface.php @@ -37,5 +37,7 @@ interface RemoteCalendarConnectorInterface */ public function listEventsForUser(User $user, DateTimeImmutable $startDate, DateTimeImmutable $endDate): array; + public function removeCalendarRange(string $remoteId, array $remoteAttributes, User $user): void; + public function syncCalendarRange(CalendarRange $calendarRange): void; } diff --git a/src/Bundle/ChillCalendarBundle/Resources/config/services/event.yml b/src/Bundle/ChillCalendarBundle/Resources/config/services/event.yml index 4a0ca3ca0..245d74693 100644 --- a/src/Bundle/ChillCalendarBundle/Resources/config/services/event.yml +++ b/src/Bundle/ChillCalendarBundle/Resources/config/services/event.yml @@ -21,3 +21,7 @@ services: name: 'doctrine.orm.entity_listener' event: 'postUpdate' entity: 'Chill\CalendarBundle\Entity\CalendarRange' + - + name: 'doctrine.orm.entity_listener' + event: 'postRemove' + entity: 'Chill\CalendarBundle\Entity\CalendarRange'