<?php
namespace FMT\Application\Controller\Common;
use FMT\Data\Entity\User;
use FMT\Application\FormType\Security\UserPasswordType;
use FMT\Application\Traits\ControllerHelperTrait;
use FMT\Domain\Service\Manager\UserManager;
use FOS\UserBundle\Event\FilterUserResponseEvent;
use FOS\UserBundle\Event\GetResponseUserEvent;
use FOS\UserBundle\Form\Factory\FactoryInterface;
use FOS\UserBundle\FOSUserEvents;
use FOS\UserBundle\Mailer\MailerInterface;
use FOS\UserBundle\Model\UserManagerInterface;
use FOS\UserBundle\Util\TokenGeneratorInterface;
use Sensio\Bundle\FrameworkExtraBundle\Configuration\ParamConverter;
use Sensio\Bundle\FrameworkExtraBundle\Configuration\Route;
use Sensio\Bundle\FrameworkExtraBundle\Configuration\Security;
use Sensio\Bundle\FrameworkExtraBundle\Configuration\Template;
use Symfony\Component\EventDispatcher\EventDispatcherInterface;
use Symfony\Component\HttpFoundation\JsonResponse;
use Symfony\Component\HttpFoundation\RedirectResponse;
use Symfony\Component\HttpFoundation\Request;
use FOS\UserBundle\Controller\ResettingController as FOSBaseController;
use Symfony\Component\HttpFoundation\Response;
use Symfony\Component\HttpFoundation\Session\Flash\FlashBagInterface;
use Symfony\Component\HttpKernel\Exception\AccessDeniedHttpException;
/**
* Class ResetController
* @package FMT\Application\Controller
* @Route("/resetting")
* @Template()
* @SuppressWarnings(PHPMD.CouplingBetweenObjects)
*/
class ResetController extends FOSBaseController
{
use ControllerHelperTrait;
const ROUTE_RESET = 'fmt-reset-reset';
const ROUTE_SEND_EMAIL = 'fmt-reset-send-email';
const ROUTE_CHECK_EMAIL = 'fmt-reset-check-email';
const ROUTE_REQUEST = 'fmt-reset-request';
/**
* @var EventDispatcherInterface $eventDispatcher
*/
private $eventDispatcher;
private FlashBagInterface $flashBag;
public function __construct(
EventDispatcherInterface $eventDispatcher,
FactoryInterface $formFactory,
UserManagerInterface $userManager,
TokenGeneratorInterface $tokenGenerator,
MailerInterface $mailer,
$retryTtl,
FlashBagInterface $flashBag
) {
$this->flashBag = $flashBag;
parent::__construct($eventDispatcher, $formFactory, $userManager, $tokenGenerator, $mailer, $retryTtl);
}
/**
* @required
*
* @param EventDispatcherInterface $eventDispatcher
*/
public function setEventDispatcher(EventDispatcherInterface $eventDispatcher)
{
$this->eventDispatcher = $eventDispatcher;
}
/** @var UserManagerInterface */
private $manager;
/**
* @required
*
* @param UserManagerInterface $manager
*/
public function setUserManager(UserManager $manager)
{
$this->manager = $manager;
}
/**
* @return \Symfony\Component\HttpFoundation\Response
* @Route("/request", name=ResetController::ROUTE_REQUEST)
*/
public function requestAction(): Response
{
return $this->render('@FOSUser/Resetting/request.html.twig');
}
/**
* @param Request $request
* @param $token
* @param User $user
* @return null|RedirectResponse|\Symfony\Component\HttpFoundation\Response
* @Route("/reset/{token}", name=ResetController::ROUTE_RESET)
* @ParamConverter("user", class="FMT\Data\Entity\User", options={
* "repository_method" = "findUserByConfirmationToken",
* "mapping": {"token": "token"},
* "map_method_signature" = true
* })
*/
public function resetPasswordAction(Request $request, $token, User $user)
{
$event = new GetResponseUserEvent($user, $request);
$this->eventDispatcher->dispatch($event, FOSUserEvents::RESETTING_RESET_INITIALIZE);
if (null !== $event->getResponse()) {
return $event->getResponse();
}
$form = $this->createForm(UserPasswordType::class, $user);
$form->handleRequest($request);
if ($form->isSubmitted() && $form->isValid()) {
$this->manager->update($user, true);
if (null === $response = $event->getResponse()) {
//TODO change this route if needed
$url = $this->generateUrl(PublicDashboardController::ROUTE_INDEX);
$response = new RedirectResponse($url);
}
$this->eventDispatcher->dispatch(
new FilterUserResponseEvent($user, $request, $response),
FOSUserEvents::RESETTING_RESET_COMPLETED
);
return $response;
}
return $this->render('@FOSUser/Resetting/reset.html.twig', [
'token' => $token,
'form' => $form->createView(),
'email' => $user->getEmail(),
]);
}
/**
* @param Request $request
* @return JsonResponse
* @Route("/send-email", name=ResetController::ROUTE_SEND_EMAIL)
*/
public function sendEmailAction(Request $request): Response
{
if (!$request->isXmlHttpRequest()) {
throw new AccessDeniedHttpException('Incorrect request');
}
$email = $request->get('username');
$user = $this->manager->getUserByEmail($email);
if (!$user instanceof User) {
return $this->prepareJsonResponse(
[
'formError' => true,
'email' => $email,
],
'@Public/common/login/_reset_form_input.htm.twig',
false
);
}
/**
* @var $redirect RedirectResponse
*/
$redirect = parent::sendEmailAction($request);
$redirect = $redirect->getTargetUrl();
$flashBag = $this->flashBag;
$flashBag->add('success', 'fmt.registration.reset.success_reset');
return $this->prepareJsonResponse(
['email' => $email],
'@Public/common/login/_reset_form_input.htm.twig',
true,
$redirect
);
}
/**
* @param Request $request
* @return Response
* @Route("/check-email", name=ResetController::ROUTE_CHECK_EMAIL)
* @Security("not is_granted('ROLE_USER')")
*/
public function checkEmailAction(Request $request): Response
{
return parent::checkEmailAction($request);
}
}