<?php
namespace App\Controller\Publico;
use App\Repository\Ajustes\UsuarioRepository;
use App\Service\EmailService;
use Doctrine\ORM\EntityManagerInterface;
use Symfony\Bundle\FrameworkBundle\Controller\AbstractController;
use Symfony\Component\HttpFoundation\Request;
use Symfony\Component\HttpFoundation\Response;
use Symfony\Component\Mailer\Header\TagHeader;
use Symfony\Component\Routing\Annotation\Route;
use Symfony\Component\Routing\Generator\UrlGeneratorInterface;
use Symfony\Component\Security\Csrf\TokenGenerator\TokenGeneratorInterface;
use Symfony\Contracts\Translation\TranslatorInterface;
/**
* @Route("/recuperar-cuenta", name="recuperar_pass_", methods = {"GET", "POST"})
*/
class RecuperarCuentaController extends AbstractController
{
public const BASEDIR = '/pages/publico/recuperar';
protected $em;
protected $ur;
protected $tr;
protected $tokGen;
protected $router;
public function __construct(EntityManagerInterface $em, UsuarioRepository $ur, TranslatorInterface $ti, TokenGeneratorInterface $tkGen, UrlGeneratorInterface $ro)
{
$this->em = $em;
$this->ur = $ur;
$this->tr = $ti;
$this->tokGen = $tkGen;
$this->router = $ro;
}
/**
* @Route("/", name="index")
*/
public function recuperarContrasenya(Request $request, EmailService $servEmails): Response
{
if ($this->getUser()) {
return $this->redirectToRoute('index');
}
$email = $request->request->get('email', '');
if ('' != $email) {
$token = $this->isCsrfTokenValid('restore-password', $request->request->get('t', ''));
if (false == $token) {
$this->addFlash('danger', $this->tr->trans('cambio_pass.info', [], 'messages'));
return $this->redirectToRoute('recuperar_pass_index');
}
$user = $this->ur->findOneBy(['email' => $email]);
if (!$user) {
$this->addFlash('danger', $this->tr->trans('cambio_pass.error.notfound', [], 'messages'));
return $this->redirectToRoute('recuperar_pass_index');
}
if (!$user->getEnabled()) {
$this->addFlash('danger', $this->tr->trans('cambio_pass.error.disabled', [], 'messages'));
return $this->redirectToRoute('recuperar_pass_index');
}
$token = $user->getPasswordRecoverToken() ? $user->getPasswordRecoverToken() : $this->tokGen->generateToken();
$user
->setPasswordRecoverToken($token)
->setPasswordRecoverRequestedAt(new \Datetime())
->setPasswordRecoverResquestIp($request->getClientIp())
;
$this->em->flush();
$params = [
'to' => [$user->getEmail()],
'plantilla' => '/emails/email_recuperar_pass.html.twig',
'asunto' => $this->tr->trans('cambio_pass.mail.asunto'),
'plantilla_params' => [
'token' => $token,
'usuario' => $user,
'url' => $this->router->generate('mail_user_cambio_pass', ['t' => $token], UrlGeneratorInterface::ABSOLUTE_URL)
],
'header' => [
new TagHeader('password-reset'),
],
];
$result = $servEmails->envioBasico($params);
if ($result) {
// Envio de mail de recuperación al correo asociado a este usuario...
$this->addFlash('success', $this->tr->trans('cambio_pass.send.success', ['{correo}' => $user->getEmail()]));
return $this->redirectToRoute('app_login');
}
$this->addFlash('danger', $this->tr->trans('cambio_pass.send.abort'));
return $this->redirectToRoute('recuperar_pass_index');
}
return $this->render(self::BASEDIR.'/rec_pass_indice.html.twig');
}
/**
* @Route("-enviada", name="success")
*/
public function recuperarSucess(Request $request): Response
{
$this->bd->addRouteItem('Inicio', 'index');
$this->bd->addItem('Restablecer contraseña');
$this->seo->get('basic')->setTitle('Restablecer contraseña solicitado - Insertia.net');
return $this->render(self::BaseDir.'/sec_pass_solicitar_success.html.twig');
}
}