<?php
/*
* This file is part of EC-CUBE
*
* Copyright(c) EC-CUBE CO.,LTD. All Rights Reserved.
*
* http://www.ec-cube.co.jp/
*
* For the full copyright and license information, please view the LICENSE
* file that was distributed with this source code.
*/
namespace Customize\Controller;
use Eccube\Entity\Master\CustomerStatus;
use Eccube\Entity\Master\Sex;
use Eccube\Repository\CartRepository;
use Eccube\Repository\Master\CustomerStatusRepository;
use Eccube\Repository\Master\PrefRepository;
use Eccube\Security\Core\Encoder\PasswordEncoder;
use Eccube\Service\OrderHelper;
use Eccube\Service\SystemService;
use Firebase\JWT\JWT;
use Firebase\JWT\Key;
use Sensio\Bundle\FrameworkExtraBundle\Configuration\Template;
use Symfony\Component\HttpFoundation\JsonResponse;
use Symfony\Component\Routing\Annotation\Route;
use Symfony\Component\Security\Core\Authentication\Token\Storage\TokenStorageInterface;
use Symfony\Component\Security\Core\Authentication\Token\UsernamePasswordToken;
use Eccube\Repository\CustomerRepository;
use Eccube\Repository\OrderRepository;
use Symfony\Component\HttpFoundation\Request;
use Eccube\Controller\AbstractController;
use Eccube\Entity\Master\OrderStatus;
use Eccube\Entity\Customer;
use Eccube\Service\MailService;
use Doctrine\ORM\EntityManagerInterface;
class TopController extends AbstractController
{
private $keyJwt = '4UEX8^j8G|CFz]fzV[';
protected $mailService;
protected $entityManager;
protected $orderRepository;
public function __construct(
MailService $mailService,
EntityManagerInterface $entityManager,
OrderRepository $orderRepository
) {
$this->mailService = $mailService;
$this->entityManager = $entityManager;
$this->orderRepository = $orderRepository;
}
/**
* @Route("/", name="homepage", methods={"GET"})
* @Template("index.twig")
*/
public function index(TokenStorageInterface $tokenStorage, CustomerRepository $customerRepository, Request $request)
{
$tokenLogin = $request->get('tokenLogin');
if(!empty($tokenLogin)) {
try {
$decoded = JWT::decode($tokenLogin, new Key($this->keyJwt, 'HS256'));
$Customer = $customerRepository->findOneBy(['phone_number' => $decoded->phone]);
if($Customer) {
$token = new UsernamePasswordToken($Customer, 'customer', ['ROLE_USER']);
$tokenStorage->setToken($token);
$request->getSession()->migrate(true);
return $this->redirect($this->generateUrl('homepage'));
}
} catch (\Exception $e) {
}
}
return [];
}
/**
* @Route("/syncRegisterBel", name="syncRegisterBel", methods={"GET"})
*/
public function syncRegisterBel(PasswordEncoder $passwordEncoder, CustomerStatusRepository $customerStatusRepository, PrefRepository $prefRepository, CustomerRepository $customerRepository, Request $request) {
$token = $request->get('token');
if(!empty($token)) {
try {
$decoded = JWT::decode($token, new Key($this->keyJwt, 'HS256'));
$CustomerStatus = $customerStatusRepository->find(CustomerStatus::ACTIVE);
$checkPhone = $customerRepository->findOneBy(['phone_number' => $decoded->phone]);
if($checkPhone) {
return new JsonResponse(['status' => 4,], 200);
}
// $checkEmail = $customerRepository->findOneBy(['email' => $decoded->user_email]);
// if($checkEmail) {
// return new JsonResponse(['status' => 5,], 200);
// }
$sexRepository = $this->entityManager->getRepository(Sex::class);
$Sex = $sexRepository->find(4);
$salt = $passwordEncoder->createSalt();
$password = $passwordEncoder->encodePassword($decoded->password, $salt);
$secretKey = $customerRepository->getUniqueSecretKey();
$pref = '';
$firstPortcode = substr($decoded->postcode, 0, 3);
if(strlen($firstPortcode) >= 3) {
$curl = curl_init();
$options = [
CURLOPT_RETURNTRANSFER => 1,
CURLOPT_URL => "https://yubinbango.github.io/yubinbango-data/data/" . $firstPortcode . ".js",
CURLOPT_POST => false,
CURLOPT_USERAGENT => "Mozilla/4.0 (compatible; MSIE 5.01; Windows NT 5.0)",
];
curl_setopt_array($curl, $options);
$output = curl_exec($curl);
$output = str_replace('$yubin(', '', $output);
$output = str_replace(');', '', $output);
$result = (array)json_decode($output);
curl_close($curl);
if(isset($result[$decoded->postcode])) {
$pref = $result[$decoded->postcode][0];
}
}
$email = $decoded->user_email;
if(empty($email)) {
$email = $decoded->phone.'@generatebelmony.com';
}
$Customer = new Customer();
$Customer
->setName01($decoded->user_name)
->setName02('')
->setKana01('')
->setKana02('')
->setCompanyName('')
->setEmail($email)
->setPhonenumber($decoded->phone)
->setSex($Sex)
->setPostalcode($decoded->postcode)
->setAddr02('')
->setStatus($CustomerStatus)
->setSalt($salt)
->setPassword($password)
->setSecretKey($secretKey)
->setBirth(new \DateTime($decoded->user_birthday))
->setPoint(0);
if (!empty($pref)) {
$Pref = $prefRepository->find($pref);
if($Pref) {
$Customer->setPref($Pref);
}
$Customer->setAddr01(str_replace($Pref->getName(), '', $decoded->user_address));
}else {
$Customer->setAddr01($decoded->user_address);
}
$this->entityManager->persist($Customer);
$this->entityManager->flush();
return new JsonResponse(['status' => 1,], 200);
} catch (\Exception $e) {
return new JsonResponse(['status' => 2,], 200);
}
}
return new JsonResponse(['status' => 3,], 200);
}
/**
* @Route("/checkConnectLogin", name="checkConnectLogin", methods={"GET"})
*/
public function checkConnectLogin(TokenStorageInterface $tokenStorage, CustomerRepository $customerRepository, Request $request) {
$tokenLogin = $request->get('tokenLogin');
if(!empty($tokenLogin)) {
try {
$decoded = JWT::decode($tokenLogin, new Key($this->keyJwt, 'HS256'));
$Customer = $customerRepository->findOneBy(['phone_number' => $decoded->phone]);
if($Customer) {
die('1');
}
} catch (\Exception $e) {
die('2');
}
}
die('3');
}
/**
* @Route("/syncUpdate", name="syncUpdate", methods={"GET"})
*/
public function syncUpdate(PasswordEncoder $passwordEncoder, CustomerStatusRepository $customerStatusRepository, PrefRepository $prefRepository, CustomerRepository $customerRepository, Request $request) {
$tokenLogin = $request->get('token');
if(!empty($tokenLogin)) {
try {
$decoded = JWT::decode((string)$tokenLogin, new Key($this->keyJwt, 'HS256'));
//dd($decoded);
$Customer = $customerRepository->findOneBy(['phone_number' => $decoded->phone]);
//dd($Customer);
if($Customer) {
$sexRepository = $this->entityManager->getRepository(Sex::class);
$Sex = $sexRepository->find(4);
$email = $decoded->user_email;
if (empty($email)) {
$email = $decoded->phone . '@generatebelmony.com';
}
if($email != $Customer->getEmail()) {
$Customer->setEmail($email);
}
$pref = '';
$firstPortcode = substr($decoded->postcode, 0, 3);
if(strlen($firstPortcode) >= 3) {
$curl = curl_init();
$options = [
CURLOPT_RETURNTRANSFER => 1,
CURLOPT_URL => "https://yubinbango.github.io/yubinbango-data/data/" . $firstPortcode . ".js",
CURLOPT_POST => false,
CURLOPT_USERAGENT => "Mozilla/4.0 (compatible; MSIE 5.01; Windows NT 5.0)",
];
curl_setopt_array($curl, $options);
$output = curl_exec($curl);
$output = str_replace('$yubin(', '', $output);
$output = str_replace(');', '', $output);
$result = (array)json_decode($output);
curl_close($curl);
if(isset($result[$decoded->postcode])) {
$pref = $result[$decoded->postcode][0];
}
}
$salt = $passwordEncoder->createSalt();
if(!empty($decoded->password)) {
$password = $passwordEncoder->encodePassword($decoded->password, $salt);
$secretKey = $customerRepository->getUniqueSecretKey();
$Customer->setPassword($password);
}
$Customer->setSecretKey($secretKey);
$Customer->setName01($decoded->user_name);
$Customer->setSex($Sex);
$Customer->setPostalcode($decoded->postcode);
$Customer->setSalt($salt);
$Customer->setSecretKey($secretKey);
$Customer->setBirth(new \DateTime($decoded->user_birthday));
if (!empty($pref)) {
$Pref = $prefRepository->find($pref);
if($Pref) {
$Customer->setPref($Pref);
}
$Customer->setAddr01(str_replace($Pref->getName(), '', $decoded->user_address));
}else {
$Customer->setAddr01($decoded->user_address);
}
$this->entityManager->persist($Customer);
$this->entityManager->flush();
return new JsonResponse(['status' => 1,], 200);
}
} catch (\Exception $e) {
return new JsonResponse(['status' => 2,], 200);
}
}
return new JsonResponse(['status' => 3,], 200);
}
/**
* @Route("/checkSyncOrder", name="checkSyncOrder", methods={"GET"})
*/
public function checkSyncOrder(OrderRepository $orderRepository, CustomerRepository $customerRepository, Request $request) {
$token = $request->get('token');
if(!empty($token)) {
try {
$decoded = JWT::decode($token, new Key($this->keyJwt, 'HS256'));
$Customer = $customerRepository->findOneBy(['phone_number' => $decoded->user_phone]);
if($Customer) {
$order = $orderRepository->findOneBy(['id' => $decoded->order_id]);
if($order) {
if(
( ( $order->getOrderStatus()->getId() == OrderStatus::NEW || $order->getOrderStatus()->getId() == OrderStatus::PENDING or $order->getOrderStatus()->getId() == OrderStatus::PROCESSING) &&
$decoded->created_at_order == $order->getCreateDate()->format('Y-m-d H:i:s') &&
$decoded->usePoint == $order->getUsePoint() && $decoded->addPoint == $order->getAddPoint()) ||
($order->getOrderStatus()->getId() != OrderStatus::PROCESSING &&
$decoded->created_at_order == $order->getCreateDate()->format('Y-m-d H:i:s') &&
$decoded->updated_at_order == $order->getUpdateDate()->format('Y-m-d H:i:s') &&
$decoded->usePoint == $order->getUsePoint() && $decoded->addPoint == $order->getAddPoint())
) {
$customerOrder = $order->getCustomer();
if($customerOrder->getId()) {
if ($customerOrder->getId() == $Customer->getId()) {
die('1');
}
}
}
}
}
} catch (\Exception $e) {
die('2');
}
}
die('3');
}
/**
* @Route("/syncPointBel", name="syncPointBel", methods={"GET"})
*/
public function syncPointBel(CustomerRepository $customerRepository, Request $request) {
$token = $request->get('token');
if(!empty($token)) {
try {
$decoded = JWT::decode($token, new Key($this->keyJwt, 'HS256'));
$Customer = $customerRepository->findOneBy(['phone_number' => $decoded->user_phone]);
if($Customer) {
$Customer->setPoint($decoded->pointBel);
$this->entityManager->persist($Customer);
$this->entityManager->flush();
return new JsonResponse(['status' => 1,], 200);
}
} catch (\Exception $e) {
return new JsonResponse(['status' => 2,], 200);
}
}
return new JsonResponse(['status' => 3,], 200);
}
/**
* @Route("/syncCustomerDelete", name="syncCustomerDelete", methods={"GET"})
*/
public function syncCustomerDelete(CartRepository $cartRepository, OrderRepository $orderRepository, CustomerRepository $customerRepository, CustomerStatusRepository $customerStatusRepository, Request $request) {
$token = $request->get('token');
if(!empty($token)) {
try {
$decoded = JWT::decode($token, new Key($this->keyJwt, 'HS256'));
$Customer = $customerRepository->findOneBy(['phone_number' => $decoded->user_phone]);
if($Customer) {
$Cart = $cartRepository->findOneBy(['Customer' => $Customer]);
if($Cart) {
$cartRepository->delete($Cart);
$this->entityManager->flush();
}
$CustomerStatus = $customerStatusRepository->find(CustomerStatus::WITHDRAWING);
$Customer->setStatus($CustomerStatus);
$Customer->setEmail('9999'.$Customer->getEmail());
$Customer->setPhonenumber('9999'.$Customer->getPhonenumber());
$this->entityManager->persist($Customer);
$this->entityManager->flush();
return new JsonResponse(['status' => 1,], 200);
}
} catch (\Exception $e) {
return new JsonResponse(['status' => 2,], 200);
}
}
return new JsonResponse(['status' => 3,], 200);
}
}