<?php
namespace App\Controller;
use App\Builder\MailerBuilder;
use App\Entity\User;
use App\Form\User\ForgotPasswordType;
use App\Form\User\ResetPasswordType;
use App\Form\User\UpdatePasswordType;
use Doctrine\ORM\EntityManagerInterface;
use Symfony\Bundle\FrameworkBundle\Controller\AbstractController;
use Symfony\Component\HttpFoundation\JsonResponse;
use Symfony\Component\HttpFoundation\Request;
use Symfony\Component\HttpFoundation\Response;
use Symfony\Component\Routing\Annotation\Route;
use Symfony\Component\PasswordHasher\Hasher\UserPasswordHasherInterface;
use Symfony\Contracts\Translation\TranslatorInterface;
class UserController extends AbstractController
{
private EntityManagerInterface $entityManager;
private TranslatorInterface $translator;
private UserPasswordHasherInterface $passwordEncoder;
private MailerBuilder $mailerBuilder;
public function __construct(TranslatorInterface $translator, EntityManagerInterface $entityManager, UserPasswordHasherInterface $passwordEncoder, MailerBuilder $mailerBuilder)
{
$this->entityManager = $entityManager;
$this->translator = $translator;
$this->passwordEncoder = $passwordEncoder;
$this->mailerBuilder = $mailerBuilder;
}
/**
* @Route("/user/password", name="updatePassword")
*/
public function updatePassword(Request $request): Response
{
if (!$this->getUser()->getIsNew()) {
return $this->redirectToRoute('home');
}
$userForm = new User();
$user = $this->getUser();
$userForm->setEmail($user->getEmail());
$formUser = $this->createForm(UpdatePasswordType::class, $userForm)->handleRequest($request);
if ($formUser->isSubmitted() && $formUser->isValid()) {
$password = $userForm->getPassword();
$user->setLastname($userForm->getLastname());
$user->setFirstname($userForm->getFirstname());
if (preg_match("#^(?=.*[A-Z])(?=.*[a-z])(?=.*\d)(?=.*[-+!*$@%_])([-+!*$@%_\w]{8,15})$#", $password)) {
$user->setPassword($this->passwordEncoder->hashPassword($user, $password));
$user->setIsNew(false);
$this->entityManager->flush();
return $this->redirectToRoute('home');
} else {
$this->addFlash('error', $this->translator->trans("user.updatePassword.mdp"));
}
}
return $this->render('user/updatePassword.html.twig', [
'formUser' => $formUser->createView(),
]);
}
/**
* @Route("/user/forgotPassword", name="forgotPassword")
*/
public function forgotPassword(Request $request): Response
{
if ($this->getUser()) {
return $this->redirectToRoute('home');
}
$hashRequest = $request->query->get('hash');
if ($hashRequest) {
$user = $this->entityManager->getRepository(User::class)->findOneBy(['passwordRequest' => $hashRequest]);
if ($user) {
$formForgotPassword = $this->createForm(ResetPasswordType::class)->handleRequest($request);
if ($formForgotPassword->isSubmitted() && $formForgotPassword->isValid()) {
$password = $formForgotPassword->getData()['password'];
if (preg_match("#^(?=.*[A-Z])(?=.*[a-z])(?=.*\d)(?=.*[-+!*$@%_])([-+!*$@%_\w]{8,15})$#", $password)) {
$user->setPassword($this->passwordEncoder->hashPassword($user, $password));
$user->setPasswordRequest(null);
$this->entityManager->flush();
$this->addFlash('success', "Votre mot passe vient d'être modifié !");
return $this->redirectToRoute('login');
} else {
$this->addFlash('error', "Le mot de passe doit au moins contenir de 8 à 15 caractères, une lettre majuscule et minuscule, au moins un chiffre et au moins un de ces caractères spéciaux: $ @ % * + - _ !");
return $this->redirectToRoute('forgotPassword', ['hash' => $hashRequest]);
}
}
} else {
return $this->redirectToRoute('login');
}
} else {
$formForgotPassword = $this->createForm(ForgotPasswordType::class)->handleRequest($request);
if ($formForgotPassword->isSubmitted() && $formForgotPassword->isValid()) {
$email = $formForgotPassword->getData()['email'];
$user = $this->entityManager->getRepository(User::class)->findOneBy(['email' => $email]);
if ($user) {
$hash = hash('SHA256', $user->getEmail() . rand(0, 5000));
$user->setPasswordRequest($hash);
$this->entityManager->flush();
$this->mailerBuilder->mailForgotPassword($user, $hash);
$this->addFlash('success', "Un e-mail contenant un lien de changement de mot de passe vient d'être envoyé !");
} else {
$this->addFlash('error', "Aucun utilisateur ne correspond à cette adresse e-mail.");
}
return $this->redirectToRoute('forgotPassword');
}
}
return $this->render('user/forgotPassword.html.twig', [
'formForgotPassword' => $formForgotPassword->createView(),
]);
}
/**
* @Route("/adminApi/connect", name="connectApi")
*/
public function connectApi(): JsonResponse
{
return $this->json(['code' => 200, "ok"], 200);
}
/**
* AJAX
* @Route("/user/request", name="requestUser")
*/
public function requestUser(Request $request): JsonResponse
{
$informations = [];
$informations['lastname'] = $request->query->get('lastname');
$informations['firstname'] = $request->query->get('firstname');
$informations['company'] = $request->query->get('company');
$informations['vat'] = $request->query->get('vat');
$informations['email'] = $request->query->get('email');
$informations['phone'] = $request->query->get('phone');
return $this->json($this->mailerBuilder->mailRequestUser($informations));;
}
}