- <?php
- /*
-  * Copyright (C) 2018 SPREAD WORKS Inc.
-  *
-  * For the full copyright and license information, please view the LICENSE
-  * file that was distributed with this source code.
-  */
- namespace Plugin\TabaBannerManager2\Controller;
- use Eccube\Application;
- use Eccube\Controller\AbstractController;
- use Plugin\TabaBannerManager2\Common\Constants;
- use Plugin\TabaBannerManager2\Repository\ViewLogRepository;
- use Plugin\TabaBannerManager2\Repository\ResultLogRepository;
- use Eccube\Common\Constant;
- use Symfony\Component\Routing\Annotation\Route;
- use Symfony\Component\HttpFoundation\Request;
- use Symfony\Component\HttpFoundation\Cookie;
- use Symfony\Component\HttpFoundation\Response;
- use Symfony\Component\HttpFoundation\JsonResponse;
- use Symfony\Component\HttpFoundation\RedirectResponse;
- use Symfony\Component\Security\Csrf\CsrfToken;
- use Symfony\Component\Security\Csrf\CsrfTokenManagerInterface;
- use Symfony\Component\HttpKernel\Exception\NotFoundHttpException;
- /**
-  * フロント用コントローラー
-  *
-  * @Route(Plugin\TabaBannerManager2\Common\Constants::FRONT_URI_PREFIX,name=Plugin\TabaBannerManager2\Common\Constants::FRONT_BIND_PREFIX)
-  */
- class FrontController extends AbstractController
- {
-     /**
-      * @var ViewLogRepository
-      */
-     private $viewLogRepo;
-     /**
-      * @var ResultLogRepository
-      */
-     private $resultLogRepo;
-     /**
-      * @var CsrfTokenManagerInterface
-      */
-     protected $csrfTokenManager;
-     /**
-      * @param ViewLogRepository $viewLogRepo
-      * @param ResultLogRepository $resultLogRepo
-      * @param CsrfTokenManagerInterface $csrfTokenManager
-      */
-     public function __construct(
-         ViewLogRepository $viewLogRepo,
-         ResultLogRepository $resultLogRepo,
-         CsrfTokenManagerInterface $csrfTokenManager
-         ) {
-             $this->viewLogRepo = $viewLogRepo;
-             $this->resultLogRepo = $resultLogRepo;
-             $this->csrfTokenManager = $csrfTokenManager;
-     }
-     /**
-      * JSON形式のエラーレスポンスを返します。
-      */
-     private function jsonResponseError($error_message) {
-         return new JsonResponse(['error' => ['message' => $error_message]],400);
-     }
-     /**
-      * View
-      *
-      * @param Application $app
-      * @param Request $request
-      * @return \Symfony\Component\HttpFoundation\Response
-      *
-      * @Route("/view_counter",name="_view_counter")
-      */
-     public function viewCounter(Request $request)
-     {
-         // CSRF
-         if (!$this->csrfTokenManager->isTokenValid(new CsrfToken(Constant::TOKEN_NAME,$request->get(Constant::TOKEN_NAME)))) {
-             return $this->jsonResponseError('CSRF token is invalid.');
-             //throw new AccessDeniedHttpException('CSRF token is invalid.');
-         }
-         // XMLHttpRequest
-         if (!$request->isXmlHttpRequest()) {
-             return $this->jsonResponseError('Request is invalid.');
-             //throw new BadRequestHttpException('Request is invalid.');
-         }
-         if (($banner_id = $request->get('banner_id'))) {
-             $this->viewLogRepo->viewLogger($banner_id);
-         }
-         return new JsonResponse(array());
-     }
-     /**
-      * Click
-      *
-      * @param Application $app
-      * @param Request $request
-      * @return \Symfony\Component\HttpFoundation\Response
-      *
-      * @Route("/click_counter/{banner_id}",name="_click_counter",requirements={"banner_id" = "\d+"})
-      */
-     public function clickCounter(Request $request,$banner_id)
-     {
-         if ($banner_id) {
-             // ログ保存
-             if (($result_log = $this->resultLogRepo->clickLogger($banner_id))) {
-                 $banner = $result_log->getBanner($banner_id);
-                 if ($banner->getUrl()) {
-                     // クッキーにログのIDを設定する
-                     $response = new RedirectResponse($banner->getUrl());
-                     $cookie = new Cookie(Constants::COOKIE_KEY,$result_log->getLogId(),time() + (60*60*24*365*2),'/',null,false,false);
-                     $response->headers->setCookie($cookie);
-                     return $response;
-                 }
-             } else {
-                 log_error("クリック回数の保存が出来ませんでした。 [BANNER ID] " . $banner_id);
-                 throw new NotFoundHttpException();
-             }
-         } else {
-             throw new NotFoundHttpException();
-         }
-     }
-     /**
-      * CV
-      *
-      * @param Application $app
-      * @param Request $request
-      * @return \Symfony\Component\HttpFoundation\Response
-      *
-      * @Route("/cv_counter/{order_id}",name="_cv_counter")
-      */
-     public function cvCounter(Request $request,$order_id = null)
-     {
-         // CSRF
-         if (!$this->csrfTokenManager->isTokenValid(new CsrfToken(Constant::TOKEN_NAME,$request->get(Constant::TOKEN_NAME)))) {
-             return $this->jsonResponseError('CSRF token is invalid.');
-             // throw new AccessDeniedHttpException('CSRF token is invalid.');
-         }
-         // XMLHttpRequest
-         if (!$request->isXmlHttpRequest()) {
-             return $this->jsonResponseError('Request is invalid.');
-             // throw new BadRequestHttpException('Request is invalid.');
-         }
-         if ($order_id && $log_id = $request->cookies->get(Constants::COOKIE_KEY)) {
-             // ログ保存
-             if (!$this->resultLogRepo->cvLogger($log_id,$order_id)) {
-                 log_error("購入回数の保存が出来ませんでした。 [ORDER ID] " . $order_id . " [LOG ID] " . $log_id);
-             }
-             // クッキーを削除
-             $response = new Response();
-             $cookie = new Cookie(Constants::COOKIE_KEY,null,time() - (60*60*24*365*2),'/',null,false,false);
-             $response->headers->setCookie($cookie);
-             return $response;
-         }
-         return new JsonResponse(array());
-     }
- }
-