<?php
namespace App\Controller;
use App\Entity\ResetPassword;
use App\Form\ResetPasswordType;
use App\Services\MailerServices;
use App\Repository\UserRepository;
use Doctrine\ORM\EntityManagerInterface;
use App\Repository\ResetPasswordRepository;
use Symfony\Component\HttpFoundation\Request;
use Symfony\Component\Mailer\MailerInterface;
use Symfony\Component\HttpFoundation\Response;
use Symfony\Component\Routing\Annotation\Route;
use Symfony\Contracts\Translation\TranslatorInterface;
use Symfony\Bundle\FrameworkBundle\Controller\AbstractController;
use Symfony\Component\Security\Core\Encoder\UserPasswordEncoderInterface;
class ResetPasswordController extends AbstractController
{
private $em;
private $mailerint;
private $tanslator;
public function __construct(EntityManagerInterface $em, MailerInterface $mailerint, TranslatorInterface $tanslator)
{
$this->em = $em;
$this->mailerint = $mailerint;
$this->tanslator = $tanslator;
}
/**
* @Route("/mot-de-passe-oublie", name="reset_password")
*/
public function index(Request $request, UserRepository $userRepo, EntityManagerInterface $em, MailerServices $ms): Response
{
if ($this->getUser()) {
return $this->redirectToRoute('account');
}
if ($request->get('_username')) {//mi-recuperer ny email avy @formulaire
$user = $userRepo->findOneByEmail($request->get('_username'));
//dd($user);
if ($user) {
//etape , Enregistrer dans bd la demnde reset_password avec user, token, createdAt
$reset_password = new ResetPassword();
$reset_password->setUser($user)
->setToken(uniqid())
->setCreatedAt(new \DateTime());
$em->persist($reset_password);
$em->flush();
//etape 2: envoyer email a l'user pour mettre a jour son mot de passe
$url = $this->generateUrl('update_password', [
'token' => $reset_password->getToken()
]);
$token = $reset_password->getToken();
$name_to = null;
$subject = 'PHARMADEXI-Reinitialiser votre Mot de passe';
$template = 'emails/reset_password.html.twig';
//dd($user->getRoles());
if ($user->getRoles()[0] != "ROLE_PRESCRIPTEUR") {
$name_to = $user->getDesignation();
} else {
$name_to = $user->getFullName();
}
$ms->resetPasswordMail($this->mailerint, 'pharmadexi@gmail.com', $user->getEmail(), $name_to, $subject, $template, $token);
$this->addFlash('success', $this->tanslator->trans('vous allez bientôt recevoir par email un lien pour la réinitialisation'));
}else{
$this->addFlash('danger', $this->tanslator->trans('Adresse e-mail inconnue'));
}
}
return $this->render('compte/reset_password.html.twig');
}
/**
* @Route("/modifier-mon-mot-de-passe/{token}", name="update_password")
*/
public function update($token, ResetPasswordRepository $resetRepo, Request $request, UserPasswordEncoderInterface $encoder, EntityManagerInterface $em): Response
{
$reset_password = $resetRepo->findOneByToken($token);
if (!$reset_password) {
die('ato');
return $this->redirectToRoute('reset_password');
}
//verifier si createdAt = now -3h
$now = new \DateTime();
if ($now > $reset_password->getCreatedAt()->modify('+ 3 hour')) {
$this->addFlash('notice', $this->tanslator->trans("Délai expiré, merci de renouveler votre demande"));
return $this->redirectToRoute('reset_password');
}
$form = $this->createForm(ResetPasswordType::class);
$form->handleRequest($request);
if ($form->isSubmitted() && $form->isValid()) {
//dd($form->getData());
$new_pwd = $form->get('new_password')->getData();
$user = $reset_password->getUser();
$password = $encoder->encodePassword($user, $new_pwd);
$user->setPassword($password);
$em->flush();
$this->addFlash('success', $this->tanslator->trans('Votre mot de passe a été mis à jour'));
return $this->redirectToRoute('login');
}
return $this->render('compte/update_password.html.twig',[
'form' => $form->createView()
]);
}
}