<?php
namespace WebBundle\Controller;
use Doctrine\ORM\NonUniqueResultException;
use Doctrine\ORM\NoResultException;
use Exception;
use Symfony\Component\HttpFoundation\JsonResponse;
use Symfony\Component\HttpFoundation\Request;
use Symfony\Component\HttpFoundation\Response;
use Symfony\Component\Security\Core\Security;
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;
use WebBundle\Service\RequestService;
class CommonController extends ExtendedController
{
/** @required */
public RequestService $requestService;
private UserRepository $userRepository;
private VisitRepository $visitRepository;
private IdeaRepository $ideaRepository;
private BuyOrderRepository $buyOrderRepository;
private LocalizationService $localizationService;
/**
* OrderService constructor.
*
* @param UserRepository $userRepository
* @param VisitRepository $visitRepository
* @param IdeaRepository $ideaRepository
* @param BuyOrderRepository $buyOrderRepository
* @param LocalizationService $localizationService
* @throws Exception
*/
public function __construct(
UserRepository $userRepository,
VisitRepository $visitRepository,
IdeaRepository $ideaRepository,
BuyOrderRepository $buyOrderRepository,
LocalizationService $localizationService
) {
parent::__construct();
$this->userRepository = $userRepository;
$this->visitRepository = $visitRepository;
$this->ideaRepository = $ideaRepository;
$this->buyOrderRepository = $buyOrderRepository;
$this->localizationService = $localizationService;
}
/**
* Авторизация
* @param Request $request
* @return Response
*/
public function loginAction(Request $request): Response
{
if ($this->get('security.authorization_checker')->isGranted('IS_AUTHENTICATED_FULLY')) {
return $this->redirectToRoute('app_home');
}
$session = $request->getSession();
// получить ошибки логина, если таковые имеются
if ($request->attributes->has(Security::AUTHENTICATION_ERROR)) {
$error = $request->attributes->get(Security::AUTHENTICATION_ERROR);
} else {
$error = $session->get(Security::AUTHENTICATION_ERROR);
}
return $this->render(
'@Web/Common/login.html.twig',
[
// имя, введённое пользователем в последний раз
'last_username' => $session->get(Security::LAST_USERNAME),
'error' => $error,
'url' => empty($_SERVER['HTTP_REFERER']) ? '/' : $_SERVER['HTTP_REFERER'],
]
);
}
/**
* @param Request $request
* @return Response
* @throws NoResultException
* @throws NonUniqueResultException
*/
public function topAction(Request $request): Response
{
$userInfo = UserHelper::getInstance();
$token = $userInfo->getToken();
$user = $this->getUser();
// проверяем токен от авторизированного пользователя или нет
if (!$user && empty($_SESSION['token'])) {
$usr = $this->userRepository->getUserByToken($token);
if ($usr) {
$token = $userInfo->generateToken();
$userInfo->setToken($token);
$_SESSION['token'] = $token;
}
}
$orderArticles = $this->buyOrderRepository->getBuyOrderArticleCount($token);
$ordersCount = count($this->buyOrderRepository->getBuyOrderCount($token));
$user = App::getCurUser();
$userUnidChat = null;
$countryList = App::getCountryList();
$showUserLocaleDto = $this->localizationService->getShowUserLocaleDto();
$data = [
'locale' => App::getCurLocale(true),
'uri' => $this->localizationService->getUriWithoutLocale(),
'unreadAll' => 0, //количество не прочитанных
'userUnidChat' => $userUnidChat, // unid клиента на портале
'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' => $this->visitRepository->getVisitedAll($userInfo->getToken()),
'user' => $user,
'ideas' => $this->ideaRepository->countByToken($token),
'orderArticlesAll' => $orderArticles,
'selectLocales' => $this->localizationService->getSelectLocales($showUserLocaleDto),
'ordersCount' => $ordersCount,
];
$response = $this->render('@Web/Common/top.html.twig', $data);
$response->setSharedMaxAge(0);
return $response;
}
/**
* @param Request $request
* @return JsonResponse
*/
public function setLocalizationAction(Request $request): JsonResponse
{
$newUrl = $this->localizationService->setLocalizationAndGetUrlForRedirect($request);
return new JsonResponse([
'res' => 'ok',
'url' => $newUrl,
]);
}
/**
* Запрос с сайта
* @param Request $request
* @param $action
* @return JsonResponse|Response
* @throws Exception
*/
public function requestAction(Request $request, $action)
{
if ($action == 'send') {
try {
$this->requestService->send();
} catch (Exception $e) {
App::getLogger()->error('SITE REQUEST(action==send) - failed with message: ' . $e->getMessage()
. ', in file: ' . $e->getFile()
. ', line: ' . $e->getLine()
);
return new JsonResponse($this->requestService->getErrors(), 400);
}
return new JsonResponse($this->get('translator')->trans('request_send_ok'));
}
if ($action == 'get') {
$ip = $request->getClientIp();
return $this->render('@Web/Common/request.html.twig', ['ip' => $ip]);
}
return new Response(json_encode(['status' => 0, 'error' => ['Не известная команда']]));
}
}