src/Component/CompanyMatch/EventSubscriber/CompanyMatchEventSubscriber.php line 82

Open in your IDE?
  1. <?php
  2. namespace App\Component\CompanyMatch\EventSubscriber;
  3. use App\Component\CompanyMatch\Client\CompanyMatchClient;
  4. use App\Component\CompanyMatch\Event\CompanyMatchUserViewedEvent;
  5. use App\Component\CompanyMatch\Form\Setting\CompanyMatchSettingType;
  6. use App\Component\CompanyMatch\Util\CompanyMatchUserHistorian;
  7. use App\Component\CompanyMatch\Util\CompanyMatchUtil;
  8. use App\Entity\SiteUserData;
  9. use App\Event\SettingsSavedEvent;
  10. use App\EventListener\FeatureFlagListener;
  11. use Doctrine\ORM\EntityManagerInterface;
  12. use Flagception\Manager\FeatureManagerInterface;
  13. use FOS\UserBundle\Controller\ResettingController;
  14. use FOS\UserBundle\Event\FilterUserResponseEvent;
  15. use FOS\UserBundle\Event\FormEvent;
  16. use FOS\UserBundle\FOSUserEvents;
  17. use Symfony\Component\EventDispatcher\EventSubscriberInterface;
  18. use Symfony\Component\HttpFoundation\RedirectResponse;
  19. use Symfony\Component\Routing\RouterInterface;
  20. use Symfony\Component\Security\Http\Event\LoginSuccessEvent;
  21. class CompanyMatchEventSubscriber implements EventSubscriberInterface
  22. {
  23.     public function __construct(
  24.         private readonly CompanyMatchClient $client,
  25.         private readonly EntityManagerInterface $entityManager,
  26.         private readonly FeatureManagerInterface $featureManager,
  27.         private readonly ResettingController $resettingController,
  28.         private readonly RouterInterface $router,
  29.         protected readonly CompanyMatchUserHistorian $companyMatchUserHistorian,
  30.     ) {
  31.     }
  32.     public static function getSubscribedEvents(): array
  33.     {
  34.         return [
  35.             SettingsSavedEvent::class => 'settingsSaved',
  36.             FOSUserEvents::REGISTRATION_SUCCESS => ['userRegistered', -50],
  37.             FOSUserEvents::REGISTRATION_COMPLETED => ['userRegisteredCompleted', -50],
  38.             LoginSuccessEvent::class => 'onLoginSuccess',
  39.             CompanyMatchUserViewedEvent::class => 'userViewed',
  40.         ];
  41.     }
  42.     public function settingsSaved(SettingsSavedEvent $event): void
  43.     {
  44.         if (!$this->featureCheck()) {
  45.             return;
  46.         }
  47.         if (CompanyMatchSettingType::class !== \get_class($event->getType())) {
  48.             return;
  49.         }
  50.         $this->client->updateUrlToken();
  51.         $event->stopPropagation();
  52.     }
  53.     public function userRegistered(FormEvent $event): void
  54.     {
  55.         if (!$this->featureCheck()) {
  56.             return;
  57.         }
  58.         if (
  59.             !empty(CompanyMatchUtil::getCookie($event->getRequest()))
  60.             || 'pages_user_register' === $event->getRequest()->attributes->get('_route')
  61.         ) {
  62.             $event->setResponse(new RedirectResponse($this->router->generate('pages_user_dashboard')));
  63.             return;
  64.         }
  65.         $event->setResponse(new RedirectResponse($this->router->generate('company_match_init', [
  66.             'email' => $event->getForm()->getData()->getEmail(),
  67.             'user_dashboard' => true,
  68.         ])));
  69.     }
  70.     public function userRegisteredCompleted(FilterUserResponseEvent $event): void
  71.     {
  72.         if (!$this->featureCheck()) {
  73.             return;
  74.         }
  75.         if (($request $event->getRequest())
  76.             && ($user $event->getUser())->getPasswordRequestedAt() instanceof \DateTime
  77.         ) {
  78.             $request->attributes->set('username'$user->getUsername());
  79.             $this->resettingController->sendEmailAction($request);
  80.         }
  81.     }
  82.     public function userViewed(CompanyMatchUserViewedEvent $event): void
  83.     {
  84.         $this->companyMatchUserHistorian->increaseViewCount($event->getCompanySiteUser());
  85.     }
  86.     public function onLoginSuccess(LoginSuccessEvent $event): void
  87.     {
  88.         if (!$this->featureCheck()) {
  89.             return;
  90.         }
  91.         if ('front_secured_area' !== $event->getFirewallName()) {
  92.             return;
  93.         }
  94.         if (($user $this->entityManager->getRepository(SiteUserData::class)
  95.                 ->findOneBy(['user' => $event->getUser()])) instanceof SiteUserData
  96.             && null !== ($companyMatchToken $user->getCompanyMatchToken())
  97.         ) {
  98.             CompanyMatchUtil::setCookie($event->getResponse(), $companyMatchToken);
  99.         }
  100.     }
  101.     private function featureCheck(): bool
  102.     {
  103.         return $this->featureManager->isActive(FeatureFlagListener::FEATURE_COMPANY_MATCH);
  104.     }
  105. }