<?php
namespace Whater\UI\WebBundle\Controller\Product;
use JMS\Serializer\SerializationContext;
use Whater\UI\WebBundle\Controller\AbstractBusController;
use Symfony\Component\Routing\Annotation\Route;
use Symfony\Component\HttpFoundation\RedirectResponse;
use Symfony\Component\HttpFoundation\Request;
use Symfony\Component\Security\Core\Authentication\Token\UsernamePasswordToken;
use Whater\Application\UseCase\Product\CommandRequest\AppUserConfirmCartOrderCommand;
use Whater\Application\UseCase\Product\CommandRequest\AppEditCartOrderCommand;
use Whater\Application\UseCase\Product\CommandRequest\AssignUserToCartOrderCommand;
use Whater\Application\UseCase\Product\CommandRequest\GetCartOrderForCheckoutCommand;
use Whater\Application\UseCase\Security\CommandRequest\LoginCommand;
use Whater\Application\UseCase\Security\CommandRequest\SignupCommand;
use Whater\Domain\Security\Exception\AccessDeniedException;
use Whater\Domain\User\Model\Role;
use Whater\Infrastructure\ProductBundle\Form\Type\AppUserConfirmCartOrderType;
use Whater\Infrastructure\SecurityBundle\Form\Type\LoginType;
use Whater\Infrastructure\SecurityBundle\Form\Type\SignupType;
use Whater\Infrastructure\SecurityBundle\Security\Model\Auth;
/**
* @Route("public/cart-order")
*/
class PublicCartOrderController extends AbstractBusController
{
/**
* @Route("/resume/{cartOrderId}", name="web_public_cart_order_resume", defaults={"_format" = "html"})
*/
public function cartOrderAction(Request $request, $cartOrderId)
{
$cartOrder = null;
$cartOrderSerialized = '';
$paymentMode = 'euros';
try {
$grantUser = $this->getGrantedUser();
$cartOrder = $this->handle(new GetCartOrderForCheckoutCommand($cartOrderId, $grantUser));
if ($cartOrder == null) {
return new RedirectResponse($this->router()->generate('web_init', array(), true));
}
$cartOrderSerialized = $this->jmsSerializer()->serialize(
$cartOrder,
'json',
SerializationContext::create()->setGroups(['Default', 'CartOrderResume'])
);
if ($request->get('payment-mode')) {
$paymentMode = $request->get('payment-mode');
}
if ($paymentMode != 'euros' && $paymentMode != 'whatercoins') {
$paymentMode = 'euros';
}
} catch (\Exception $e) {
$errorMessage = '<br/>' . $this->translator()->trans($e->getMessage());
$this->setFlash('error', $this->translator()->trans('admin.cartOrder.cart.exception') . $errorMessage);
}
return $this->render('Product/public_cart_order_resume.html.twig', array(
'cartOrder' => $cartOrder,
'cartOrderSerialized' => $cartOrderSerialized,
'paymentMode' => $paymentMode
));
}
/**
* @Route("/cart-order-checkout/{cartOrderId}", name="web_public_cart_order_checkout", defaults={"_format" = "html"})
*/
public function checkoutCartOrderAction(Request $request, $cartOrderId)
{
$cartOrder = null;
$loginForm = null;
$signupForm = null;
$appUserConfirmCartOrderForm = null;
try {
$grantedUser = $this->getGrantedUser();
$cartOrder = $this->handle(new GetCartOrderForCheckoutCommand($cartOrderId, $grantedUser, true));
if ($cartOrder == null) {
return new RedirectResponse($this->router()->generate('web_init', array(), true));
}
if ($cartOrder->user() == null && $grantedUser != null) {
// After login, assign the user to the cartOrder
$cartOrder = $this->handle(new AssignUserToCartOrderCommand(
$cartOrder,
$grantedUser
));
}
$targetPath = $this->router()->generate('web_public_cart_order_checkout', ['cartOrderId' => $cartOrderId], true);
//login user form
$loginForm = $this->getFormFactory()->create(
LoginType::class,
LoginCommand::convertToDTO(),
array(
'action' => $this->router()->generate('web_login_check', array('_target_path' => $targetPath), true),
'method' => 'POST',
'csrf_protection' => true
)
);
//register new user form
$signupForm = $this->getFormFactory()->create(
SignupType::class,
SignupCommand::convertToDTO(),
array(
'action' => $this->router()->generate('web_public_cart_order_checkout', array('cartOrderId' => $cartOrderId), true),
'method' => 'POST',
'csrf_protection' => true
)
);
//complete cart order form
$appUserConfirmCartOrderForm = $this->getFormFactory()->create(
AppUserConfirmCartOrderType::class,
AppUserConfirmCartOrderCommand::convertToDTO($cartOrder),
array(
'method' => 'POST',
'csrf_protection' => true,
'cart_order' => $cartOrder
)
);
if ($grantedUser == null) {
if ($request->isMethod('POST')) {
$signupForm->handleRequest($request);
if ($signupForm->isSubmitted() && $signupForm->isValid()) {
$user = $this->handle(SignupCommand::fromDTO($signupForm->getData()));
$cartOrder = $this->handle(new AssignUserToCartOrderCommand(
$cartOrder,
$user
));
//Autenticate
$roles = ['ROLE_USER'];
$token = new UsernamePasswordToken(new Auth($user), null, "main", $roles);
$this->tokenStorage()->setToken($token); //now the user is logged in
$this->session()->set('_security_main', serialize($token));
return new RedirectResponse($this->router()->generate('web_public_cart_order_checkout', ['cartOrderId' => $cartOrderId]));
} else {
$this->setFlash('error', $this->translator()->trans('cart_order.public.checkout_cart_order.invalid_form'));
}
}
} else {
if ($request->isMethod('POST')) {
$appUserConfirmCartOrderForm->handleRequest($request);
if ($appUserConfirmCartOrderForm->isSubmitted() && $appUserConfirmCartOrderForm->isValid()) {
$cartOrder = $this->handle(AppUserConfirmCartOrderCommand::fromDTO($appUserConfirmCartOrderForm->getData()));
return new RedirectResponse($this->router()->generate('web_public_cart_order_checkout', ['cartOrderId' => $cartOrderId]));
} else {
$this->setFlash('error', $this->translator()->trans('cart_order.public.checkout_cart_order.invalid_form'));
}
}
}
} catch (AccessDeniedException $ade) {
$errorMessage = '<br/>' . $this->translator()->trans($ade->getMessage());
$this->setFlash('error', $this->translator()->trans('cart_order.app.checkout_cart_order.errors.access_exception') . $errorMessage);
return new RedirectResponse($this->router()->generate('web_init'));
} catch (\Exception $e) {
$this->setFlash('error', $e->getMessage());
return new RedirectResponse($this->router()->generate('web_init', array(), true));
}
return $this->render('Product/public_cart_order_checkout.html.twig', array(
'cartOrder' => $cartOrder,
'appUserConfirmCartOrderForm' => $appUserConfirmCartOrderForm->createView(),
'loginForm' => $loginForm->createView(),
'signupForm' => $signupForm->createView()
));
}
}