✨ feat(ReserverController): Implémente la fonctionnalité de réinitialisation de mot de passe.
This commit is contained in:
@@ -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')]
|
||||
|
||||
Reference in New Issue
Block a user