<?php
namespace App\Http\Controller\Auth;
use App\Database\Domain\Entity\User\UserRecoverPasswordToken;
use App\Database\Domain\Repository\UserRepository;
use App\Infrastructure\Security\AuthManager;
use App\Infrastructure\Service\ActionResponseHandler;
use Sensio\Bundle\FrameworkExtraBundle\Configuration\ParamConverter;
use Symfony\Bundle\FrameworkBundle\Controller\AbstractController;
use Symfony\Component\HttpFoundation\Request;
use Symfony\Component\HttpFoundation\Response;
use Symfony\Component\Routing\Annotation\Route;
/**
* @Route("/password-recovery", name="password_recovery_")
*/
class PasswordRecoveryController extends AbstractController
{
/**
* @Route("", name="index")
*/
public function __invoke(): Response
{
return $this->render('user/auth/password_recovery.html.twig');
}
/**
* @Route("/form", name="form", methods={"POST"})
*/
public function handlePasswordChangeRequestForm(
Request $request,
AuthManager $authManager,
UserRepository $userRepository,
ActionResponseHandler $actionResponseHandler
): Response {
$user = $userRepository->findOneBy(['username' => $request->request->get('login')]);
if (!$user) {
return $actionResponseHandler->errorRedirect('password_recovery_index', 'User was not found');
}
$authManager->requestPasswordRecovery($user);
return $actionResponseHandler->successRedirect('password_recovery_index', 'Recovery link is sent to your email!');
}
/**
* @Route("/{token}", name="recover", methods={"GET"})
*
* @ParamConverter("token", options={"mapping": {"token": "token"}})
*/
public function invokeChangePassword(UserRecoverPasswordToken $token, ActionResponseHandler $actionResponseHandler): Response
{
if ($token->isUsed()) {
return $actionResponseHandler->errorRedirect('password_recovery_index', 'Password is already changed. Try to login.');
}
return $this->render('user/auth/password_recovery_change.html.twig', ['token' => $token->getToken()]);
}
/**
* @Route("/form/{token}", name="change", methods={"POST"})
*
* @ParamConverter("token", options={"mapping": {"token": "token"}})
*/
public function handleNewPasswordForm(
UserRecoverPasswordToken $token,
Request $request,
AuthManager $authManager,
ActionResponseHandler $actionResponseHandler
): Response {
$password = $request->request->get('password');
$passwordConfirmation = $request->request->get('password_confirmation');
if ($password !== $passwordConfirmation) {
return $actionResponseHandler->errorRedirect('password_recovery_recover', 'Passwords are not same', ['token' => $token->getToken()]);
}
$token->setIsUsed(true);
$authManager->changePassword($token->getUser(), $password);
return $this->redirectToRoute('user_login');
}
}