<?php
namespace App\Http\Auth\Controller;
use App\Core\Notification\Message\User\ForgotPasswordMessage;
use App\Domain\User\Entity\User;
use App\Domain\User\Repository\UserRepository;
use App\Http\Auth\Form\Auth\ForgotPasswordType;
use DateInterval;
use DateTime;
use Doctrine\ORM\EntityManagerInterface;
use Symfony\Bundle\FrameworkBundle\Controller\AbstractController;
use Symfony\Component\HttpFoundation\Request;
use Symfony\Component\HttpFoundation\Response;
use Symfony\Component\Messenger\MessageBusInterface;
use Symfony\Component\Routing\Annotation\Route;
use Symfony\Component\Routing\Generator\UrlGeneratorInterface;
#[Route(path: [
'en' => '/authentication/forgot-password',
'fr' => '/authentification/mot-de-passe-oublie',
], name: 'forgot_password')]
class ForgotPasswordController extends AbstractController
{
public function __invoke(Request $request,
UserRepository $userRepository,
MessageBusInterface $bus,
EntityManagerInterface $entityManager): Response
{
$form = $this->createForm(ForgotPasswordType::class);
$form->handleRequest($request);
if ($form->isSubmitted() && $form->isValid()) {
/** @var ?User $user */
$user = $userRepository->findOneBy(['email' => $form->get('email')->getData()]);
if (!is_null($user)) {
$user->setConfirmationToken(uniqid())
->setConfirmationTokenExpiredAt((new DateTime())->add(new DateInterval('PT3H')));
$bus->dispatch(new ForgotPasswordMessage($user, $this->generateUrl('auth_create_password', [
'confirmationToken' => $user->getConfirmationToken(),
], UrlGeneratorInterface::ABSOLUTE_URL)));
$entityManager->flush();
}
$this->addFlash('success', 'Si votre compte existe, un email a été envoyé');
return $this->redirectToRoute('auth_login');
}
return $this->render('areas/auth/forgot-password.html.twig', [
'form' => $form->createView(),
]);
}
}