feat(ReserverController): Implémente la fonctionnalité de réinitialisation de mot de passe.

This commit is contained in:
Serreau Jovann
2026-01-23 09:20:53 +01:00
parent 3250f6da36
commit ab3fba7a9c
3 changed files with 177 additions and 4 deletions

View File

@@ -8,6 +8,7 @@ use App\Entity\Product;
use App\Form\RequestPasswordConfirmType;
use App\Form\RequestPasswordRequestType;
use App\Logger\AppLogger;
use App\Repository\CustomerRepository;
use App\Repository\ProductRepository;
use App\Service\Mailer\Mailer;
use App\Service\ResetPassword\Event\ResetPasswordConfirmEvent;
@@ -128,11 +129,80 @@ class ReserverController extends AbstractController
]);
}
#[Route('/reservation/creation-compte', name: 'reservation_password')]
public function revervationForgot(): Response
{
return $this->render('revervation/password.twig',[
#[Route('/reservation/mot-de-passe', name: 'reservation_password')]
public function forgotPassword(
Request $request,
CustomerRepository $repository,
EntityManagerInterface $em,
Mailer $mailer,
UserPasswordHasherInterface $hasher
): Response {
$session = $request->getSession();
$step = $request->query->get('step', 'request');
if ($request->isMethod('POST')) {
$payload = $request->getPayload();
// ÉTAPE 1 : Générer le code et l'envoyer
if ($payload->has('email_request')) {
$email = $payload->getString('email_request');
$customer = $repository->findOneBy(['email' => $email]);
if ($customer) {
$code = str_pad((string)random_int(0, 999999), 6, '0', STR_PAD_LEFT);
// On stocke en session : email + code
$session->set('reset_password', [
'email' => $email,
'code' => $code,
'expires' => time() + 900 // Valable 15 minutes
]);
$mailer->send($customer->getEmail(),
$customer->getName()." ".$customer->getSurname(),
"[Ludikevent] - Code de récupération",
"mails/code_password.twig",[
'code' => $code
]);
return $this->redirectToRoute('reservation_password', ['step' => 'verify']);
}
$this->addFlash('danger', 'Email inconnu.');
}
// ÉTAPE 2 : Vérifier le code en session
if ($payload->has('code_verify')) {
$data = $session->get('reset_password');
$inputCode = $payload->getString('code_verify');
if ($data && $data['code'] === $inputCode && time() < $data['expires']) {
return $this->redirectToRoute('reservation_password', ['step' => 'reset']);
}
$this->addFlash('danger', 'Code invalide ou expiré.');
}
// ÉTAPE 3 : Changer le mot de passe
if ($payload->has('new_password')) {
$data = $session->get('reset_password');
if ($data) {
$customer = $repository->findOneBy(['email' => $data['email']]);
if ($customer) {
$newEncoded = $hasher->hashPassword($customer, $payload->getString('new_password'));
$customer->setPassword($newEncoded);
$em->flush();
$session->remove('reset_password'); // On nettoie la session
$this->addFlash('success', 'Mot de passe mis à jour !');
return $this->redirectToRoute('reservation_login');
}
}
}
}
return $this->render('reservation/password.twig', [
'step' => $step,
'email' => $session->get('reset_password')['email'] ?? null
]);
}
#[Route('/reservation/contact', name: 'reservation_contact')]