src/EventSubscriber/RequireTermsAcceptanceSubscriber.php line 59

Open in your IDE?
  1. <?php
  2. declare(strict_types=1);
  3. namespace Harmonizely\EventSubscriber;
  4. use Harmonizely\Core\Security\Contract\ISecurityHelper;
  5. use Harmonizely\Model\UserInterface;
  6. use Harmonizely\Service\Panel\Terms\Contract\IGetTermsAcceptanceStatusService;
  7. use Symfony\Component\EventDispatcher\EventSubscriberInterface;
  8. use Symfony\Component\HttpFoundation\RedirectResponse;
  9. use Symfony\Component\HttpKernel\Event\RequestEvent;
  10. use Symfony\Component\HttpKernel\KernelEvents;
  11. use Symfony\Component\Routing\RouterInterface;
  12. final class RequireTermsAcceptanceSubscriber implements EventSubscriberInterface
  13. {
  14.     private const SKIP_ROUTE_PREFIXES = [
  15.         'fos_user_security_',
  16.         'fos_user_registration_',
  17.         'fos_user_resetting_',
  18.         'panel.login.',
  19.         'panel.api.login.',
  20.         'panel.api.sso.',
  21.         'panel.api.reauth.',
  22.         'panel.api.logout',
  23.         'panel.user_relation.login',
  24.         'okta.oauth.',
  25.         'login.',
  26.         'reauth.',
  27.         'consent_',
  28.         'hrm_welcome_index',
  29.         'validate_user_verification_code.base',
  30.         'validate_user_verification_code',
  31.     ];
  32.     private RouterInterface $router;
  33.     private ISecurityHelper $securityHelper;
  34.     private IGetTermsAcceptanceStatusService $statusService;
  35.     public function __construct(
  36.         RouterInterface $router,
  37.         ISecurityHelper $securityHelper,
  38.         IGetTermsAcceptanceStatusService $statusService
  39.     )
  40.     {
  41.         $this->router $router;
  42.         $this->securityHelper $securityHelper;
  43.         $this->statusService $statusService;
  44.     }
  45.     public static function getSubscribedEvents(): array
  46.     {
  47.         return [
  48.             KernelEvents::REQUEST => ['redirect'],
  49.         ];
  50.     }
  51.     public function redirect(RequestEvent $event): void
  52.     {
  53.         if (!$event->isMasterRequest()) {
  54.             return;
  55.         }
  56.         if (!$this->securityHelper->getUser() instanceof UserInterface) {
  57.             return;
  58.         }
  59.         if ($this->securityHelper->getLoginType() === ISecurityHelper::LOGIN_TYPE_API_TOKEN) {
  60.             return;
  61.         }
  62.         $routeName $event->getRequest()->get('_route');
  63.         if (null === $routeName || $this->shouldSkipRoute($routeName)) {
  64.             return;
  65.         }
  66.         if ($this->statusService->perform()->requiresAcceptance()) {
  67.             $event->setResponse(new RedirectResponse($this->router->generate('terms_acceptance_index')));
  68.         }
  69.     }
  70.     private function shouldSkipRoute(string $routeName): bool
  71.     {
  72.         if ($routeName === 'terms_acceptance_index') {
  73.             return true;
  74.         }
  75.         foreach (self::SKIP_ROUTE_PREFIXES as $prefix) {
  76.             if (=== strpos($routeName$prefix)) {
  77.                 return true;
  78.             }
  79.         }
  80.         return false;
  81.     }
  82. }