<?php
namespace WebBundle\Controller;
use Doctrine\ORM\NonUniqueResultException;
use Exception;
use Symfony\Component\HttpFoundation\JsonResponse;
use Symfony\Component\HttpFoundation\Request;
use WebBundle\Entity\Idea;
use WebBundle\Helper\App;
use WebBundle\Helper\LocaleHelper;
use WebBundle\Helper\UserHelper;
use WebBundle\Repository\BuyOrderRepository;
use WebBundle\Repository\IdeaRepository;
use WebBundle\Repository\UserRepository;
use WebBundle\Repository\VisitRepository;
use WebBundle\Service\LocalizationService;
/**
* Class TopController
* @package WebBundle\Controller
*/
class TopController extends ExtendedController
{
private LocalizationService $localizationService;
public function __construct(
LocalizationService $localizationService
) {
parent::__construct();
$this->localizationService = $localizationService;
}
/**
* @return JsonResponse
* @throws NonUniqueResultException
* @throws Exception
*/
public function indexAction()
{
/** @var IdeaRepository $repoIdea */
$repoIdea = App::getContainer()->get('app.repo.idea');
/** @var BuyOrderRepository $repoBuyOrder */
$repoBuyOrder = App::getContainer()->get('app.repo.order');
/** @var VisitRepository $repoVisit */
$repoVisit = App::getRepository('WebBundle:Visit');
$userInfo = UserHelper::getInstance();
$token = $userInfo->getToken();
$user = $this->getUser();
$em = $this->getDoctrine()->getManager();
// проверяем токен от авторизированого пользователя или нет
if (!$user && empty($_SESSION['token'])) {
/** @var UserRepository $userRepo */
$userRepo = $em->getRepository('WebBundle:User');
$usr = $userRepo->getUserByToken($token);
if ($usr) {
$token = $userInfo->generateToken();
$userInfo->setToken($token);
$_SESSION['token'] = $token;
}
}
/** @var Idea $activeIdea */
$orderArticles = $repoBuyOrder->getBuyOrderArticleCount($token);
$ordersCount = count($repoBuyOrder->getBuyOrderCount($token));
$repoIdea->findBy(['token' => $token], ['updateDate' => 'DESC']);
$user = App::getCurUser();
$countryList = App::getCountryList();
$showUserLocaleDto = $this->localizationService->getShowUserLocaleDto();
$data = [
'uri' => $this->localizationService->getUriWithoutLocale(),
'showLocale' => $showUserLocaleDto->isShowLocale(),
'userLocaleWas' => $showUserLocaleDto->getUserLocaleWas(),
'userCountryWas' => $showUserLocaleDto->getUserCountryWas(),
'userCurrencyWas' => $showUserLocaleDto->getUserCurrencyWas(),
'userMeasureWas' => $showUserLocaleDto->getUserMeasureWas(),
'currencyList' => LocaleHelper::getCurrencyList($showUserLocaleDto->getUserCountryWas()),
'countryList' => $countryList,
'measureList' => LocaleHelper::getMeasureList(),
'visitedAll' => $repoVisit->getVisitedAll($userInfo->getToken()),
'ideas' => $repoIdea->countByToken($token),
'orderArticlesAll' => $orderArticles,
'selectLocales' => $this->localizationService->getSelectLocales($showUserLocaleDto),
'ordersCount' => $ordersCount,
'user' => [
'name' => $user ? $user->getAlias() : null,
'login' => App::generateUrl('app_login'),
'reg' => App::generateUrl('app_reg'),
'profile' => App::generateUrl('app_user_profile'),
'logout' => App::generateUrl('app_logout'),
],
'links' => [
'about' => [
'url' => App::generateUrl('app_page', ['url' => 'about']),
'name' => App::trans('main_menu_about')
],
'payment' => [
'url' => App::generateUrl('app_page', ['url' => 'payment']),
'name' => App::trans('main_menu_payment_delivery')
],
'contacts' => [
'url' => App::generateUrl('app_page_contacts'),
'name' => App::trans('main_menu_contacts')
]
]
];
return new JsonResponse($data);
}
/**
* @return JsonResponse
* @throws Exception
*/
public function cookieAction(Request $request): JsonResponse
{
$langParam = $request->query->get('lang')
?? $request->query->get('language')
?? $request->query->get('l');
$countryParam = $request->query->get('country')
?? $request->query->get('countryCode')
?? $request->query->get('c');
if ($langParam !== null && !preg_match('/^[a-z]{2}$/i', $langParam)) {
return new JsonResponse(['error' => 'Invalid language'], 400);
}
if ($countryParam !== null && !preg_match('/^[a-z]{2}$/i', $countryParam)) {
return new JsonResponse(['error' => 'Invalid country'], 400);
}
$language = $langParam ? strtolower($langParam) : null;
$country = $countryParam ? strtolower($countryParam) : null;
$localeRaw = $request->query->get('locale') ?? $request->attributes->get('_locale');
if ($localeRaw && preg_match('/^([a-z]{2})(?:[-_]?([a-z]{2}))?$/i', $localeRaw, $matches)) {
$language = $language ?? strtolower($matches[1]);
if (!empty($matches[2])) {
$country = $country ?? strtolower($matches[2]);
}
}
if (!$language) {
$language = LocaleHelper::getDefault();
}
if (!$country) {
try {
$country = LocaleHelper::getCurCountry();
} catch (Exception $exception) {
$country = 'us';
}
}
$routeLocale = sprintf('%s-%s', $language, $country);
$personalDataPolicyUrl = App::generateUrl('app_page', [
'url' => 'policy-personal-data-process',
'_locale' => $routeLocale,
]);
$cookiePolicyUrl = App::generateUrl('app_page', [
'url' => 'cookie-policy',
'_locale' => $routeLocale,
]);
$message = App::trans(
'cookie_msg',
$language,
[
'%link%' => $personalDataPolicyUrl,
'%link2%' => $cookiePolicyUrl,
]
);
return new JsonResponse([
'locale' => $language,
'country' => $country,
'links' => [
'policyPersonalData' => $personalDataPolicyUrl,
'cookiePolicy' => $cookiePolicyUrl,
],
'html' => $message,
]);
}
}