<?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());
}
}