<?php
declare(strict_types=1);
namespace Harmonizely\EventSubscriber;
use Exception;
use Harmonizely\CalendarEvents;
use Harmonizely\EventTypes\LocationTypeProvider;
use Harmonizely\Model\EventInterface;
use Harmonizely\Model\EventTypeInterface;
use Harmonizely\Repository\Company\Contract\IIntegrationRepository;
use Harmonizely\Service\Panel\Integration\MicrosoftTeams\Contract\IGetMicrosoftTeamsClientService;
use Harmonizely\Types\Company\IntegrationType;
use Psr\Log\LoggerInterface;
use Symfony\Component\EventDispatcher\EventSubscriberInterface;
use Symfony\Component\EventDispatcher\GenericEvent;
final class CreateMicrosoftTeamsMeetingSubscriber implements EventSubscriberInterface
{
/**
* @var LoggerInterface
*/
private LoggerInterface $logger;
/**
* @var LocationTypeProvider
*/
private LocationTypeProvider $locationTypeProvider;
/**
* @var IIntegrationRepository
*/
private IIntegrationRepository $integrationRepository;
/**
* @var IGetMicrosoftTeamsClientService
*/
private IGetMicrosoftTeamsClientService $getMicrosoftTeamsClientService;
/**
* @param LoggerInterface $logger
* @param LocationTypeProvider $locationTypeProvider
* @param IIntegrationRepository $integrationRepository
* @param IGetMicrosoftTeamsClientService $getMicrosoftTeamsClientService
*/
public function __construct(
LoggerInterface $logger,
LocationTypeProvider $locationTypeProvider,
IIntegrationRepository $integrationRepository,
IGetMicrosoftTeamsClientService $getMicrosoftTeamsClientService
)
{
$this->logger = $logger;
$this->locationTypeProvider = $locationTypeProvider;
$this->integrationRepository = $integrationRepository;
$this->getMicrosoftTeamsClientService = $getMicrosoftTeamsClientService;
}
/**
* @return string[]
*/
public static function getSubscribedEvents(): array
{
return [
CalendarEvents::EVENT_PRE_CREATE => 'createMeeting',
];
}
/**
* @param GenericEvent $genericEvent
* @return void
*/
public function createMeeting(GenericEvent $genericEvent): void
{
/** @var EventInterface $event */
$event = $genericEvent->getSubject();
$eventType = $event->getEventType();
$user = $event->getUser();
$locationType = $this->locationTypeProvider->provideFor($eventType, $user, $event);
$integration = $this->integrationRepository->findIntegration($user, IntegrationType::MICROSOFT_TEAMS);
if (!$integration || !$integration->isEnabled() || $integration->isError() || EventTypeInterface::LOCATION_TYPE_MICROSOFT_TEAMS !== $locationType) {
return;
}
if ($eventType->isGroupMeetingType() && $event->getLocation()) {
return;
}
if ($event->isRecurring() && $event->getLocation()) {
return;
}
try {
$client = $this->getMicrosoftTeamsClientService->perform($integration);
$microsoftTeamsDTO = $client->create($event);
$event->setLocation($microsoftTeamsDTO->getJoinUrl());
} catch (Exception $e) {
$integration->setError(true);
$this->integrationRepository->save($integration);
$this->logger->critical('Microsoft Teams meeting creation failed.', [
'message' => $e->getMessage(),
'user_email' => $user->getEmail(),
'invitee_email' => $event->getInvitee()->getEmail(),
]);
return;
}
}
}