<?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\GoogleMeet\Contract\IGetGoogleMeetClientService;
use Harmonizely\Types\Company\IntegrationType;
use Psr\Log\LoggerInterface;
use Symfony\Component\EventDispatcher\EventSubscriberInterface;
use Symfony\Component\EventDispatcher\GenericEvent;
final class CreateGoogleMeetMeetingSubscriber implements EventSubscriberInterface
{
/**
* @var LoggerInterface
*/
private LoggerInterface $logger;
/**
* @var LocationTypeProvider
*/
private LocationTypeProvider $locationTypeProvider;
/**
* @var IIntegrationRepository
*/
private IIntegrationRepository $integrationRepository;
/**
* @var IGetGoogleMeetClientService
*/
private IGetGoogleMeetClientService $getGoogleMeetClientService;
/**
* @param LoggerInterface $logger
* @param LocationTypeProvider $locationTypeProvider
* @param IIntegrationRepository $integrationRepository
* @param IGetGoogleMeetClientService $getGoogleMeetClientService
*/
public function __construct(
LoggerInterface $logger,
LocationTypeProvider $locationTypeProvider,
IIntegrationRepository $integrationRepository,
IGetGoogleMeetClientService $getGoogleMeetClientService
)
{
$this->logger = $logger;
$this->locationTypeProvider = $locationTypeProvider;
$this->integrationRepository = $integrationRepository;
$this->getGoogleMeetClientService = $getGoogleMeetClientService;
}
/**
* @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::GOOGLE_MEET);
if (!$integration || !$integration->isEnabled() || $integration->isError() || EventTypeInterface::LOCATION_TYPE_GOOGLE_MEET !== $locationType) {
return;
}
if ($eventType->isGroupMeetingType() && $event->getLocation()) {
return;
}
if ($event->isRecurring() && $event->getLocation()) {
return;
}
try {
$client = $this->getGoogleMeetClientService->perform($integration);
$googleMeedDTO = $client->create();
$event->setLocation($googleMeedDTO->getMeetingUri());
} catch (Exception $e) {
$integration->setError(true);
$this->integrationRepository->save($integration);
$this->logger->critical('Google Meet meeting creation failed.', [
'message' => $e->getMessage(),
'user_email' => $user->getEmail(),
'invitee_email' => $event->getInvitee()->getEmail(),
]);
return;
}
}
}