<?php
namespace App\Controller\Front;
use App\Config\Pages;
use App\Entity\Page\Page;
use App\Entity\Page\PageTranslation;
use App\Factory\ApplicationFactoryInterface;
use App\Provider\BlogProviderInterface;
use App\Provider\FooterLinkProviderInterface;
use App\Service\RecaptchaServiceInterface;
use Symfony\Component\HttpFoundation\Request;
use App\Utils\ResponseMessage\ResponseMessage;
use Symfony\Component\HttpFoundation\Response;
use App\Provider\ItemCategoryProviderInterface;
use App\Provider\Offer\OfferProviderInterface;
use App\Provider\PageProviderInterface;
use App\Provider\SeoIndustryProviderInterface;
use App\Service\ApplicationServiceInterface;
use Doctrine\ORM\NoResultException;
use Exception;
use Symfony\Bundle\FrameworkBundle\Controller\AbstractController;
use Symfony\Component\Routing\Annotation\Route;
use Sensio\Bundle\FrameworkExtraBundle\Configuration\ParamConverter;
/**
* @Route("", name="front-")
*/
class PageController extends AbstractController
{
private const OFFER_VIEW_TEMPLATE_PATH = 'front/offer/offer_preview/offer_preview.twig';
private const BLOG_VIEW_TEMPLATE_PATH = 'front/blog/blog_item.twig';
public function __construct(
private PageProviderInterface $pageProvider,
private OfferProviderInterface $offerProvider,
private ApplicationFactoryInterface $applicationFactory,
private ApplicationServiceInterface $applicationService,
private ItemCategoryProviderInterface $itemCategoryProvider,
protected FooterLinkProviderInterface $footerLinkProvider,
protected BlogProviderInterface $blogProvider,
private SeoIndustryProviderInterface $seoIndustryProvider,
private RecaptchaServiceInterface $recaptchaService
){}
/**
* @Route(
* path="/{_locale}/{offer}/{temporaryId}/{branch_extra}",
* name="offer",
* requirements=
* {
* "_locale": "%app.supported_locales%",
* "offer": "%app.supported_offer%"
* }
* )
*/
public function getOfferAction
(
Request $request,
string $_locale,
string $offer,
string $temporaryId
): Response
{
$request->setLocale($_locale);
$isActive = false;
$isDone = false;
$error = '';
$branchExtra = $request->attributes->get('branch_extra');
$requestOffer = $offer;
try {
$offer = $this->offerProvider->getOfferPreViewByTemporaryId($temporaryId);
$isDone = $offer->getExtraInfo()['isDone'];
$isActive = $offer->getExtraInfo()['isActive'];
if(false === $isDone || false === $isActive){ $offer = null; }
} catch(NoResultException $e){
$offer = null;
}
if(is_null($offer)) {
if($isDone === false){
$error = ResponseMessage::onOfferNotFound($_locale);
}
if($isActive === false) {
$error = ResponseMessage::onOfferHasExpired($_locale);
}
return $this->pageNotFoundAction($error);
} else {
$industryId = $offer->getCategoryId();
}
$viewParams['links_in_footer'] = $this->footerLinkProvider->getAll();
$viewParams['offer'] = $offer;
$viewParams['front_page'] = false;
$viewParams['temporary_id'] = $temporaryId;
$viewParams['queryParams'] = $request->query->all();
$id = $offer->getCategoryId();
$itemCategory = $this->itemCategoryProvider->getOneById($offer->getCategoryId($id));
$namePL = is_null($itemCategory) ? '' : $itemCategory->getName();
$nameEN = is_null($itemCategory) ? '' : $itemCategory->getTranslation()['en']['nameCategory'] ?? '';
$viewParams['industry'] = ["namePL" => $namePL, "nameEn" => $nameEN];
$viewParams['seo'] = $this->seoIndustryProvider->getOneByIdIndustry($industryId);
if ($request->getMethod() === "POST") {
try {
$response = $this->recaptchaService->getResponse($request);
if ($response->success) {
$locale = $request->getLocale();
$application = $this->applicationFactory->create($request);
$this->applicationService->create($application, $locale);
$this->addFlash('success', 'USER_ZONE.APPLICATION_MODAL.THANKS');
}
return $this->redirectToRoute(
'front-offer',
[
'_locale' => $_locale,
'offer' => $requestOffer,
'temporaryId' => $temporaryId,
'branch_extra' => $branchExtra
]
);
} catch(Exception $e) {
$this->addFlash('error', 'USER_ZONE.APPLICATION_MODAL.ERROR');
return $this->redirectToRoute(
'front-offer',
[
'_locale' => $_locale,
'offer' => $requestOffer,
'temporaryId' => $temporaryId,
'branch_extra' => $branchExtra
]
);
}
}
return $this->render(self::OFFER_VIEW_TEMPLATE_PATH, $viewParams);
}
/**
* @Route(
* path="/{_locale}/{blog}/{url}",
* name="blog",
* requirements=
* {
* "_locale": "%app.supported_locales%",
* "blog": "%app.supported_blog%"
* }
* )
*/
public function getBlogAction
(
Request $request,
string $_locale,
string $blog,
string $url,
): Response
{
$request->setLocale($_locale);
$blog = $this->pageProvider->getOneByUrl($url);
if(is_null($blog)) {
$error = ResponseMessage::onOfferNotFound($_locale);
return $this->pageNotFoundAction($error);
}
$viewParams['entity'] = $blog->getPage();
$viewParams['links_in_footer'] = $this->footerLinkProvider->getAll();
$viewParams['blog'] = $blog;
$viewParams['front_page'] = true;
$viewParams['queryParams'] = $request->query->all();
return $this->render(self::BLOG_VIEW_TEMPLATE_PATH, $viewParams);
}
/**
* @Route(
* path="/{_locale}/{prefix}/{code}",
* name="code",
* requirements={
* "_locale": "%app.supported_locales%",
* "code": "[^.]+"
* }
* )
*/
public function getOfferByCode
(
Request $request,
string $_locale,
string $code,
):Response
{
$request->setLocale($_locale);
try {
$offer = $this->offerProvider->getOfferByCode($code);
$isDone = $offer->getExtraInfo()['isDone'];
$isActive = $offer->getExtraInfo()['isActive'];
if(false === $isDone || false === $isActive){ $offer = null; }
} catch(NoResultException $e){
$offer = null;
}
if(is_null($offer)) {
if($isDone === false) $error = ResponseMessage::onOfferNotFound($_locale);
if($isActive === false) $error = ResponseMessage::onOfferHasExpired($_locale);
return $this->pageNotFoundAction($error);
}
$viewParams['links_in_footer'] = $this->footerLinkProvider->getAll();
$viewParams['offer'] = $offer;
$viewParams['front_page'] = false;
$viewParams['temporary_id'] = $offer->getTemporaryId();
$viewParams['queryParams'] = $request->query->all();
isset($offer)?$id = $offer->getCategoryId() : $id = '';
$viewParams['industry'] = [
"namePL" => $this->itemCategoryProvider->getOneById($offer->getCategoryId($id))->getName(),
"nameEn" => $this->itemCategoryProvider->getOneById($offer->getCategoryId($id))->getTranslation()['en']['nameCategory']??''];
if($request->getMethod() === "POST"){
try{
$locale = $request->getLocale();
$application = $this->applicationFactory->create($request);
$this->applicationService->create($application, $locale);
}catch(Exception $e){}
}
return $this->render(self::OFFER_VIEW_TEMPLATE_PATH, $viewParams);
}
/**
* @Route(
* path="/{_locale}/{url}",
* name="page",
* requirements={
* "_locale": "%app.supported_locales%",
* "url": "[^.]+"
* }
* ),
* @ParamConverter(
* "pageTranslation",
* options={
* "mapping": {
* "_locale": "locale",
* "url": "url"
* }
* }
* )
*/
public function getPageAction
(
Request $request,
PageTranslation $pageTranslation,
string $_locale,
string $url = ''
): Response
{
$request->setLocale($_locale);
$page = $pageTranslation->getTranslatable();
$templatePath = $page->getTemplatePath();
$forwardResponse = $this->getForwardResponseForPage($page, $request);
if (false === is_null($forwardResponse)) {
return $forwardResponse;
}
$viewParams = [
"entity" => $page,
"currentUrl" => [
"locale" => $request->getLocale(),
],
'queryParams' => $request->query->all(),
'links_in_footer' => $this->footerLinkProvider->getAll(),
];
return $this->render($templatePath, $viewParams);
}
/**
* @Route("", name="hp", methods={"GET"})
*/
public function homePageAction(Request $request): Response
{
return $this->pageNotFoundAction();
}
private function getForwardResponseForPage(Page $page, Request $request): ?Response
{
$controller = Pages::CONFIG_FOR_TYPES[$page->getMigrationId()] ?? null;
if (is_null($controller)) {
return null;
}
$viewParams['page'] = $page;
$viewParams['originalRequest'] = $request;
$viewParams['entity'] = $page;
$viewParams['queryParams'] = $request->query->all();
$viewParams['links_in_footer'] = $this->footerLinkProvider->getAll();
return $this->forward($controller, $viewParams);
}
private function pageNotFoundAction(string $error = null): Response
{
$page = $this->pageProvider->getOneByMigrationId(Pages::HOMEPAGE);
$viewParams['url'] = $page->getTranslations()['pl']->getUrl();
$viewParams['_locale'] = 'pl';
$viewParams['error'] = $error;
$viewParams['links_in_footer'] = $this->footerLinkProvider->getAll();
if (is_null($error) == false) {
$this->addFlash('response_message', $error);
}
return $this->redirectToRoute('front-page', $viewParams);
}
}