<?php
namespace App\Twig;
use App\Entity\Main\Tracking;
use App\Entity\Main\TrackingHasABTest;
use App\EventListener\Main\DebugListener;
use App\Services\TrackingManager;
use Twig\Extension\AbstractExtension;
use Symfony\Component\HttpFoundation\RequestStack;
use Twig\TwigFunction;
/**
* Class TrackingExtension
* @package App\Twig
*/
class TrackingExtension extends AbstractExtension
{
protected $session;
/**
* @var RequestStack
*/
protected $requestStack;
protected $trackingManager;
protected $trackingFactory;
protected $allowedDebugIp;
protected $environment;
/**
* TrackingExtension constructor.
* @param RequestStack $requestStack
* @param TrackingManager $trackingFactory
* @param array $allowedDebugIp
* @param string $environment
*/
public function __construct(RequestStack $requestStack, TrackingManager $trackingFactory, $allowedDebugIp = [], $environment = 'prod')
{
if ($requestStack->getCurrentRequest()) {
$this->session = $requestStack->getCurrentRequest()->getSession();
}
$this->requestStack = $requestStack;
$this->trackingFactory = $trackingFactory;
$this->allowedDebugIp = $allowedDebugIp;
$this->environment = $environment;
}
/**
* @return array
*/
public function getFunctions(): array
{
return array(
new TwigFunction('getTrackingDebug', array($this, 'getTrackingDebug')),
new TwigFunction('getTrackingComment', array($this, 'getTrackingComment')),
);
}
/**
* Used to display tracking to the autorised Ips
* @return string
*/
public function getTrackingDebug(Tracking $tracking = null, $class = null)
{
if (!$this->isAllowedToSeeDebug()) {
return;
}
$debug = $this->getTrackingString($tracking);
return "<div class=\"topnav {$class}\" style='background-color: darkgrey;overflow: hidden; position: fixed; left: 0; bottom: 40px'>debug : {$debug}</div>";
}
/**
* Used to inject tracking data in the html
* @return string
*/
public function getTrackingComment(Tracking $tracking = null)
{
if (!$this->isAllowedToSeeDebug()) {
return;
}
$comment = $this->getTrackingString($tracking);
return "<!-- {$comment} -->";
}
/**
* @return bool|string
*/
private function getTrackingString(Tracking $tracking)
{
// put the debug in there :)
$debug = "Aff : " . $this->trackingFactory->resolveAffiliate($tracking)->getAffiliateId();
$debug .= ", trid : " . $tracking->getTrackingId();
$debug .= ", Device : " . $tracking->getDevice();
$debug .= ", dcode: " . $this->session->get('dcode');
if (count($tracking->getAbTests())) {
$debug .= ", AB Tests = ";
/** @var TrackingHasABTest $trackingHasAbtest */
foreach ($tracking->getAbTests() as $trackingHasAbtest) {
$debug .= $trackingHasAbtest->getVersion() . " - ";
}
}
$forcedABTests = $this->session->get(DebugListener::DEBUG_DATA_SESSION)[DebugListener::DEBUG_FORCED_ABTESTS] ?? [];
if (count($forcedABTests)) {
$debug .= ", Forced AB Tests = ";
/** @var TrackingHasABTest $trackingHasAbtest */
foreach ($forcedABTests as $forcedABTest) {
$debug .= $forcedABTest . " - ";
}
}
// check for 3ds.
if ($this->session->get('force_3ds')) {
$debug .= ", Forced 3DS = true";
} else {
$debug .= ", Forced 3DS = false";
}
return $debug;
}
/**
* @return bool
*/
private function isAllowedToSeeDebug()
{
$debugAllowed = false;
if (in_array($this->requestStack->getCurrentRequest()->getClientIp(), $this->allowedDebugIp) || in_array($this->environment, ['test', 'dev'])) {
$debugAllowed = true;
}
return $debugAllowed;
}
public function getName()
{
return 'tracking_extension';
}
}