src/UI/WebBundle/Controller/Product/PublicCartOrderController.php line 79

Open in your IDE?
  1. <?php
  2. namespace Whater\UI\WebBundle\Controller\Product;
  3. use JMS\Serializer\SerializationContext;
  4. use Whater\UI\WebBundle\Controller\AbstractBusController;
  5. use Symfony\Component\Routing\Annotation\Route;
  6. use Symfony\Component\HttpFoundation\RedirectResponse;
  7. use Symfony\Component\HttpFoundation\Request;
  8. use Symfony\Component\Security\Core\Authentication\Token\UsernamePasswordToken;
  9. use Whater\Application\UseCase\Product\CommandRequest\AppUserConfirmCartOrderCommand;
  10. use Whater\Application\UseCase\Product\CommandRequest\AppEditCartOrderCommand;
  11. use Whater\Application\UseCase\Product\CommandRequest\AssignUserToCartOrderCommand;
  12. use Whater\Application\UseCase\Product\CommandRequest\GetCartOrderForCheckoutCommand;
  13. use Whater\Application\UseCase\Security\CommandRequest\LoginCommand;
  14. use Whater\Application\UseCase\Security\CommandRequest\SignupCommand;
  15. use Whater\Domain\Security\Exception\AccessDeniedException;
  16. use Whater\Domain\User\Model\Role;
  17. use Whater\Infrastructure\ProductBundle\Form\Type\AppUserConfirmCartOrderType;
  18. use Whater\Infrastructure\SecurityBundle\Form\Type\LoginType;
  19. use Whater\Infrastructure\SecurityBundle\Form\Type\SignupType;
  20. use Whater\Infrastructure\SecurityBundle\Security\Model\Auth;
  21. /**
  22. * @Route("public/cart-order")
  23. */
  24. class PublicCartOrderController extends AbstractBusController
  25. {
  26. /**
  27. * @Route("/resume/{cartOrderId}", name="web_public_cart_order_resume", defaults={"_format" = "html"})
  28. */
  29. public function cartOrderAction(Request $request, $cartOrderId)
  30. {
  31. $cartOrder = null;
  32. $cartOrderSerialized = '';
  33. $paymentMode = 'euros';
  34. try {
  35. $grantUser = $this->getGrantedUser();
  36. $cartOrder = $this->handle(new GetCartOrderForCheckoutCommand($cartOrderId, $grantUser));
  37. if ($cartOrder == null) {
  38. return new RedirectResponse($this->router()->generate('web_init', array(), true));
  39. }
  40. $cartOrderSerialized = $this->jmsSerializer()->serialize(
  41. $cartOrder,
  42. 'json',
  43. SerializationContext::create()->setGroups(['Default', 'CartOrderResume'])
  44. );
  45. if ($request->get('payment-mode')) {
  46. $paymentMode = $request->get('payment-mode');
  47. }
  48. if ($paymentMode != 'euros' && $paymentMode != 'whatercoins') {
  49. $paymentMode = 'euros';
  50. }
  51. } catch (\Exception $e) {
  52. $errorMessage = '<br/>' . $this->translator()->trans($e->getMessage());
  53. $this->setFlash('error', $this->translator()->trans('admin.cartOrder.cart.exception') . $errorMessage);
  54. }
  55. return $this->render('Product/public_cart_order_resume.html.twig', array(
  56. 'cartOrder' => $cartOrder,
  57. 'cartOrderSerialized' => $cartOrderSerialized,
  58. 'paymentMode' => $paymentMode
  59. ));
  60. }
  61. /**
  62. * @Route("/cart-order-checkout/{cartOrderId}", name="web_public_cart_order_checkout", defaults={"_format" = "html"})
  63. */
  64. public function checkoutCartOrderAction(Request $request, $cartOrderId)
  65. {
  66. $cartOrder = null;
  67. $loginForm = null;
  68. $signupForm = null;
  69. $appUserConfirmCartOrderForm = null;
  70. try {
  71. $grantedUser = $this->getGrantedUser();
  72. $cartOrder = $this->handle(new GetCartOrderForCheckoutCommand($cartOrderId, $grantedUser, true));
  73. if ($cartOrder == null) {
  74. return new RedirectResponse($this->router()->generate('web_init', array(), true));
  75. }
  76. if ($cartOrder->user() == null && $grantedUser != null) {
  77. // After login, assign the user to the cartOrder
  78. $cartOrder = $this->handle(new AssignUserToCartOrderCommand(
  79. $cartOrder,
  80. $grantedUser
  81. ));
  82. }
  83. $targetPath = $this->router()->generate('web_public_cart_order_checkout', ['cartOrderId' => $cartOrderId], true);
  84. //login user form
  85. $loginForm = $this->getFormFactory()->create(
  86. LoginType::class,
  87. LoginCommand::convertToDTO(),
  88. array(
  89. 'action' => $this->router()->generate('web_login_check', array('_target_path' => $targetPath), true),
  90. 'method' => 'POST',
  91. 'csrf_protection' => true
  92. )
  93. );
  94. //register new user form
  95. $signupForm = $this->getFormFactory()->create(
  96. SignupType::class,
  97. SignupCommand::convertToDTO(),
  98. array(
  99. 'action' => $this->router()->generate('web_public_cart_order_checkout', array('cartOrderId' => $cartOrderId), true),
  100. 'method' => 'POST',
  101. 'csrf_protection' => true
  102. )
  103. );
  104. //complete cart order form
  105. $appUserConfirmCartOrderForm = $this->getFormFactory()->create(
  106. AppUserConfirmCartOrderType::class,
  107. AppUserConfirmCartOrderCommand::convertToDTO($cartOrder),
  108. array(
  109. 'method' => 'POST',
  110. 'csrf_protection' => true,
  111. 'cart_order' => $cartOrder
  112. )
  113. );
  114. if ($grantedUser == null) {
  115. if ($request->isMethod('POST')) {
  116. $signupForm->handleRequest($request);
  117. if ($signupForm->isSubmitted() && $signupForm->isValid()) {
  118. $user = $this->handle(SignupCommand::fromDTO($signupForm->getData()));
  119. $cartOrder = $this->handle(new AssignUserToCartOrderCommand(
  120. $cartOrder,
  121. $user
  122. ));
  123. //Autenticate
  124. $roles = ['ROLE_USER'];
  125. $token = new UsernamePasswordToken(new Auth($user), null, "main", $roles);
  126. $this->tokenStorage()->setToken($token); //now the user is logged in
  127. $this->session()->set('_security_main', serialize($token));
  128. return new RedirectResponse($this->router()->generate('web_public_cart_order_checkout', ['cartOrderId' => $cartOrderId]));
  129. } else {
  130. $this->setFlash('error', $this->translator()->trans('cart_order.public.checkout_cart_order.invalid_form'));
  131. }
  132. }
  133. } else {
  134. if ($request->isMethod('POST')) {
  135. $appUserConfirmCartOrderForm->handleRequest($request);
  136. if ($appUserConfirmCartOrderForm->isSubmitted() && $appUserConfirmCartOrderForm->isValid()) {
  137. $cartOrder = $this->handle(AppUserConfirmCartOrderCommand::fromDTO($appUserConfirmCartOrderForm->getData()));
  138. return new RedirectResponse($this->router()->generate('web_public_cart_order_checkout', ['cartOrderId' => $cartOrderId]));
  139. } else {
  140. $this->setFlash('error', $this->translator()->trans('cart_order.public.checkout_cart_order.invalid_form'));
  141. }
  142. }
  143. }
  144. } catch (AccessDeniedException $ade) {
  145. $errorMessage = '<br/>' . $this->translator()->trans($ade->getMessage());
  146. $this->setFlash('error', $this->translator()->trans('cart_order.app.checkout_cart_order.errors.access_exception') . $errorMessage);
  147. return new RedirectResponse($this->router()->generate('web_init'));
  148. } catch (\Exception $e) {
  149. $this->setFlash('error', $e->getMessage());
  150. return new RedirectResponse($this->router()->generate('web_init', array(), true));
  151. }
  152. return $this->render('Product/public_cart_order_checkout.html.twig', array(
  153. 'cartOrder' => $cartOrder,
  154. 'appUserConfirmCartOrderForm' => $appUserConfirmCartOrderForm->createView(),
  155. 'loginForm' => $loginForm->createView(),
  156. 'signupForm' => $signupForm->createView()
  157. ));
  158. }
  159. }