<?php
namespace App\EventSubscriber;
use App\Service\Client\Webmaster\WebmasterTrafficService;
use Symfony\Component\EventDispatcher\EventSubscriberInterface;
use Symfony\Component\HttpFoundation\RedirectResponse;
use Symfony\Component\HttpFoundation\Request;
use Symfony\Component\HttpKernel\Event\RequestEvent;
use Symfony\Component\HttpKernel\KernelEvents;
class WebmasterReferenceRequestSubscriber implements EventSubscriberInterface
{
const SESSION_KEY = 'webmaster_reference';
/**
* @var WebmasterTrafficService
*/
protected WebmasterTrafficService $trafficService;
/**
* @param WebmasterTrafficService $trafficService+
*/
public function __construct(WebmasterTrafficService $trafficService)
{
$this->trafficService = $trafficService;
}
public static function getSubscribedEvents(): array
{
return [
KernelEvents::REQUEST => [
['onKernelRequest', 1],
],
];
}
/**
* @param RequestEvent $event
* @return void
* @throws \Symfony\Contracts\HttpClient\Exception\ClientExceptionInterface
* @throws \Symfony\Contracts\HttpClient\Exception\RedirectionExceptionInterface
* @throws \Symfony\Contracts\HttpClient\Exception\ServerExceptionInterface
* @throws \Symfony\Contracts\HttpClient\Exception\TransportExceptionInterface
*/
public function onKernelRequest(RequestEvent $event)
{
$request = $event->getRequest();
if(!$event->isMainRequest() || !$request->isMethod('GET')) {
return;
}
$param = $request->query->get('wmid', $request->query->get('c', ''));
$campaignId = null;
$webmasterId = null;
if (preg_match('/6[0-9]{6}/', $param)) {
$webmasterId = $param;
} else {
$dec = base64_decode($param);
if (preg_match('/^([0-9]+)\|(6[0-9]{6})$/', $dec, $matches)) {
$campaignId = $matches[1];
$webmasterId = $matches[2];
} elseif (preg_match('/^(6[0-9]{6})\|([0-9]+)$/', $dec, $matches)) {
$webmasterId = $matches[1];
$campaignId = $matches[2];
}
}
if($webmasterId) {
if ($refererUrl = $request->server->get('HTTP_REFERER')) {
$referer = parse_url($refererUrl);
$refererHost = $referer['host'] ?? null;
}
$referenceData = [
'webmaster_id' => $webmasterId,
'campaign_id' => $campaignId,
'tracking_id' => (string) $request->query->get('trackingId')
];
$request->getSession()->set(self::SESSION_KEY, $referenceData);
$this->trafficService->createWebmasterTraffic((int)$webmasterId, [
// required in api
'http_request_uri' => $request->getRequestUri(),
'client_ip' => $request->server->get('HTTP_X_FORWARDED_FOR', $request->getClientIp()),
// optional in api
'referer_host' => $refererHost ?? null,
'referer_url' => $refererUrl,
'campaign_id' => $campaignId
]);
$event->setResponse($this->redirectToNonReferenceUrl($request));
}
}
/**
* @param Request $request
* @return RedirectResponse
*/
protected function redirectToNonReferenceUrl(Request $request): RedirectResponse
{
$parameters = array();
foreach ($request->query->all() as $key => $val) {
if ($key != 'wmid' && $key != 'c') {
$parameters[$key] = $val;
}
}
$url = $request->getPathInfo();
if ($queryString = http_build_query($parameters)) {
$url .= '?' . $queryString;
}
$baseUrl = $request->getBaseUrl();
if ($baseUrl && $baseUrl != '/') {
$url = $baseUrl . $url;
}
return new RedirectResponse($url);
}
}