<?php
namespace App\Controller\Api;
use App\Entity\Stop;
use App\Entity\StopExt;
use App\Entity\TrackClick;
use App\Service\Client\ClientRepository;
use App\Service\Client\LocaleRedirect;
use App\Service\Client\RedirectParams;
use App\Service\TrackingService;
use App\Utils\StringUtils;
use Doctrine\ORM\EntityManagerInterface;
use Symfony\Bundle\FrameworkBundle\Controller\AbstractController;
use Symfony\Component\HttpFoundation\Request;
use Symfony\Component\HttpFoundation\Response;
use Symfony\Component\Routing\Annotation\Route;
use Symfony\Contracts\Translation\TranslatorInterface;
/**
* @Route(options={"i18n"=false})
* Handles the redirection
*/
class RedirectController extends AbstractController {
/**
* Redirects to a company (agency/carrier) search page
* @Route("/{_locale}/redirect", name="redirectA")
* FIXME use ParamConverter
*/
public function redirectToCompanyParamAction(Request $request, ClientRepository $clientRepo, TrackingService $trackingService, TranslatorInterface $translator, EntityManagerInterface $em): Response {
$companyId = $request->query->get('companyId');
$depStopExt = $request->query->get('depStopExt');
$arrStopExt = $request->query->get('arrStopExt');
$depStopId = $request->query->get('depStopId');
$arrStopId = $request->query->get('arrStopId');
$dateFrom = $request->query->get('dateFrom');
$datetimeFrom = $request->query->get('datetimeFrom');
$dateTo = $request->query->get('dateTo') == "null" ? null : $request->query->get('dateTo');
$cents = $request->query->get('cents');
$link = $request->query->get('link'); //has been encode with js encodeURIComponent and decoded fine by symfony. Escape encoding again using raw() in twig
$isDebug = $request->query->get('debug') == 'true';
$sponsorised = $request->query->get('sponsorised');
$adinsert = $request->query->get('adinsert');
$type = $request->query->get('type');
$currency = $translator->trans('settings.defaultcountry.currency');
$full_locale = $translator->trans('settings.defaultcountry.locale');
//Lazy loading of params
/** @var Stop $depStop */
$depStop = $em->getReference(Stop::class, $depStopId);
/** @var Stop $arrStop */
$arrStop = $em->getReference(Stop::class, $arrStopId);
/** @var StopExt $depStopExtObj */
$depStopExtObj = $em->getReference(StopExt::class, ['code' => $depStopExt, 'companyId' => $companyId]);
/** @var StopExt $arrStopExtObj */
$arrStopExtObj = $em->getReference(StopExt::class, ['code' => $arrStopExt, 'companyId' => $companyId]);
$c = new TrackClick();
$c->setCompanyId($companyId)->setDepStopId($depStop)->setArrStopId($arrStop)
->setDepDatetime(new \DateTime($datetimeFrom ?: $dateFrom))
->setCents((int)$cents)->setCurrency(null)
->setIp($request->getClientIp())
->setUa(substr($request->headers->get('User-Agent'), 0, 255))
->setUrl(substr($request->getUri(), 0, 511));
$trackingService->createTrackClick($request->cookies, $c);
$params = new RedirectParams();
$params->setCompanyId($companyId)
->setDepStopExt($depStopExtObj)
->setArrStopExt($arrStopExtObj)
->setDepStop($depStop)
->setArrStop($arrStop)
->setDateFrom($dateFrom)
->setDatetimeFrom($datetimeFrom)
->setDateTo($dateTo)
->setLink($link)
->setSponsorised($sponsorised)
->setAdinsert($adinsert)
->setIsDebug($isDebug)
->setLocale(new LocaleRedirect($full_locale))
->setOldLocale($request->getLocale()) //TODO : remove all locale
->setCents($cents)
->setCurrency($currency)
->setType($type);
$param = ['p' => $params];
$scraper = $clientRepo->find($companyId); //TODO duplicated code
$scraper->redirect($params); //call if needed some code specific to provider
$response = $this->render($scraper->getTwigRedirectView(),$param);
//add tracking cookie for companies using our tracking tool
if($scraper->isCbTracking()) {
$response->headers->setCookie(TrackingService::createCookie($companyId));
}
return $response;
}
/**
* Track a link simpler
* @Route("/redirect/url/{link}", name="redirect_link2", requirements={"link"=".+"})
* https://test-www.comparabus.com/redirect/url/https://www.flixbus.es
* http://local-www.comparabus.com:8000/redirect/url/https://www.flixbus.es
*/
public function redirect2Action($link = ''): Response {
return $this->redirectToLink($link);
}
/**
* Track a link
* @Route("/redirect/link", name="redirect_link")
* Eg: https://www.voyages-sncf.com/train/trajet/paris/lyon
* Tool is location src/App/Resources/views/Admin/tool/index.html.twig
*/
public function redirectAction(Request $r): Response {
$link = $r->query->get('link');
return $this->redirectToLink($link);
}
public function redirectToLink(string $link) : Response {
//if the link doesn't have http we add it
if (!StringUtils::startsWith($link, 'http') && !StringUtils::startsWith($link, 'https')) {
$link = 'https://' . $link;
}
if (StringUtils::contains($link, 'voyages-sncf.com') || StringUtils::contains($link, 'oui.sncf') || StringUtils::contains($link, 'sncf-connect.com')) {
return $this->redirect('https://clk.tradedoubler.com/click?p=277240&a=2969116&g=23705060&url=https://v.oui.sncf/dynclick/vsc-fr/?etf-publisher=Comparabus&etf-name=Comp_Comparabrus_Core_0917&tduid=[td_guid]&eurl='. urlencode($link) . "&PREX=A_COM_5307733AC2571");
} else if (StringUtils::contains($link, 'ouibus.com') || StringUtils::contains($link, 'blablabus.com')) { //fr.ouibus.com or www.ouibus.com
return $this->redirect('http://action.metaffiliation.com/trk.php?mclic=P484A755C169171&redir='. urlencode($link));
} else if (StringUtils::contains($link, 'flixbus.')
|| StringUtils::contains($link, 'flixcar.')) {
$dotlang = null;
$tld = StringUtils::substringAfterLast($link, '.'); // /!\ won't work for toto.co.uk
switch ($tld) {
case 'es':
case 'fr':
case 'de':
$dotlang = $tld;
break;
case 'en':
default:
$dotlang = 'com';
}
$link .= StringUtils::contains($link, '?') ? '&' : '?';
return $this->redirect($link . "wt_mc=paid.$dotlang.flixbus.meta.comparabus.comparabus_com.NS.ad&utm_medium=meta&utm_source=comparabus&utm_campaign=comparabus_com&irpid=420879&ircid=5610#Q0C36");
} else if (StringUtils::contains($link, 'eurolines.fr') || StringUtils::contains($link, 'isilines.fr')) {
return $this->redirect('http://tracking.publicidees.com/clic.php?progid=1555&partid=36266&dpl='. urlencode($link));
} else if (StringUtils::contains($link, '.thalys.')) {
//TODO remove promoid when offert is done with thalys
return $this->redirect('http://tracking.publicidees.com/clic.php?progid=4066&partid=36266&promoid=184900&dpl='. urlencode($link));
} else if (StringUtils::contains($link, 'booking.com')) {
// if(ScraperUtil::contains($link, "&")) die('error link');
$link .= StringUtils::contains($link, '?') ? '&' : '?';
return $this->redirect($link .'aid=1223947');
} else if (StringUtils::contains($link, 'ouigo.com')) {
return $this->redirect('https://clk.tradedoubler.com/click?p=234734&a=2777912&g=24513336&url='. urlencode($link));
} else if (StringUtils::contains($link, 'autocars-lozere.com')) {
$link .= StringUtils::contains($link, '?') ? '&' : '?';
return $this->redirect($link .'utm_campaign=acquisition_aff_17&utm_content=recherche-1-2&utm_medium=comparateur&utm_source=comparabus');
} else if (StringUtils::contains($link, 'www.terravision.eu')) {
$link .= StringUtils::contains($link, '?') ? '&' : '?';
return $this->redirect($link .'af=2349235');
} else if (StringUtils::contains($link, 'driiveme.com')) {
$link .= StringUtils::contains($link, '?') ? '&' : '?';
return $this->redirect($link .'partnerId=46');
} else if (StringUtils::contains($link, 'blablacar.')) {
$link .= StringUtils::contains($link, '?') ? '&' : '?';
return $this->redirect($link.'utm_source=COMPARABUS&utm_medium=Partnership&utm_campaign=FR_COMPARABUS_PSGR_TrajetsAtoB_Rech&comuto_cmkt=FR_COMPARABUS_PSGR_TrajetsAtoB_Rech');
} else if (StringUtils::contains($link, 'izy.com')) {
return $this->redirect('https://tracking.publicidees.com/clic.php?partid=36298&progid=4700&promoid=0&url='. urlencode($link));
} else {
//404; because external website uses that redirection for their content (SEO? hacking?)
throw $this->createNotFoundException('Redirection not found!');
}
}
/**
* Lets the webpage be verified by other website
* @Route("/2987522.html", name="check_page")))
*/
public function checkPageAction(Request $r): Response {
return new Response();
}
}