src/EventSubscriber/CreateMicrosoftTeamsMeetingSubscriber.php line 75

Open in your IDE?
  1. <?php
  2. declare(strict_types=1);
  3. namespace Harmonizely\EventSubscriber;
  4. use Exception;
  5. use Harmonizely\CalendarEvents;
  6. use Harmonizely\EventTypes\LocationTypeProvider;
  7. use Harmonizely\Model\EventInterface;
  8. use Harmonizely\Model\EventTypeInterface;
  9. use Harmonizely\Repository\Company\Contract\IIntegrationRepository;
  10. use Harmonizely\Service\Panel\Integration\MicrosoftTeams\Contract\IGetMicrosoftTeamsClientService;
  11. use Harmonizely\Types\Company\IntegrationType;
  12. use Psr\Log\LoggerInterface;
  13. use Symfony\Component\EventDispatcher\EventSubscriberInterface;
  14. use Symfony\Component\EventDispatcher\GenericEvent;
  15. final class CreateMicrosoftTeamsMeetingSubscriber implements EventSubscriberInterface
  16. {
  17.     /**
  18.      * @var LoggerInterface
  19.      */
  20.     private LoggerInterface $logger;
  21.     /**
  22.      * @var LocationTypeProvider
  23.      */
  24.     private LocationTypeProvider $locationTypeProvider;
  25.     /**
  26.      * @var IIntegrationRepository
  27.      */
  28.     private IIntegrationRepository $integrationRepository;
  29.     /**
  30.      * @var IGetMicrosoftTeamsClientService
  31.      */
  32.     private IGetMicrosoftTeamsClientService $getMicrosoftTeamsClientService;
  33.     /**
  34.      * @param LoggerInterface $logger
  35.      * @param LocationTypeProvider $locationTypeProvider
  36.      * @param IIntegrationRepository $integrationRepository
  37.      * @param IGetMicrosoftTeamsClientService $getMicrosoftTeamsClientService
  38.      */
  39.     public function __construct(
  40.         LoggerInterface $logger,
  41.         LocationTypeProvider $locationTypeProvider,
  42.         IIntegrationRepository $integrationRepository,
  43.         IGetMicrosoftTeamsClientService $getMicrosoftTeamsClientService
  44.     )
  45.     {
  46.         $this->logger $logger;
  47.         $this->locationTypeProvider $locationTypeProvider;
  48.         $this->integrationRepository $integrationRepository;
  49.         $this->getMicrosoftTeamsClientService $getMicrosoftTeamsClientService;
  50.     }
  51.     /**
  52.      * @return string[]
  53.      */
  54.     public static function getSubscribedEvents(): array
  55.     {
  56.         return [
  57.             CalendarEvents::EVENT_PRE_CREATE => 'createMeeting',
  58.         ];
  59.     }
  60.     /**
  61.      * @param GenericEvent $genericEvent
  62.      * @return void
  63.      */
  64.     public function createMeeting(GenericEvent $genericEvent): void
  65.     {
  66.         /** @var EventInterface $event */
  67.         $event $genericEvent->getSubject();
  68.         $eventType $event->getEventType();
  69.         $user $event->getUser();
  70.         $locationType $this->locationTypeProvider->provideFor($eventType$user$event);
  71.         $integration $this->integrationRepository->findIntegration($userIntegrationType::MICROSOFT_TEAMS);
  72.         if (!$integration || !$integration->isEnabled() || $integration->isError() || EventTypeInterface::LOCATION_TYPE_MICROSOFT_TEAMS !== $locationType) {
  73.             return;
  74.         }
  75.         if ($eventType->isGroupMeetingType() && $event->getLocation()) {
  76.             return;
  77.         }
  78.         if ($event->isRecurring() && $event->getLocation()) {
  79.             return;
  80.         }
  81.         try {
  82.             $client $this->getMicrosoftTeamsClientService->perform($integration);
  83.             $microsoftTeamsDTO $client->create($event);
  84.             $event->setLocation($microsoftTeamsDTO->getJoinUrl());
  85.         } catch (Exception $e) {
  86.             $integration->setError(true);
  87.             $this->integrationRepository->save($integration);
  88.             $this->logger->critical('Microsoft Teams meeting creation failed.', [
  89.                 'message' => $e->getMessage(),
  90.                 'user_email' => $user->getEmail(),
  91.                 'invitee_email' => $event->getInvitee()->getEmail(),
  92.             ]);
  93.             return;
  94.         }
  95.     }
  96. }