<?php
namespace App\Controller;
use Symfony\Bundle\FrameworkBundle\Controller\AbstractController;
use Symfony\Component\Routing\RouterInterface;
use Symfony\Component\Routing\Annotation\Route;
use Symfony\Component\HttpKernel\Exception\NotFoundHttpException;
use Symfony\Component\HttpFoundation\Request;
use Symfony\Component\HttpFoundation\RedirectResponse;
use Symfony\Component\Security\Http\SecurityEvents;
use Symfony\Component\Security\Core\Encoder\UserPasswordEncoderInterface;
use Symfony\Component\Security\Core\Authentication\Token\Storage\TokenStorageInterface;
use Symfony\Component\Security\Core\Authentication\Token\UsernamePasswordToken;
use Symfony\Component\Security\Http\Event\InteractiveLoginEvent;
use Symfony\Component\EventDispatcher\EventDispatcherInterface;
use Doctrine\ORM\EntityManagerInterface;
use Symfony\Contracts\Translation\TranslatorInterface;
use Symfony\Component\Mailer\MailerInterface;
use Symfony\Component\Mime\Address;
use Symfony\Component\Mime\Email;
use League\HTMLToMarkdown\HtmlConverter;
use App\Form\compteType;
use App\Form\lostType;
use App\Form\ResetPasswordType;
use App\Services\iresaService;
use App\Services\SendinblueService;
use App\Entity\compte;
use App\Entity\Language;
use Symfony\Component\PasswordHasher\Hasher\UserPasswordHasherInterface;
use Symfony\Component\Routing\Generator\UrlGeneratorInterface;
/**
* @Route("/{_locale}", requirements={"_locale": "en|fr"})
*/
class RegisterController extends AbstractController
{
private $tokenStorage;
private $eventDispatcher;
private $router;
private $translator;
private $passwordEncoder;
private $mailer;
private $em;
private $iresaService;
private $sendinblueService;
public function __construct(RouterInterface $router, TokenStorageInterface $tokenStorage, EventDispatcherInterface $eventDispatcher, TranslatorInterface $translator, UserPasswordEncoderInterface $passwordEncoder, MailerInterface $mailer, EntityManagerInterface $em, iresaService $iresaService, SendinblueService $sendinblueService)
{
$this->tokenStorage = $tokenStorage;
$this->eventDispatcher = $eventDispatcher;
$this->router = $router;
$this->translator = $translator;
$this->passwordEncoder = $passwordEncoder;
$this->mailer = $mailer;
$this->em = $em;
$this->iresaService = $iresaService;
$this->sendinblueService = $sendinblueService;
}
/**
*
* @Route("/compte", name="compte")
*/
public function accountAction(Request $request)
{
$session = $request->getSession();
$locale = $request->getLocale();
$lang = $this->em->getRepository(Language::class)->findOneByCode($locale);
$compte = new compte();
$compte->setLang($lang);
$form = $this->createForm(compteType::class, $compte);
$resetPasswordFrom = $this->createForm(lostType::class);
$form->handleRequest($request);
if ($form->isSubmitted() && $form->isValid()) {
$compte->setRoles(['ROLE_CUSTOMER']);
$password = $this->passwordEncoder->encodePassword($compte, $compte->getPassword());
$compte->setPassword($password);
$this->em->persist($compte);
$createUserIresa = $this->iresaService->iresaXFT("Create", "Customer", $compte);
if($createUserIresa != null) {
$key = intval($createUserIresa->Customer->Codes->Code[0]["Value"]);
$compte->setKeyiresa($key);
}
$this->em->persist($compte);
$this->em->flush();
$session->getFlashBag()->add('success', ['type' => 'success', 'title' => "", 'message' => $this->translator->trans('compte.register.inscription.success', array(), 'app')]);
//return $this->redirectToRoute('compte');
$token = new UsernamePasswordToken($compte, $compte->getPassword(), 'main_front', $compte->getRoles());
$this->tokenStorage->setToken($token);
$event = new InteractiveLoginEvent($request, $token);
$this->eventDispatcher->dispatch($event, SecurityEvents::INTERACTIVE_LOGIN);
if($session->has('ReservationId') ) {
$path = $session->get('loginRedirectPath');
$session->remove('ReservationId');
$session->remove('loginRedirectPath');
$response = new RedirectResponse($this->router->generate($path));
return $response;
}
}
$route = $request->query->get('route_name');
$params = $request->query->get('params');
return $this->render('/front/Compte/register.html.twig',[
'form' => $form->createView(),
'lostform' => $resetPasswordFrom->createView(),
"route_name" => $route,
"params" => $params
]);
}
/**
*
* @Route("/compte/reset_password", name="form_reset_password")
*/
public function resetPasswordAction(Request $request)
{
$session = $request->getSession();
$form = $this->createForm(lostType::class);
$form->handleRequest($request);
if ($form->isSubmitted() && $form->isValid()) {
$email = $form->getData()['email'];
$user = $this->em->getRepository(compte::class)->findOneBy(['email' => $email]);
if ($user) {
$token = md5(time() . rand());
$user->setResetPasswordToken($token);
$this->em->persist($user);
$this->em->flush();
$url = $this->router->generate(
'reinitialiserMotDePasse',
[
'token' => $token
],
UrlGeneratorInterface::ABSOLUTE_URL
);
$params = [
'name' => $user->getprenom(),
'email' => $user->getEmail(),
'token' => $token,
'url' => $url,
'subject' => $this->translator->trans('compte.register.inscription.reinitialisation.email.sujet', array(), 'app'),
'view' => 'reset_password'
];
// template #933 Brevo - réinitialisation du mot de passe
$this->sendMail($params, 933);
$title="";
$message = $this->translator->trans('compte.register.inscription.reinitialisation.flash', array(), 'app');
$session->getFlashBag()->add('success', ['type' => 'success', 'title' => $title, 'message' => $message]);
return $this->redirectToRoute('compte');
}
$message = $this->translator->trans('compte.register.inscription.erreur.utilisateur_inconnu', array(), 'app');
$session->getFlashBag()->add('error', ['type' => 'success', 'title' => "", 'message' => $message]);
}
return $this->render('security/request_password.html.twig', [
'form' => $form->createView()
]);
}
/**
* @Route("/reset/{token}", name="reinitialiserMotDePasse")
*
*/
public function confirmPasswordAction(Request $request, UserPasswordHasherInterface $userPasswordHasher, $token = null)
{
$session = $request->getSession();
if ($token) {
// We store the token in session and remove it from the URL, to avoid the URL being
// loaded in a browser and potentially leaking the token to 3rd party JavaScript.
$session->set('ResetPasswordToken', $token);
return $this->redirectToRoute('reinitialiserMotDePasse');
}
$token = $request->getSession()->get('ResetPasswordToken');
if (null === $token) {
throw $this->createNotFoundException('No reset password token found in the URL or in the session.');
}
$user = $this->em->getRepository(compte::class)->findOneBy(['resetPasswordToken' => $token]);
if(!$user) {
$title="";
$message="Utilisateur non trouvé ou requête expirée";
$session->getFlashBag()->add('error', ['type' => 'error', 'title' => $title, 'message' => $message]);
return $this->redirectToRoute('mon_compte');
}
$form = $this->createForm(ResetPasswordType::class, ['token' => $token]);
$form->handleRequest($request);
if ($form->isSubmitted() && $form->isValid()) {
$session->remove('ResetPasswordToken');
/*
// TODO: Nouvelle méthode de hash à mettre en palce
$encodedPassword = $userPasswordHasher->hashPassword(
$user,
$form->get('plainPassword')->getData()
);
*/
$encodedPassword = $this->passwordEncoder->encodePassword($user, $form->get('plainPassword')->getData());
$user->setPassword($encodedPassword);
$user->setResetPasswordToken(null);
$this->em->persist($user);
$this->em->flush();
$title="";
$message="Password changed!";
$session->getFlashBag()->add('success', ['type' => 'success', 'title' => $title, 'message' => $message]);
$url = $this->router->generate('compte', [], UrlGeneratorInterface::ABSOLUTE_URL);
$params = [
'name' => $user->getprenom(),
'email' => $user->getEmail(),
'token' => $token,
'url' => $url,
'subject' => 'Mot de passe réinitialisé avec succès',
'view' => 'reset_password_confirmation'
];
$this->sendMail($params, 934);
return $this->redirectToRoute('mon_compte');
}
$array = [
'form' => $form->createView(),
'token' => $token
];
return $this->render('security/confirm_password.html.twig', $array);
}
private function sendMail($params, $templateId = null)
{
if($templateId == null) {
$content = $this->renderView('/front/Compte/' . $params['view'] . '.html.twig', $params);
// Convertir le contenu HTML en texte brut
$converter = new HtmlConverter();
$texte = $converter->convert($content);
$message = (new Email())
->from(new Address('noreply@ateya.fr', "Ateya-vacances"))
->to(new Address($params['email'], $params['name']))
->subject($params['subject'])
->text($texte)
->html((string)$content)
;
try {
$this->mailer->send($message);
} catch (TransportExceptionInterface $e) {
throw new NotificationErrorSendingException(sprintf('error sending for %s', $notification->getRecipient()->getEmail()));
}
} else {
$vars = [
"EMAIL" => $params['email'],
"TOKEN" => $params['token'],
"URL" => $params['url']
];
$this->sendinblueService->setTemplateId($templateId);
$this->sendinblueService->setRecipient($params['email'], $params['name']);
$this->sendinblueService->setParams($vars);
try {
$ret = $this->sendinblueService->sendEmail();
} catch (Exception $e) {
echo $e->getMessage();
}
}
return "EMAIL";
}
}