<?php
namespace App\Controller\Frontend;
use App\Entity\Gos\OrderPart;
use App\Entity\Gos\Orders;
use App\Entity\Gos\PortalSettings;
use App\Utils\Encryption;
use App\Utils\PortalSettingsService;
use App\Utils\SB;
use App\Utils\Uniqskills\ProductFeed;
use App\Utils\Uniqskills\UserAccess;
use Doctrine\ORM\EntityManagerInterface;
use Symfony\Bundle\FrameworkBundle\Controller\AbstractController;
use Symfony\Component\HttpKernel\KernelInterface;
use Symfony\Component\Routing\Annotation\Route;
use Sensio\Bundle\FrameworkExtraBundle\Configuration\Template;
use Symfony\Component\HttpFoundation\BinaryFileResponse;
use Symfony\Component\HttpFoundation\RedirectResponse;
use Symfony\Component\HttpFoundation\JsonResponse;
use Symfony\Component\HttpFoundation\Request;
use Symfony\Component\HttpFoundation\Response;
use Symfony\Component\HttpFoundation\Cookie;
use Symfony\Component\Filesystem\Filesystem;
class BaseController extends AbstractController
{
private $em;
private $productFeedUtil;
private $encriptionUtil;
private $userAccessUtil;
private $sbUtil;
public function __construct(
EntityManagerInterface $_em,
ProductFeed $_productFeed,
Encryption $_encr,
UserAccess $_ua,
SB $_sbUtil
)
{
$this->em = $_em;
$this->productFeedUtil = $_productFeed;
$this->encriptionUtil = $_encr;
$this->userAccessUtil = $_ua;
$this->sbUtil = $_sbUtil;
}
/**
* @Route("/repair-rec/{wf}", name="fmMyTest")
*/
public function base($wf = null): Response
{
if ($wf)
{
$this->sbUtil->updateOrderTransactionResultStatus($wf, '2');
}
return new Response();
}
/**
* @Route("xml/course-list.xml", name="fmSalesManagoCourseList", defaults={"_format"="xml"} )
*/
public function showCourseListAction(Request $request, ProductFeed $productFeedService): Response
{
$link = $this->generateUrl($request->get('_route'), [], true);
$productList = $productFeedService->generateXMLProductFeed(
$link,
$request->attributes->get('_locale')
);
return new Response($productList->asXML());
}
/**
* @Route("xml/country/{country}/{add}/course-list.xml", name="fmSalesManagoCourseCountryListWpar", defaults={"_format"="xml"} )
* @Route("xml/country/{country}/course-list.xml", name="fmSalesManagoCourseCountryList", defaults={"_format"="xml"} )
*/
public function showCourseCountryList(Request $request, ProductFeed $productFeedService, $country = 'pl', $add = " "): Response
{
$link = $this->generateUrl($request->get('_route'), array(), true);
$productList = $productFeedService->generateXMLProductFeed(
$link,
$request->attributes->get('_locale'),
$country,
$add
);
return new Response($productList->asXML());
}
/**
* @Route("xml/gmc/{country}/course-list.xml", name="fmGMCCourseList", defaults={"_format"="xml"})
*/
public function showCourseForGMC(Request $request, ProductFeed $productFeedService, $country): Response
{
$link = $this->generateUrl($request->get('_route'), ['country' => $country], true);
$productList = $productFeedService->generateXMLProductFeed(
$link,
$request->attributes->get('_locale'),
$country,
null,
true
);
return new Response($productList->asXML());
}
/**
* @Route("/set/portalsetting/hash", name="fmBaseSetFormSettingHash")
*/
public function setFormSettingHash(Request $request, PortalSettingsService $portalSettingsService): Response
{
$response = new Response('error');
$hash = $request->request->get('hash');
if (!empty($hash))
{
$request->getSession()->set('formSettingHash', $hash);
$response->setContent('ok');
$response->headers->setCookie(
$portalSettingsService->createGosPortalSettingsCookie($hash)
);
$response->sendHeaders();
return $response;
}
return $response;
}
/**
* @Route("/api/safari_cookies_fix/", name="fmBaseSafariCoockiesFix")
* @Template()
*/
public function safariCookiesFix(Request $request): array
{
$referer = $request->query->get('referer');
$response = new Response('ok');
$response->headers->setCookie(
new Cookie(
'gos_safari_cookie',
1, strtotime('now + 1 year'),
'/',
null,
false,
false
)
);
$response->sendHeaders();
return ['referer' => $referer];
}
/**
* @Route("/ajax/touch-point-url", name="fmBaseTouchPointUrl", methods={"POST"})
*/
public function setTouchPointUrlAction(Request $request): JsonResponse
{
$url = $request->request->get('url');
return $this->json(['url' => $url]);
}
/**
* @Route("/robots.txt", name="fmBaseRobots")
*/
public function robots(Request $request, KernelInterface $kernel): Response
{
if ($request->getSession()->get('portalSettingsHash') === $_ENV['US_PORTAL_SETTINGS'])
{
if ($this->getParameter('us_portal_settings') === $_ENV['PL_US_PORTAL_SETTINGS'])
{
return $this->redirectToRoute('fmUniqskillsHomePage');
}
$portalHash = $_ENV['US_PORTAL_SETTINGS'];
$fileName = 'uk-robots.txt';
}
else
{
$portalHash = $_ENV['EF_PORTAL_SETTINGS'];
$fileName = 'robots.txt';
}
$robotsFilePath = $kernel->getProjectDir() . '/public/robots/'.$fileName;
/** @var PortalSettings $portalSettings */
$portalSettings = $this->em->getRepository(PortalSettings::class)
->findOneByHash($portalHash);
if (
!is_null($portalSettings)
&&
!empty($portalSettings->getRobotsTxt())
)
{
$response = new Response($portalSettings->getRobotsTxt());
$response->headers->set('Content-Type', 'text/plain');
$response->send();
}
return new BinaryFileResponse($robotsFilePath);
}
/**
* @Route("/redirect", name="tryToRedirect")
* redirecting user to order/success/(WF) page if cookie with (WF) is found (and order isn't paid)
* if cookie not found/order paid -> redirect to courses
*/
public function redirectChecker(Request $request): RedirectResponse
{
$cookies = $request->cookies;
if ($cookies->has('FM_ORDER_ID'))
$fm = $cookies->get('FM_ORDER_ID');
else
$fm = '';
$wf = $this->getWfByFm($fm);
if ($this->isOrderPaid($wf) || $wf == '')
{
if ($request->getLocale() == 'pl')
return $this->redirectToRoute('fmUniqskillsFrontendPlCourseCatalogue');
else
return $this->redirectToRoute('fmUniqskillsFrontendCourseCatalogue');
}
else
{
/** @var $order Orders */
$order = $this->em->getRepository(Orders::class)->findOneByOrdTran($fm);
$cc = $order->getCountry()->getLanguage()->getCode();
return $this->redirectToRoute('fmUniqskillsCartSuccess', [
'ordTran' => $wf,
'_locale' => $cc
]);
}
}
private function isOrderPaid($_wf): int
{
return $this->userAccessUtil->checkOrderIsPaid($_wf);
}
private function getWfByFm($_fm)
{
$wf = false;
$order = $this->em->getRepository(Orders::class)->findOneBy(['ordTran' => $_fm]);
/** @var OrderPart $orderPart */
foreach ($order->getOrderPart() as $orderPart)
{
$wf = $orderPart->getOrdTran();
if ($wf)
{
break;
}
}
return $wf;
}
}