<?php
/*
* This file is part of the Sonata Project package.
*
* (c) Thomas Rabaix <thomas.rabaix@sonata-project.org>
*
* For the full copyright and license information, please view the LICENSE
* file that was distributed with this source code.
*/
namespace AdminFOSUserBundle\Controller;
use AdminBundle\Entity\Booking;
use AdminBundle\Entity\BookingHistory;
use AdminBundle\Entity\BookingReview;
use AdminBundle\WebSockets\NotificationPusher;
use FOS\UserBundle\Util\TokenGeneratorInterface;
use Symfony\Bundle\FrameworkBundle\Controller\AbstractController;
use Symfony\Component\HttpFoundation\JsonResponse;
use Symfony\Component\HttpFoundation\RedirectResponse;
use Symfony\Component\HttpFoundation\Request;
use Symfony\Component\HttpFoundation\Response;
use Symfony\Component\Security\Core\Exception\AccountStatusException;
class AdminResettingController extends AbstractController
{
/**
* @param Request $request
* @return Response
*/
public function requestAction(Request $request)
{
if ($this->get('security.authorization_checker')->isGranted('IS_AUTHENTICATED_FULLY')) {
return $this->get('authentication.handler.login_success_handler')->onAuthenticationSuccess($request, $this->get('security.token_storage')->getToken());
}
return $this->render('@SonataUser/Admin/Security/Resetting/request.html.twig', array(
'base_template' => $this->get('sonata.admin.pool')->getTemplate('layout'),
'admin_pool' => $this->get('sonata.admin.pool'),
));
}
/**
* @param Request $request
*
* @return Response
*/
public function sendEmailAction(Request $request)
{
$username = $request->request->get('username');
/** @var $userManager \FOS\UserBundle\Model\UserManagerInterface */
$userManager = $this->get('fos_user.user_manager');
$user = $userManager->findUserByUsernameOrEmail($username);
$ttl = $this->container->getParameter('fos_user.resetting.retry_ttl');
if (null !== $user && !$user->isPasswordRequestNonExpired($ttl)) {
if (!$user->isAccountNonLocked()) {
return new RedirectResponse($this->get('router')->generate('sonata_user_admin_resetting_request'));
}
if (null === $user->getConfirmationToken()) {
/** @var $tokenGenerator TokenGeneratorInterface */
$tokenGenerator = $this->get('fos_user.util.token_generator');
$user->setConfirmationToken($tokenGenerator->generateToken());
}
$this->get('security.service')->sendResettingEmailMessage($user);
$user->setPasswordRequestedAt(new \DateTime());
$userManager->updateUser($user);
}
return new RedirectResponse($this->generateUrl('sonata_user_admin_resetting_check_email', array(
'username' => $username,
)));
}
/**
* @param Request $request
*
* @return Response
*/
public function checkEmailAction(Request $request)
{
$username = $request->query->get('username');
if (empty($username)) {
// the user does not come from the sendEmail action
return new RedirectResponse($this->generateUrl('sonata_user_admin_resetting_request'));
}
return $this->render('@SonataUser/Admin/Security/Resetting/checkEmail.html.twig', array(
'base_template' => $this->get('sonata.admin.pool')->getTemplate('layout'),
'admin_pool' => $this->get('sonata.admin.pool'),
'tokenLifetime' => ceil($this->container->getParameter('fos_user.resetting.retry_ttl') / 3600),
));
}
/**
* @param Request $request
* @param string $token
*
* @return Response
*/
public function resetAction(Request $request, $token)
{
if ($this->get('security.authorization_checker')->isGranted('IS_AUTHENTICATED_FULLY')) {
return $this->get('authentication.handler.login_success_handler')->onAuthenticationSuccess($request, $this->get('security.token_storage')->getToken());
}
/** @var $formFactory \FOS\UserBundle\Form\Factory\FactoryInterface */
$formFactory = $this->get('fos_user.resetting.form.factory');
/** @var $userManager \FOS\UserBundle\Model\UserManagerInterface */
$userManager = $this->get('fos_user.user_manager');
/** @var $loginManager \FOS\UserBundle\Security\LoginManagerInterface */
$loginManager = $this->get('fos_user.security.login_manager');
$user = $userManager->findUserByConfirmationToken($token);
$firewallName = $this->container->getParameter('fos_user.firewall_name');
if (null === $user) {
$this->get('session')->getFlashBag()->add('danger', sprintf('The user with "confirmation token" does not exist for value "%s"', $token));
return new RedirectResponse($this->generateUrl('sonata_user_admin_security_login'));
}
if (!$user->isPasswordRequestNonExpired($this->container->getParameter('fos_user.resetting.token_ttl'))) {
return new RedirectResponse($this->generateUrl('sonata_user_admin_resetting_request'));
}
$form = $formFactory->createForm();
$form->setData($user);
$form->handleRequest($request);
if ($form->isSubmitted() && $form->isValid()) {
$user->setConfirmationToken(null);
$user->setPasswordRequestedAt(null);
$user->setEnabled(true);
$message = $this->get('translator')->trans('resetting.flash.success', array(), 'FOSUserBundle');
$this->addFlash('success', $message);
$response = new RedirectResponse($this->generateUrl('sonata_admin_dashboard'));
try {
$loginManager->logInUser($firewallName, $user, $response);
$response = $this->get('authentication.handler.login_success_handler')->onAuthenticationSuccess($request, $this->get('security.token_storage')->getToken());
$user->setLastLogin(new \DateTime());
} catch (AccountStatusException $ex) {
// We simply do not authenticate users which do not pass the user
// checker (not enabled, expired, etc.).
if ($this->has('logger')) {
$this->get('logger')->warning(sprintf(
'Unable to login user %d after password reset',
$user->getId())
);
}
}
$userManager->updateUser($user);
return $response;
}
return $this->render('@SonataUser/Admin/Security/Resetting/reset.html.twig', array(
'token' => $token,
'form' => $form->createView(),
'base_template' => $this->get('sonata.admin.pool')->getTemplate('layout'),
'admin_pool' => $this->get('sonata.admin.pool'),
));
}
public function privacyAction(Request $request)
{
return $this->render('@SonataUser/Admin/privacy.html.twig');
}
public function appAction(Request $request)
{
return $this->render('SonataUserBundle:Admin:app.html.twig');
}
public function bookingReviewAction($id, Request $request)
{
$em = $this->getDoctrine()->getManager();
$booking = $this->get('doctrine')->getRepository(Booking::class)->findOneBy([
'key' => $id,
]);
if (!$booking) {
return new JsonResponse([
"status" => 400,
"message" => "Invalid booking key.",
]);
}
if (empty($booking->getDriver())) {
return new JsonResponse([
"status" => 400,
"message" => "This booking has no driver.",
]);
}
$user = $booking->getClientUser();
if (empty($user)) {
return new JsonResponse([
"status" => 403,
"message" => "You are not allowed to review this booking.",
]);
}
$securityService = $this->get('security.service');
$roles = $securityService->isRoleClientOrCompany($user->getRoles());
if (empty($roles)) {
return new JsonResponse([
"status" => 403,
"message" => "You are not allowed to review this booking.",
]);
}
$review = $this->get('doctrine')->getRepository(BookingReview::class)->findOneBy([
'booking' => $booking->getId(), 'client' => $user->getId(),
]);
$review_rating = 0;
$review_content = "";
$isReviewed = false;
if (!empty($review)) {
$review_rating = $review->getRating();
$review_content = $review->getReviewContent();
$isReviewed = true;
}
if ($request->isMethod('POST')) {
$rating = intval($request->request->get('rating'));
$reviewContent = addslashes($request->request->get('review_content'));
if (!$rating) {
return new JsonResponse([
"status" => 400,
"message" => "Please add a rating value.",
]);
}
if ($rating < 1 || $rating > 5) {
return new JsonResponse([
"status" => 400,
"message" => "Rating value must be between 1-5.",
]);
}
if (empty($review)) {
$bookingReview = new BookingReview();
$bookingReview->setRating($rating);
$bookingReview->setReviewContent($reviewContent);
$bookingReview->setBooking($booking);
$bookingReview->setClient($user);
$bookingReview->setDriver($booking->getDriver());
$em->persist($bookingReview);
} else {
$review->setRating($rating);
$review->setReviewContent($reviewContent);
}
$bookingHistoryDriver = new BookingHistory();
$bookingHistoryDriver->setBooking($booking);
$bookingHistoryDriver->setActionType(BookingHistory::ACTION_TYPE_ADDED_REVIEW);
$bookingHistoryDriver->setUser($user);
$bookingHistoryDriver->setPayload(['status' => 'add_review']);
$em->persist($bookingHistoryDriver);
$em->flush();
$driver = $booking->getDriver();
if ($driver && $driver->getUser() && $driver->getUser()->getApiKey()) {
$this
->get('websocket_notification.service')
->send([
'apiKey' => $driver->getUser()->getApiKey(),
'data' => [
'event' => NotificationPusher::SEND_CLIENT_BOOKING_REVIEW_EVENT,
'booking' => $id,
'message' => 'New review on one of your bookings',
],
]);
}
return $this->render('@SonataUser/Admin/Security/Review/review-booking.html.twig', array(
'base_template' => $this->get('sonata.admin.pool')->getTemplate('layout'),
'admin_pool' => $this->get('sonata.admin.pool'),
'review_rating' => $rating,
'review_content' => $reviewContent,
'bookingKey' => $booking->getKey(),
'pickupAddress' => $booking->getPickUpAddress(),
'destinationAddress' => $booking->getDestinationAddress(),
'bookingDate' => $booking->getPickUpDate(),
'isReviewed' => true,
));
}
return $this->render('@SonataUser/Admin/Security/Review/review-booking.html.twig', array(
'base_template' => $this->get('sonata.admin.pool')->getTemplate('layout'),
'admin_pool' => $this->get('sonata.admin.pool'),
'review_rating' => $review_rating,
'review_content' => $review_content,
'bookingKey' => $booking->getKey(),
'pickupAddress' => $booking->getPickUpAddress(),
'destinationAddress' => $booking->getDestinationAddress(),
'bookingDate' => $booking->getPickUpDateTime()->format('Y-m-d H:s:i'),
'isReviewed' => $isReviewed,
));
}
}