<?php
namespace Bidcoz\Bundle\UserBundle\Controller;
use Bidcoz\Bundle\CoreBundle\Controller\CoreController;
use FOS\UserBundle\Event\FilterUserResponseEvent;
use FOS\UserBundle\Event\FormEvent;
use FOS\UserBundle\Event\GetResponseUserEvent;
use FOS\UserBundle\FOSUserEvents;
use Symfony\Component\HttpFoundation\RedirectResponse;
use Symfony\Component\HttpFoundation\Request;
use Symfony\Component\HttpFoundation\Response;
use Symfony\Component\HttpKernel\Exception\NotFoundHttpException;
use Symfony\Component\Security\Core\Security;
class ResettingController extends CoreController
{
public function request(Request $request)
{
$session = $request->getSession();
// last username entered by the user
$lastUsername = (null === $session) ? '' : $session->get(Security::LAST_USERNAME);
return $this->render('@FOSUser/Resetting/request.html.twig', [
'last_username' => $lastUsername,
]);
}
public function reset(Request $request, $token)
{
$formFactory = $this->get('fos_user.resetting.form.factory');
$userManager = $this->getUserManager();
$dispatcher = $this->getEventDispatcher();
$router = $this->getRouter();
$user = $userManager->findUserByConfirmationToken($token);
if (null === $user) {
throw new NotFoundHttpException(sprintf('The user with "confirmation token" does not exist for value "%s"', $token));
}
$event = new GetResponseUserEvent($user, $request);
$dispatcher->dispatch($event, FOSUserEvents::RESETTING_RESET_INITIALIZE);
if (null !== $event->getResponse()) {
return $event->getResponse();
}
$form = $formFactory->createForm();
$form->setData($user);
$form->handleRequest($request);
if ($form->isSubmitted() && $form->isValid()) {
$event = new FormEvent($form, $request);
$dispatcher->dispatch($event, FOSUserEvents::RESETTING_RESET_SUCCESS);
$userManager->updateUser($user);
if (null === $response = $event->getResponse()) {
if ($campaign = $user->getLastVisitCampaign()) {
$url = $router->generate('campaign_home', [
'orgSlug' => $campaign->getOrganization()->getSlug(),
'campaignSlug' => $campaign->getSlug(),
]);
$response = new RedirectResponse($url);
} elseif ($organization = $user->getLastVisitOrganization()) {
$url = $this->generateUrl('organization_home', [
'orgSlug' => $organization->getSlug(),
]);
$response = new RedirectResponse($url);
} else {
$url = $this->generateUrl('fos_user_profile_edit');
$response = new RedirectResponse($url);
}
}
$dispatcher->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(),
]);
}
/**
* Tell the user to check his email provider.
*
* @return RedirectResponse|Response|null
*/
public function checkEmail(Request $request)
{
$username = $request->query->get('username');
$user = $this->getUserManager()->findUserByUsernameOrEmail($username);
if (null === $user) {
// the user does not exist
return $this->render('@FOSUser/Resetting/no_account.html.twig');
}
if (empty($username)) {
// the user does not come from the sendEmail action
return new RedirectResponse($this->generateUrl('fos_user_resetting_request'));
}
return $this->render('@FOSUser/Resetting/check_email.html.twig', [
'email' => $username,
'tokenLifetime' => ceil($this->container->getParameter('fos_user.resetting.token_ttl') / 3600),
]);
}
}