<?php
namespace WebBundle\Listener;
use Exception;
use FlexApp\Security\LoginFormAuthenticator;
use Symfony\Component\HttpFoundation\RedirectResponse;
use Symfony\Component\HttpFoundation\Request;
use Symfony\Component\HttpKernel\Event\RequestEvent;
use Symfony\Contracts\Translation\TranslatorInterface;
use WebBundle\Constant\CookieKeysConstant;
use WebBundle\Controller\VacancyController;
use Symfony\Component\HttpKernel\Exception\NotFoundHttpException;
use Symfony\Component\Routing\Route;
use WebBundle\Controller\SeoController;
use WebBundle\Entity\User;
use WebBundle\Handler\Locale\LocaleHandler;
use WebBundle\Helper\App;
use WebBundle\Helper\CookieHelper;
use WebBundle\Helper\LocaleHelper;
use WebBundle\Helper\UserHelper;
use WebBundle\Service\LocationService;
use function Symfony\Component\String\u;
class RequestListener
{
public TranslatorInterface $translator;
private LocationService $locationService;
public function __construct(TranslatorInterface $translator, LocationService $locationService)
{
$this->locationService = $locationService;
$this->translator = $translator;
}
/**
* onKernelRequest - 1st request processing function for processing inputed data
* Обработчик первых входящих запросов, только прием/правка входящих запросов.
*
* @param RequestEvent $event
* @return Request
* @throws Exception
*/
public function onKernelRequest(RequestEvent $event): Request
{
if ($event->getRequest()->attributes->get('_route') == 'app_buy_order' && $event->getRequest()->attributes->has('orderId')) {
$response = new RedirectResponse(App::generateUrl('app_order', ['hash' => $event->getRequest()->attributes->get('orderId')]));
$event->setResponse($response);
return $event->getRequest();
}
// SEO source of user origin, native or from searching
$request = $event->getRequest();
$route = $request->get('_route');
$paramsRoute = $request->get('_route_params');
if ($route && !empty($paramsRoute['_locale'])) {
/* @var User $user */
$user = App::getCurUser();
if ($route == LoginFormAuthenticator::LOGIN_ROUTE && $user) {
$redirectUrl = $request->query->get('redirect_url');
if ($redirectUrl) {
$response = new RedirectResponse(urldecode($redirectUrl));
} else {
$response = new RedirectResponse(App::generateUrl('app_home'));
}
$event->setResponse($response);
return $request;
}
// отключаем локаль для сайтмапа
$requestUri = $request->getRequestUri();
if (str_starts_with($requestUri, '/sitemap')) {
return $request;
}
if ($request->get('source') && CookieHelper::get(CookieKeysConstant::SOURCE) == null) {
CookieHelper::set(CookieKeysConstant::SOURCE, $request->get('source'));
} else {
if (!empty($_SERVER['HTTP_REFERER'])) {
if ($_SERVER['HTTP_REFERER'] == 'https://www.google.com/') {
CookieHelper::set(CookieKeysConstant::SOURCE, 'google search');
}
}
}
if (!u($requestUri)->containsAny(['te_dev.php', 'no-forwarding=1'])) {
$localeRequestHandler = new LocaleHandler($request, $this->locationService);
$response = $localeRequestHandler->do();
if (null !== $response) {
CookieHelper::save($response);
$event->setResponse($response);
return $request;
}
}
$countryCode = CookieHelper::get(CookieKeysConstant::COUNTRY) ?? 'us';
// если нет еще системы счисления записываем
$meaKey = in_array($countryCode, ['us', 'ca']) ? 'measureFt' : 'measure';
$measure = CookieHelper::get($meaKey);
if (!in_array($measure, LocaleHelper::getMeasureList($countryCode))) {
$measure = LocaleHelper::getMeasureList($countryCode)[0];
}
if (CookieHelper::get($meaKey) != $measure) {
CookieHelper::set($meaKey, $measure, ['httponly' => false, ]);
}
// записываем Валюту под загруженный uri
$currency = CookieHelper::get(CookieKeysConstant::CURRENCY);
if (!in_array($currency, LocaleHelper::getCurrencyList($countryCode))) {
$currency = LocaleHelper::getCurrencyList($countryCode)[0];
}
if (CookieHelper::get(CookieKeysConstant::CURRENCY) != $currency) {
CookieHelper::set(CookieKeysConstant::CURRENCY, $currency, ['httponly' => false, ]);
}
$userHelper = UserHelper::getInstance();
if ($user && $user->getToken() != $userHelper->getToken()) {
if ($user->getToken() != null) {
$userHelper->setToken($user->getToken());
}
}
}
return $request;
}
}