mapCalendarToUser->getUserId($user)) { throw new \LogicException('no user id'); } $subscription = [ 'changeType' => 'deleted,updated', 'notificationUrl' => $this->urlGenerator->generate( 'chill_calendar_remote_msgraph_incoming_webhook_events', ['userId' => $user->getId()], UrlGeneratorInterface::ABSOLUTE_URL ), 'resource' => "/users/{$userId}/calendar/events", 'clientState' => $secret = base64_encode(openssl_random_pseudo_bytes(92, $cstrong)), 'expirationDateTime' => $expiration->format(\DateTimeImmutable::ATOM), ]; try { $subs = $this->machineHttpClient->request( 'POST', '/v1.0/subscriptions', [ 'json' => $subscription, ] )->toArray(); } catch (ClientExceptionInterface $e) { $this->logger->error('could not create subscription for user events', [ 'body' => $e->getResponse()->getContent(false), ]); return ['secret' => '', 'id' => '', 'expiration' => 0]; } return ['secret' => $secret, 'id' => $subs['id'], 'expiration' => $expiration->getTimestamp()]; } /** * @return array{secret: string, id: string, expiration: int} * * @throws ClientExceptionInterface * @throws \Symfony\Contracts\HttpClient\Exception\DecodingExceptionInterface * @throws \Symfony\Contracts\HttpClient\Exception\RedirectionExceptionInterface * @throws \Symfony\Contracts\HttpClient\Exception\ServerExceptionInterface * @throws \Symfony\Contracts\HttpClient\Exception\TransportExceptionInterface */ public function renewSubscriptionForUser(User $user, \DateTimeImmutable $expiration): array { if (null === $userId = $this->mapCalendarToUser->getUserId($user)) { throw new \LogicException('no user id'); } if (null === $subscriptionId = $this->mapCalendarToUser->getActiveSubscriptionId($user)) { throw new \LogicException('no user id'); } $subscription = [ 'expirationDateTime' => $expiration->format(\DateTimeImmutable::ATOM), ]; try { $subs = $this->machineHttpClient->request( 'PATCH', "/v1.0/subscriptions/{$subscriptionId}", [ 'json' => $subscription, ] )->toArray(); } catch (ClientExceptionInterface $e) { $this->logger->error('could not patch subscription for user events', [ 'body' => $e->getResponse()->getContent(false), ]); return ['secret' => '', 'id' => '', 'expiration' => 0]; } return ['secret' => $subs['clientState'], 'id' => $subs['id'], 'expiration' => $expiration->getTimestamp()]; } }