<?php
namespace Harmonizely\EventSubscriber;
use Harmonizely\Service\Core\CompanySelector;
use Harmonizely\Service\Core\Contract\ICompanySelector;
use Psr\Log\LoggerInterface;
use Symfony\Component\Console\ConsoleEvents;
use Symfony\Component\Console\Event\ConsoleCommandEvent;
use Symfony\Component\EventDispatcher\EventSubscriberInterface;
use Symfony\Component\HttpFoundation\RedirectResponse;
use Symfony\Component\HttpKernel\Event\RequestEvent;
use Symfony\Component\HttpKernel\KernelEvents;
final class CompanyDetectSubscriber implements EventSubscriberInterface
{
private const REGISTRATION_URI = '/register/';
/**
* @var ICompanySelector
*/
private ICompanySelector $companySelector;
/**
* @var LoggerInterface
*/
private LoggerInterface $logger;
/**
* @param ICompanySelector $companySelector
* @param LoggerInterface $logger
*/
public function __construct(
ICompanySelector $companySelector,
LoggerInterface $logger
)
{
$this->companySelector = $companySelector;
$this->logger = $logger;
}
/**
* @return array[]
*/
public static function getSubscribedEvents(): array
{
return [
KernelEvents::REQUEST => ['companyDetectRequest', 9999],
ConsoleEvents::COMMAND => ['companyDetectCommand', 9999],
];
}
/**
* @param RequestEvent $event
*/
public function companyDetectRequest(RequestEvent $event): void
{
$company = $event->getRequest()->server->get('COMPANY');
// $this->logger->critical('COMPANY FROM SERVER: ' . $company);
//TODO спросить у Димы!
if ($event->isMasterRequest() === false) {
return;
}
// $this->logger->critical('SET COMPANY FROM SERVER!');
if ($company) {
if ($event->getRequest()->getPathInfo() === self::REGISTRATION_URI && $company !== CompanySelector::DEFAULT_COMPANY) {
//TODO hotfix for redirect from registration page for team blue
$event->setResponse(new RedirectResponse('https://secure.simplymeet.me/register/'));
return;
}
$this->companySelector->setCompany($company, false, false);
if ($event->getRequest()->hasSession()) {
$sessionName = 'sid_' . $company;
if ($sessionName !== $event->getRequest()->getSession()->getName()) {
$event->getRequest()->getSession()->setName($sessionName);
}
}
} else {
$this->companySelector->companyRequired();
}
}
/**
* @param ConsoleCommandEvent $event
*/
public function companyDetectCommand(ConsoleCommandEvent $event): void
{
if ($event->getInput()->hasOption('company') && $event->getInput()->getOption('company')) {
$this->companySelector->setCompany($event->getInput()->getOption('company'));
}
}
}