src/EventSubscriber/CreateKopanoMeetLinkSubscriber.php line 47

Open in your IDE?
  1. <?php
  2. declare(strict_types=1);
  3. namespace Harmonizely\EventSubscriber;
  4. use Behat\Transliterator\Transliterator;
  5. use Doctrine\ORM\EntityManagerInterface;
  6. use Harmonizely\CalendarEvents;
  7. use Harmonizely\EventTypes\LocationTypeProvider;
  8. use Harmonizely\Generator\RandomnessGeneratorInterface;
  9. use Harmonizely\Model\EventInterface;
  10. use Harmonizely\Model\EventTypeInterface;
  11. use Harmonizely\Model\Integration;
  12. use Harmonizely\Model\IntegrationInterface;
  13. use Harmonizely\Model\UserInterface;
  14. use Harmonizely\Types\Company\IntegrationType;
  15. use Symfony\Component\EventDispatcher\EventSubscriberInterface;
  16. use Symfony\Component\EventDispatcher\GenericEvent;
  17. use Webmozart\Assert\Assert;
  18. final class CreateKopanoMeetLinkSubscriber implements EventSubscriberInterface
  19. {
  20.     private $entityManager;
  21.     private $randomnessGenerator;
  22.     private LocationTypeProvider $locationTypeProvider;
  23.     public function __construct(
  24.         EntityManagerInterface $entityManager,
  25.         RandomnessGeneratorInterface $randomnessGenerator,
  26.         LocationTypeProvider $locationTypeProvider
  27.     ) {
  28.         $this->entityManager $entityManager;
  29.         $this->randomnessGenerator $randomnessGenerator;
  30.         $this->locationTypeProvider $locationTypeProvider;
  31.     }
  32.     public static function getSubscribedEvents(): array
  33.     {
  34.         return [
  35.             CalendarEvents::EVENT_PRE_CREATE => 'createMeeting',
  36.         ];
  37.     }
  38.     public function createMeeting(GenericEvent $event): void
  39.     {
  40.         /** @var EventInterface $event */
  41.         $event $event->getSubject();
  42.         Assert::isInstanceOf($eventEventInterface::class);
  43.         $eventType $event->getEventType();
  44.         $user $event->getUser();
  45.         $locationType $this->locationTypeProvider->provideFor($eventType$user$event);
  46.         $integration $this->findIntegration($user);
  47.         if (null === $integration || EventTypeInterface::LOCATION_TYPE_KOPANO_MEET !== $locationType) {
  48.             return;
  49.         }
  50.         if (!$integration->isEnabled()) {
  51.             return;
  52.         }
  53.         if ($eventType->isGroupMeetingType() && $event->getLocation()) {
  54.             return;
  55.         }
  56.         if ($event->isRecurring() && $event->getLocation()) {
  57.             return;
  58.         }
  59.         $domain $integration->getConfig()['url'];
  60.         $invitee $event->getInvitee();
  61.         $inviteeName $invitee->getFullName();
  62.         $name Transliterator::transliterate("$inviteeName-".$this->randomnessGenerator->generateUriSafeString(6));
  63.         $url trim($domain'/').'/meet/r/join/group/public/'.$name;
  64.         $event->setLocation($url);
  65.     }
  66.     private function findIntegration(UserInterface $user): ?IntegrationInterface
  67.     {
  68.         $integrationRepository $this->entityManager->getRepository(Integration::class);
  69.         return $integrationRepository->findOneBy([
  70.             'type' => IntegrationType::TYPE_KOPANO_MEET,
  71.             'user' => $user,
  72.         ]);
  73.     }
  74. }