<?php
declare(strict_types=1);
namespace Harmonizely\EventSubscriber;
use Behat\Transliterator\Transliterator;
use Doctrine\ORM\EntityManagerInterface;
use Harmonizely\CalendarEvents;
use Harmonizely\EventTypes\LocationTypeProvider;
use Harmonizely\Generator\RandomnessGeneratorInterface;
use Harmonizely\Model\EventInterface;
use Harmonizely\Model\EventTypeInterface;
use Harmonizely\Model\Integration;
use Harmonizely\Model\IntegrationInterface;
use Harmonizely\Model\UserInterface;
use Harmonizely\Types\Company\IntegrationType;
use Symfony\Component\EventDispatcher\EventSubscriberInterface;
use Symfony\Component\EventDispatcher\GenericEvent;
use Webmozart\Assert\Assert;
final class CreateKopanoMeetLinkSubscriber implements EventSubscriberInterface
{
private $entityManager;
private $randomnessGenerator;
private LocationTypeProvider $locationTypeProvider;
public function __construct(
EntityManagerInterface $entityManager,
RandomnessGeneratorInterface $randomnessGenerator,
LocationTypeProvider $locationTypeProvider
) {
$this->entityManager = $entityManager;
$this->randomnessGenerator = $randomnessGenerator;
$this->locationTypeProvider = $locationTypeProvider;
}
public static function getSubscribedEvents(): array
{
return [
CalendarEvents::EVENT_PRE_CREATE => 'createMeeting',
];
}
public function createMeeting(GenericEvent $event): void
{
/** @var EventInterface $event */
$event = $event->getSubject();
Assert::isInstanceOf($event, EventInterface::class);
$eventType = $event->getEventType();
$user = $event->getUser();
$locationType = $this->locationTypeProvider->provideFor($eventType, $user, $event);
$integration = $this->findIntegration($user);
if (null === $integration || EventTypeInterface::LOCATION_TYPE_KOPANO_MEET !== $locationType) {
return;
}
if (!$integration->isEnabled()) {
return;
}
if ($eventType->isGroupMeetingType() && $event->getLocation()) {
return;
}
if ($event->isRecurring() && $event->getLocation()) {
return;
}
$domain = $integration->getConfig()['url'];
$invitee = $event->getInvitee();
$inviteeName = $invitee->getFullName();
$name = Transliterator::transliterate("$inviteeName-".$this->randomnessGenerator->generateUriSafeString(6));
$url = trim($domain, '/').'/meet/r/join/group/public/'.$name;
$event->setLocation($url);
}
private function findIntegration(UserInterface $user): ?IntegrationInterface
{
$integrationRepository = $this->entityManager->getRepository(Integration::class);
return $integrationRepository->findOneBy([
'type' => IntegrationType::TYPE_KOPANO_MEET,
'user' => $user,
]);
}
}