app/Plugin/TabaBannerManager2/Controller/FrontController.php line 110

Open in your IDE?
  1. <?php
  2. /*
  3.  * Copyright (C) 2018 SPREAD WORKS Inc.
  4.  *
  5.  * For the full copyright and license information, please view the LICENSE
  6.  * file that was distributed with this source code.
  7.  */
  8. namespace Plugin\TabaBannerManager2\Controller;
  9. use Eccube\Application;
  10. use Eccube\Controller\AbstractController;
  11. use Plugin\TabaBannerManager2\Common\Constants;
  12. use Plugin\TabaBannerManager2\Repository\ViewLogRepository;
  13. use Plugin\TabaBannerManager2\Repository\ResultLogRepository;
  14. use Eccube\Common\Constant;
  15. use Symfony\Component\Routing\Annotation\Route;
  16. use Symfony\Component\HttpFoundation\Request;
  17. use Symfony\Component\HttpFoundation\Cookie;
  18. use Symfony\Component\HttpFoundation\Response;
  19. use Symfony\Component\HttpFoundation\JsonResponse;
  20. use Symfony\Component\HttpFoundation\RedirectResponse;
  21. use Symfony\Component\Security\Csrf\CsrfToken;
  22. use Symfony\Component\Security\Csrf\CsrfTokenManagerInterface;
  23. use Symfony\Component\HttpKernel\Exception\NotFoundHttpException;
  24. /**
  25.  * フロント用コントローラー
  26.  *
  27.  * @Route(Plugin\TabaBannerManager2\Common\Constants::FRONT_URI_PREFIX,name=Plugin\TabaBannerManager2\Common\Constants::FRONT_BIND_PREFIX)
  28.  */
  29. class FrontController extends AbstractController
  30. {
  31.     /**
  32.      * @var ViewLogRepository
  33.      */
  34.     private $viewLogRepo;
  35.     /**
  36.      * @var ResultLogRepository
  37.      */
  38.     private $resultLogRepo;
  39.     /**
  40.      * @var CsrfTokenManagerInterface
  41.      */
  42.     protected $csrfTokenManager;
  43.     /**
  44.      * @param ViewLogRepository $viewLogRepo
  45.      * @param ResultLogRepository $resultLogRepo
  46.      * @param CsrfTokenManagerInterface $csrfTokenManager
  47.      */
  48.     public function __construct(
  49.         ViewLogRepository $viewLogRepo,
  50.         ResultLogRepository $resultLogRepo,
  51.         CsrfTokenManagerInterface $csrfTokenManager
  52.         ) {
  53.             $this->viewLogRepo $viewLogRepo;
  54.             $this->resultLogRepo $resultLogRepo;
  55.             $this->csrfTokenManager $csrfTokenManager;
  56.     }
  57.     /**
  58.      * JSON形式のエラーレスポンスを返します。
  59.      */
  60.     private function jsonResponseError($error_message) {
  61.         return new JsonResponse(['error' => ['message' => $error_message]],400);
  62.     }
  63.     /**
  64.      * View
  65.      *
  66.      * @param Application $app
  67.      * @param Request $request
  68.      * @return \Symfony\Component\HttpFoundation\Response
  69.      *
  70.      * @Route("/view_counter",name="_view_counter")
  71.      */
  72.     public function viewCounter(Request $request)
  73.     {
  74.         // CSRF
  75.         if (!$this->csrfTokenManager->isTokenValid(new CsrfToken(Constant::TOKEN_NAME,$request->get(Constant::TOKEN_NAME)))) {
  76.             return $this->jsonResponseError('CSRF token is invalid.');
  77.             //throw new AccessDeniedHttpException('CSRF token is invalid.');
  78.         }
  79.         // XMLHttpRequest
  80.         if (!$request->isXmlHttpRequest()) {
  81.             return $this->jsonResponseError('Request is invalid.');
  82.             //throw new BadRequestHttpException('Request is invalid.');
  83.         }
  84.         if (($banner_id $request->get('banner_id'))) {
  85.             $this->viewLogRepo->viewLogger($banner_id);
  86.         }
  87.         return new JsonResponse(array());
  88.     }
  89.     /**
  90.      * Click
  91.      *
  92.      * @param Application $app
  93.      * @param Request $request
  94.      * @return \Symfony\Component\HttpFoundation\Response
  95.      *
  96.      * @Route("/click_counter/{banner_id}",name="_click_counter",requirements={"banner_id" = "\d+"})
  97.      */
  98.     public function clickCounter(Request $request,$banner_id)
  99.     {
  100.         if ($banner_id) {
  101.             // ログ保存
  102.             if (($result_log $this->resultLogRepo->clickLogger($banner_id))) {
  103.                 $banner $result_log->getBanner($banner_id);
  104.                 if ($banner->getUrl()) {
  105.                     // クッキーにログのIDを設定する
  106.                     $response = new RedirectResponse($banner->getUrl());
  107.                     $cookie = new Cookie(Constants::COOKIE_KEY,$result_log->getLogId(),time() + (60*60*24*365*2),'/',null,false,false);
  108.                     $response->headers->setCookie($cookie);
  109.                     return $response;
  110.                 }
  111.             } else {
  112.                 log_error("クリック回数の保存が出来ませんでした。 [BANNER ID] " $banner_id);
  113.                 throw new NotFoundHttpException();
  114.             }
  115.         } else {
  116.             throw new NotFoundHttpException();
  117.         }
  118.     }
  119.     /**
  120.      * CV
  121.      *
  122.      * @param Application $app
  123.      * @param Request $request
  124.      * @return \Symfony\Component\HttpFoundation\Response
  125.      *
  126.      * @Route("/cv_counter/{order_id}",name="_cv_counter")
  127.      */
  128.     public function cvCounter(Request $request,$order_id null)
  129.     {
  130.         // CSRF
  131.         if (!$this->csrfTokenManager->isTokenValid(new CsrfToken(Constant::TOKEN_NAME,$request->get(Constant::TOKEN_NAME)))) {
  132.             return $this->jsonResponseError('CSRF token is invalid.');
  133.             // throw new AccessDeniedHttpException('CSRF token is invalid.');
  134.         }
  135.         // XMLHttpRequest
  136.         if (!$request->isXmlHttpRequest()) {
  137.             return $this->jsonResponseError('Request is invalid.');
  138.             // throw new BadRequestHttpException('Request is invalid.');
  139.         }
  140.         if ($order_id && $log_id $request->cookies->get(Constants::COOKIE_KEY)) {
  141.             // ログ保存
  142.             if (!$this->resultLogRepo->cvLogger($log_id,$order_id)) {
  143.                 log_error("購入回数の保存が出来ませんでした。 [ORDER ID] " $order_id " [LOG ID] " $log_id);
  144.             }
  145.             // クッキーを削除
  146.             $response = new Response();
  147.             $cookie = new Cookie(Constants::COOKIE_KEY,null,time() - (60*60*24*365*2),'/',null,false,false);
  148.             $response->headers->setCookie($cookie);
  149.             return $response;
  150.         }
  151.         return new JsonResponse(array());
  152.     }
  153. }