src/AdminFOSUserBundle/Controller/AdminResettingController.php line 176

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