<?php
namespace App\EventListener;
use App\Utils\UrlShortener;
use Symfony\Component\DependencyInjection\ParameterBag\ParameterBagInterface;
use Symfony\Component\HttpFoundation\Request;
use Symfony\Component\HttpKernel\Event\ExceptionEvent;
use Symfony\Component\HttpKernel\Event\RequestEvent;
use Symfony\Component\HttpFoundation\Response;
use Symfony\Component\HttpFoundation\Cookie;
use Symfony\Component\HttpKernel\Event\ResponseEvent;
use Symfony\Component\HttpKernel\Exception\BadRequestHttpException;
use Symfony\Component\HttpKernel\Exception\NotFoundHttpException;
use Twig\Environment;
class FmRequestListener
{
private UrlShortener $urlShortener;
private ParameterBagInterface $parameterBag;
private Environment $twig;
public function __construct(
UrlShortener $urlShortener,
ParameterBagInterface $parameterBag,
Environment $twig
) {
$this->urlShortener = $urlShortener;
$this->parameterBag = $parameterBag;
$this->twig = $twig;
}
public function onKernelRequest(RequestEvent $event)
{
$request = $event->getRequest();
$requestUri = $request->getUri();
$redirectCheck = $this->urlShortener->redirectCheck(
$request->server->get('SERVER_NAME'),
$request->server->get('REQUEST_URI')
);
if ($coupon = $request->query->get('coupon'))
{
if (strpos($requestUri, $_ENV['EF_URL']) !== false)
{
$request->getSession()->set('coupon', $coupon);
}
}
if (($productsInfo = $request->query->get('products_info')) && $productsInfo === 'true')
{
$request->getSession()->set('products_info', $productsInfo);
}
if ($redirectCheck)
$event->setResponse($redirectCheck);
if (strpos($requestUri, $_ENV['EF_URL']))
{
if (is_null($request->cookies->get('gos_portal_settings', null)))
$request->cookies->set('gos_portal_settings', $_ENV['EF_PORTAL_SETTINGS']);
$request->getSession()->set('portalSettingsHash', $_ENV['EF_PORTAL_SETTINGS']);
}
if (strpos($requestUri, $_ENV['US_URL']))
{
if (is_null($request->cookies->get('gos_portal_settings', null)))
$request->cookies->set('gos_portal_settings', $_ENV['US_PORTAL_SETTINGS']);
$request->getSession()->set('portalSettingsHash', $_ENV['US_PORTAL_SETTINGS']);
}
if (strpos($requestUri, '/api/chatbot/start')) {
$request->getSession()->remove('chatbot');
$request->getSession()->save();
}
}
public function onKernelResponse(ResponseEvent $event)
{
$request = $event->getRequest();
$response = $event->getResponse();
$time = time() + (3600 * 24 * 30);
$this->setRequestCookie($request, $response, 'a', $time);
$this->setRequestCookie($request, $response, 'f', $time);
$this->joinRequestAllCookie($request, $response, 'all_a', $time);
$this->joinRequestAllCookie($request, $response, 'all_f', $time);
$this->setRequestCookie($request, $response, 'c', $time);
$this->setRequestCookie($request, $response, 'chc', $time);
$this->setRequestCookie($request, $response, 'infoline', $time);
// $this->setMarketingCookie($request, $response, $time);
$this->setButtonParameterCookie($request, $response, $time);
if ($request->query->get('isTele', false) === 'yes')
{
$response->headers->setCookie(new Cookie('tele', 'yes'));
}
}
public function onKernelException(ExceptionEvent $event): void
{
$requestUri = $event->getRequest()->getUri();
if (!$event->getThrowable() instanceof NotFoundHttpException)
return;
$statusCode = $event->getThrowable()->getStatusCode();
if (strpos($requestUri, $_ENV['EF_URL']))
{
$response = new Response(
$this->twig->render('frontend-eforum/404.html.twig'),
404
);
$event->setResponse($response);
}
elseif (strpos($requestUri, $_ENV['US_URL']))
{
$userLocale = $event->getRequest()->getSession()->get('userLocale', 'pl');
$template = 'uniqskills/exception/error' . $statusCode . '.' . $userLocale . '.html.twig';
$pathToTemplate = $this->parameterBag->get('kernel.project_dir') . '/templates/' . $template;
if (file_exists($pathToTemplate))
{
$response = $this->createErrorResponse($template, $userLocale, $statusCode);
}
else
{
$response = $this->createErrorResponse('uniqskills/exception/error.html.twig', $userLocale, 500);
}
$event->setResponse($response);
}
else
{
// Default error page: templates/bundles/TwigBundle/Exception/error.html.twig
}
return;
}
private function createErrorResponse($template, $userLocale, $statusCode): Response
{
return new Response(
$this->twig->render(
$template,
[
'locale' => $userLocale,
'statusCode' => $statusCode
]
),
$statusCode
);
}
private function setRequestCookie(Request $request, Response $response, string $cookie, $time): void
{
if ($request->get($cookie))
{
$value = $request->get($cookie);
if (is_array($value))
{
$value = json_encode($value);
}
$response->headers->setCookie(new Cookie($cookie, $value, $time));
}
}
private function joinRequestAllCookie(Request $request, Response $response, string $cookie, $time): void
{
$newValue = $request->get(str_replace('all_', '', $cookie), '');
if (!empty($newValue)) {
$existingCookie = $request->cookies->get($cookie, '');
$newValue = explode(';', $newValue);
$existingCookie = explode(';', $existingCookie);
$newValue = array_merge($existingCookie, $newValue);
$newValue = implode(';', $newValue);
$response->headers->setCookie(new Cookie($cookie, trim($newValue, ';'), $time));
}
}
private function setMarketingCookie(Request $request, Response $response, $time): void
{
if ($request->isMethod('GET') && ($request->query->get('a') || $request->query->get('f')))
{
$marketingRow = [
(new \DateTime())->format('d-m-Y H:i:s'),
$request->query->get('a', $request->cookies->get('a', '')),
$request->query->get('f', $request->cookies->get('f', ''))
];
$marketingCookie = $request->cookies->get('marketing', json_encode([]));
$marketingCookie = json_decode($marketingCookie, true);
if (count($marketingCookie) > 9)
{
array_shift($marketingCookie);
}
$marketingCookie[] = $marketingRow;
$response->headers->setCookie(new Cookie('marketing', json_encode($marketingCookie), $time));
}
}
private function setButtonParameterCookie(Request $request, Response $response, $time): void
{
if ($request->query->get('bp'))
{
$bp = $request->cookies->get('bp', array());
if (!empty($bp))
{
$bp = json_decode($bp, false);
}
$bp[] = $request->query->get('bp');
$response->headers->setCookie(new Cookie('bp', json_encode(array_unique($bp)), $time));
}
}
}