<?php
namespace App\Controller;
use App\Entity\PasswordRecovery;
use App\Form\UserRenewPasswordType;
use App\Form\UserResetType;
use App\Repository\PasswordRecoveryRepository;
use App\Repository\UserRepository;
use App\Service\CodeCreator;
use App\Service\Mailer\Mailer;
use Doctrine\ORM\EntityManagerInterface;
use Symfony\Bundle\FrameworkBundle\Controller\AbstractController;
use Symfony\Component\HttpFoundation\Request;
use Symfony\Component\HttpFoundation\Response;
use Symfony\Component\PasswordHasher\Hasher\UserPasswordHasherInterface;
use Symfony\Component\Routing\Annotation\Route;
class UserController extends AbstractController
{
#[Route('/reset-password', name: 'app_user_reset_password')]
public function index(
Request $request,
UserRepository $userRepository,
Mailer $mailer,
PasswordRecoveryRepository $passwordRecoveryRepository,
EntityManagerInterface $manager,
CodeCreator $codeCreator
): Response {
$form = $this->createForm(UserResetType::class, []);
$form->handleRequest($request);
if($form->isSubmitted() && $form->isValid()) {
$user = $userRepository->findOneBy(['email' => $form->get('email')->getData()]);
if($user) {
$recoveries = $user->getPasswordRecoveries();
foreach ($recoveries as $recovery) {
$manager->remove($recovery);
}
$newRecovery = new PasswordRecovery();
$code = ($codeCreator(6));
$newRecovery->setUser($user)->setCreatedAt(new \DateTimeImmutable('now'))->setCode($code);
$manager->persist($newRecovery);
$manager->flush();
$mailer->sendRenewPasswordEmail($user, $code);
return $this->redirectToRoute('app_user_renew_password', ['recoveryId' => $newRecovery->getId()]);
}
$this->addFlash('error', 'adresse email inconnue');
return $this->redirectToRoute('app_user_reset_password');
}
return $this->render('user/reset.html.twig', [
'form' => $form->createView()
]);
}
/**
* @throws \Exception
*/
#[Route('/renew-password/{recoveryId}', name: 'app_user_renew_password')]
public function renew(
int $recoveryId,
Request $request,
UserRepository $userRepository,
PasswordRecoveryRepository $passwordRecoveryRepository,
UserPasswordHasherInterface $hasher
): Response {
$recovery = $passwordRecoveryRepository->find($recoveryId);
if(!$recovery) {
return $this->redirectToRoute('planning');
}
if($recovery->isOutOfDate()) {
$this->addFlash('error', 'Le délai de validité de la page a expiré');
return $this->redirectToRoute('app_login');
}
$form = $this->createForm(UserRenewPasswordType::class, []);
$form->handleRequest($request);
if($form->isSubmitted() && $form->isValid()) {
if($recovery->isOutOfDate()) {
$this->addFlash('error', 'Le délai de validité de la page a expiré');
return $this->redirectToRoute('app_login');
}
if($form->get('pass')->getData() !== $form->get('password')->getData()) {
$this->addFlash('error', 'Les mots de passe ne sont pas identiques');
}
if($form->get('code')->getData() !== $recovery->getCode()) {
$this->addFlash('error', 'Le code est erronné');
}
$user = $recovery->getUser();
$password = $hasher->hashPassword($user, $form->get('pass')->getData());
$user->setPassword($password);
$userRepository->save($user, true);
$this->addFlash('success', 'Votre mot de passe a été modifié avec succès');
return $this->redirectToRoute('app_login');
}
return $this->render('user/renew.html.twig', [
'form' => $form->createView()
]);
}
}