src/AdminFOSUserBundle/Controller/AdminResettingController.php line 178

Open in your IDE?
  1. <?php
  2. /*
  3. * This file is part of the Sonata Project package.
  4. *
  5. * (c) Thomas Rabaix <thomas.rabaix@sonata-project.org>
  6. *
  7. * For the full copyright and license information, please view the LICENSE
  8. * file that was distributed with this source code.
  9. */
  10. namespace AdminFOSUserBundle\Controller;
  11. use AdminBundle\Entity\Booking;
  12. use AdminBundle\Entity\BookingHistory;
  13. use AdminBundle\Entity\BookingReview;
  14. use AdminBundle\WebSockets\NotificationPusher;
  15. use FOS\UserBundle\Util\TokenGeneratorInterface;
  16. use Symfony\Bundle\FrameworkBundle\Controller\AbstractController;
  17. use Symfony\Component\HttpFoundation\JsonResponse;
  18. use Symfony\Component\HttpFoundation\RedirectResponse;
  19. use Symfony\Component\HttpFoundation\Request;
  20. use Symfony\Component\HttpFoundation\Response;
  21. use Symfony\Component\Security\Core\Exception\AccountStatusException;
  22. class AdminResettingController extends AbstractController
  23. {
  24. /**
  25. * @param Request $request
  26. * @return Response
  27. */
  28. public function requestAction(Request $request)
  29. {
  30. if ($this->get('security.authorization_checker')->isGranted('IS_AUTHENTICATED_FULLY')) {
  31. return $this->get('authentication.handler.login_success_handler')->onAuthenticationSuccess($request, $this->get('security.token_storage')->getToken());
  32. }
  33. return $this->render('@SonataUser/Admin/Security/Resetting/request.html.twig', array(
  34. 'base_template' => $this->get('sonata.admin.pool')->getTemplate('layout'),
  35. 'admin_pool' => $this->get('sonata.admin.pool'),
  36. ));
  37. }
  38. /**
  39. * @param Request $request
  40. *
  41. * @return Response
  42. */
  43. public function sendEmailAction(Request $request)
  44. {
  45. $username = $request->request->get('username');
  46. /** @var $userManager \FOS\UserBundle\Model\UserManagerInterface */
  47. $userManager = $this->get('fos_user.user_manager');
  48. $user = $userManager->findUserByUsernameOrEmail($username);
  49. $ttl = $this->container->getParameter('fos_user.resetting.retry_ttl');
  50. if (null !== $user && !$user->isPasswordRequestNonExpired($ttl)) {
  51. if (!$user->isAccountNonLocked()) {
  52. return new RedirectResponse($this->get('router')->generate('sonata_user_admin_resetting_request'));
  53. }
  54. if (null === $user->getConfirmationToken()) {
  55. /** @var $tokenGenerator TokenGeneratorInterface */
  56. $tokenGenerator = $this->get('fos_user.util.token_generator');
  57. $user->setConfirmationToken($tokenGenerator->generateToken());
  58. }
  59. $this->get('security.service')->sendResettingEmailMessage($user);
  60. $user->setPasswordRequestedAt(new \DateTime());
  61. $userManager->updateUser($user);
  62. }
  63. return new RedirectResponse($this->generateUrl('sonata_user_admin_resetting_check_email', array(
  64. 'username' => $username,
  65. )));
  66. }
  67. /**
  68. * @param Request $request
  69. *
  70. * @return Response
  71. */
  72. public function checkEmailAction(Request $request)
  73. {
  74. $username = $request->query->get('username');
  75. if (empty($username)) {
  76. // the user does not come from the sendEmail action
  77. return new RedirectResponse($this->generateUrl('sonata_user_admin_resetting_request'));
  78. }
  79. return $this->render('@SonataUser/Admin/Security/Resetting/checkEmail.html.twig', array(
  80. 'base_template' => $this->get('sonata.admin.pool')->getTemplate('layout'),
  81. 'admin_pool' => $this->get('sonata.admin.pool'),
  82. 'tokenLifetime' => ceil($this->container->getParameter('fos_user.resetting.retry_ttl') / 3600),
  83. ));
  84. }
  85. /**
  86. * @param Request $request
  87. * @param string $token
  88. *
  89. * @return Response
  90. */
  91. public function resetAction(Request $request, $token)
  92. {
  93. if ($this->get('security.authorization_checker')->isGranted('IS_AUTHENTICATED_FULLY')) {
  94. return $this->get('authentication.handler.login_success_handler')->onAuthenticationSuccess($request, $this->get('security.token_storage')->getToken());
  95. }
  96. /** @var $formFactory \FOS\UserBundle\Form\Factory\FactoryInterface */
  97. $formFactory = $this->get('fos_user.resetting.form.factory');
  98. /** @var $userManager \FOS\UserBundle\Model\UserManagerInterface */
  99. $userManager = $this->get('fos_user.user_manager');
  100. /** @var $loginManager \FOS\UserBundle\Security\LoginManagerInterface */
  101. $loginManager = $this->get('fos_user.security.login_manager');
  102. $user = $userManager->findUserByConfirmationToken($token);
  103. $firewallName = $this->container->getParameter('fos_user.firewall_name');
  104. if (null === $user) {
  105. $this->get('session')->getFlashBag()->add('danger', sprintf('The user with "confirmation token" does not exist for value "%s"', $token));
  106. return new RedirectResponse($this->generateUrl('sonata_user_admin_security_login'));
  107. }
  108. if (!$user->isPasswordRequestNonExpired($this->container->getParameter('fos_user.resetting.token_ttl'))) {
  109. return new RedirectResponse($this->generateUrl('sonata_user_admin_resetting_request'));
  110. }
  111. $form = $formFactory->createForm();
  112. $form->setData($user);
  113. $form->handleRequest($request);
  114. if ($form->isSubmitted() && $form->isValid()) {
  115. $user->setConfirmationToken(null);
  116. $user->setPasswordRequestedAt(null);
  117. $user->setEnabled(true);
  118. $message = $this->get('translator')->trans('resetting.flash.success', array(), 'FOSUserBundle');
  119. $this->addFlash('success', $message);
  120. $response = new RedirectResponse($this->generateUrl('sonata_admin_dashboard'));
  121. try {
  122. $loginManager->logInUser($firewallName, $user, $response);
  123. $response = $this->get('authentication.handler.login_success_handler')->onAuthenticationSuccess($request, $this->get('security.token_storage')->getToken());
  124. $user->setLastLogin(new \DateTime());
  125. } catch (AccountStatusException $ex) {
  126. // We simply do not authenticate users which do not pass the user
  127. // checker (not enabled, expired, etc.).
  128. if ($this->has('logger')) {
  129. $this->get('logger')->warning(sprintf(
  130. 'Unable to login user %d after password reset',
  131. $user->getId())
  132. );
  133. }
  134. }
  135. $userManager->updateUser($user);
  136. return $response;
  137. }
  138. return $this->render('@SonataUser/Admin/Security/Resetting/reset.html.twig', array(
  139. 'token' => $token,
  140. 'form' => $form->createView(),
  141. 'base_template' => $this->get('sonata.admin.pool')->getTemplate('layout'),
  142. 'admin_pool' => $this->get('sonata.admin.pool'),
  143. ));
  144. }
  145. public function privacyAction(Request $request)
  146. {
  147. return $this->render('@SonataUser/Admin/privacy.html.twig');
  148. }
  149. public function appAction(Request $request)
  150. {
  151. return $this->render('SonataUserBundle:Admin:app.html.twig');
  152. }
  153. public function bookingReviewAction($id, Request $request)
  154. {
  155. $em = $this->getDoctrine()->getManager();
  156. $booking = $this->get('doctrine')->getRepository(Booking::class)->findOneBy([
  157. 'key' => $id,
  158. ]);
  159. if (!$booking) {
  160. return new JsonResponse([
  161. "status" => 400,
  162. "message" => "Invalid booking key.",
  163. ]);
  164. }
  165. if (empty($booking->getDriver())) {
  166. return new JsonResponse([
  167. "status" => 400,
  168. "message" => "This booking has no driver.",
  169. ]);
  170. }
  171. $user = $booking->getClientUser();
  172. if (empty($user)) {
  173. return new JsonResponse([
  174. "status" => 403,
  175. "message" => "You are not allowed to review this booking.",
  176. ]);
  177. }
  178. $securityService = $this->get('security.service');
  179. $roles = $securityService->isRoleClientOrCompany($user->getRoles());
  180. if (empty($roles)) {
  181. return new JsonResponse([
  182. "status" => 403,
  183. "message" => "You are not allowed to review this booking.",
  184. ]);
  185. }
  186. $review = $this->get('doctrine')->getRepository(BookingReview::class)->findOneBy([
  187. 'booking' => $booking->getId(), 'client' => $user->getId(),
  188. ]);
  189. $review_rating = 0;
  190. $review_content = "";
  191. $isReviewed = false;
  192. if (!empty($review)) {
  193. $review_rating = $review->getRating();
  194. $review_content = $review->getReviewContent();
  195. $isReviewed = true;
  196. }
  197. if ($request->isMethod('POST')) {
  198. $rating = intval($request->request->get('rating'));
  199. $reviewContent = addslashes($request->request->get('review_content'));
  200. if (!$rating) {
  201. return new JsonResponse([
  202. "status" => 400,
  203. "message" => "Please add a rating value.",
  204. ]);
  205. }
  206. if ($rating < 1 || $rating > 5) {
  207. return new JsonResponse([
  208. "status" => 400,
  209. "message" => "Rating value must be between 1-5.",
  210. ]);
  211. }
  212. if (empty($review)) {
  213. $bookingReview = new BookingReview();
  214. $bookingReview->setRating($rating);
  215. $bookingReview->setReviewContent($reviewContent);
  216. $bookingReview->setBooking($booking);
  217. $bookingReview->setClient($user);
  218. $bookingReview->setDriver($booking->getDriver());
  219. $em->persist($bookingReview);
  220. } else {
  221. $review->setRating($rating);
  222. $review->setReviewContent($reviewContent);
  223. }
  224. $bookingHistoryDriver = new BookingHistory();
  225. $bookingHistoryDriver->setBooking($booking);
  226. $bookingHistoryDriver->setActionType(BookingHistory::ACTION_TYPE_ADDED_REVIEW);
  227. $bookingHistoryDriver->setUser($user);
  228. $bookingHistoryDriver->setPayload(['status' => 'add_review']);
  229. $em->persist($bookingHistoryDriver);
  230. $em->flush();
  231. $driver = $booking->getDriver();
  232. if ($driver && $driver->getUser() && $driver->getUser()->getApiKey()) {
  233. $this
  234. ->get('websocket_notification.service')
  235. ->send([
  236. 'apiKey' => $driver->getUser()->getApiKey(),
  237. 'data' => [
  238. 'event' => NotificationPusher::SEND_CLIENT_BOOKING_REVIEW_EVENT,
  239. 'booking' => $id,
  240. 'message' => 'New review on one of your bookings',
  241. ],
  242. ]);
  243. }
  244. return $this->render('@SonataUser/Admin/Security/Review/review-booking.html.twig', array(
  245. 'base_template' => $this->get('sonata.admin.pool')->getTemplate('layout'),
  246. 'admin_pool' => $this->get('sonata.admin.pool'),
  247. 'review_rating' => $rating,
  248. 'review_content' => $reviewContent,
  249. 'bookingKey' => $booking->getKey(),
  250. 'pickupAddress' => $booking->getPickUpAddress(),
  251. 'destinationAddress' => $booking->getDestinationAddress(),
  252. 'bookingDate' => $booking->getPickUpDate(),
  253. 'isReviewed' => true,
  254. ));
  255. }
  256. return $this->render('@SonataUser/Admin/Security/Review/review-booking.html.twig', array(
  257. 'base_template' => $this->get('sonata.admin.pool')->getTemplate('layout'),
  258. 'admin_pool' => $this->get('sonata.admin.pool'),
  259. 'review_rating' => $review_rating,
  260. 'review_content' => $review_content,
  261. 'bookingKey' => $booking->getKey(),
  262. 'pickupAddress' => $booking->getPickUpAddress(),
  263. 'destinationAddress' => $booking->getDestinationAddress(),
  264. 'bookingDate' => $booking->getPickUpDateTime()->format('Y-m-d H:s:i'),
  265. 'isReviewed' => $isReviewed,
  266. ));
  267. }
  268. }