<?php
namespace App\Controller;
use App\DTO\ChangeEmailDTO;
use App\DTO\ChangePhoneDTO;
use App\Email\DefaultTemplatedEmail;
use App\Entity\ComplaintX;
use App\Entity\User;
use App\Form\ChangeEmailType;
use App\Form\ChangePhoneType;
use App\Form\DeleteAccountType;
use App\Form\SettingsAccountType;
use App\Service\TokenGenerator;
use App\Service\UserService;
use Doctrine\ORM\EntityManagerInterface;
use Sensio\Bundle\FrameworkExtraBundle\Configuration\IsGranted;
use Symfony\Bundle\FrameworkBundle\Controller\AbstractController;
use Symfony\Component\HttpFoundation\Request;
use Symfony\Component\HttpFoundation\Response;
use Symfony\Component\Mailer\Exception\TransportExceptionInterface;
use Symfony\Component\Mailer\MailerInterface;
use Symfony\Component\Mime\Address;
use Symfony\Component\Routing\Annotation\Route;
use Symfony\Component\Security\Core\Authentication\Token\Storage\TokenStorageInterface;
/**
* Require ROLE_INCOMPLETE_USER for *every* controller method in this class.
*
* @IsGranted("ROLE_INCOMPLETE_USER")
*/
class UserController extends AbstractController
{
/**
* @Route("/user/information", name="user_information")
*/
public function informationAction(Request $request)
{
$isFirstTime = true;
if (null !== $this->getUser()->getBirthDate()) {
$isFirstTime = false;
}
return $this->render('User/myInformation.html.twig', [
'isFirstTime' => $isFirstTime
]);
}
/**
* @Route("/user/phone", name="user_phone")
*/
public function phoneAction(Request $request)
{
return $this->render('User/phone.html.twig');
}
/**
* @Route("/user/phone-change", name="user_change_phone")
*/
public function changePhoneAction(Request $request)
{
$user = $this->getUser();
$changePhoneDTO = new ChangePhoneDTO($user);
$em = $this->getDoctrine()->getManager();
$contactInfosForm = $this->createForm(ChangePhoneType::class, $changePhoneDTO);
$contactInfosForm->handleRequest($request);
if ($contactInfosForm->isSubmitted() && $contactInfosForm->isValid()) {
if ($changePhoneDTO->getSMSCode() === $user->getPhoneNumberConfirmationCode()) {
$user->setPhoneNumber($changePhoneDTO->getPhone());
$em->flush();
$this->addFlash(
"success",
'Votre nouveau numéro ' . $changePhoneDTO->getPhone() . ' a bien été pris en compte'
);
return $this->redirectToRoute('user_settings_profile');
} else {
$this->addFlash("danger", 'Le code sms est erroné');
return $this->redirectToRoute('user_change_phone');
}
}
$user->setPhoneNumberConfirmationCode(rand(11111, 99999));
$em->flush();
return $this->render('User/changePhone.html.twig', [
'changePhoneForm' => $contactInfosForm->createView(),
]);
}
/**
* @Route("/user/confirmer-nouvel-email/{token}", name="confirm_email_change")
*/
public function confirmEmailChange($token)
{
// Find a user with this validationToken.
$user = $this->getDoctrine()->getRepository(User::class)->findOneByValidationToken($token);
// We found a matching user, then set the new email as primary email
if (null !== $user) {
$user
->setEmail($user->getPendingNewEmail())
->setPendingNewEmail(null)
->setValidationToken(null);
$em = $this->getDoctrine()->getManager();
$em->persist($user);
$em->flush();
}
else
{
$this->addFlash("danger", "Ce lien de validation d'email n'est pas valide.");
}
return $this->redirectToRoute("user_settings_profile");
}
/**
* @Route("/user/email", name="user_email")
*/
public function emailAction(Request $request)
{
return $this->render('User/email.html.twig');
}
/**
* @Route("/user/email-change", name="user_change_email")
*/
public function changeEmailAction(Request $request, TokenGenerator $tokenGenerator, MailerInterface $mailer)
{
$user = $this->getUser();
$changeEmailDTO = new ChangeEmailDTO($user);
$changeEmailForm = $this->createForm(ChangeEmailType::class, $changeEmailDTO);
$changeEmailForm->handleRequest($request);
$em = $this->getDoctrine()->getManager();
// On form submission
if ($changeEmailForm->isSubmitted() && $changeEmailForm->isValid()) {
$emailAlreadyUsed = $this->getDoctrine()->getRepository(User::class)->findOneByEmail($changeEmailDTO->getEmail());
if (null !== $emailAlreadyUsed) {
$this->addFlash("danger", 'L\'adresse email ' . $changeEmailDTO->getEmail() . ' est déjà utilisée.');
return $this->redirectToRoute('user_change_email');
}
// $user->setEmail($changeEmailDTO->getEmail());
$user
->setPendingNewEmail($changeEmailDTO->getEmail())
->setValidationToken($tokenGenerator->generate());
$em = $this->getDoctrine()->getManager();
$em->flush();
// Send a mail with a validation link generated w/ a token
$messageMail = (new DefaultTemplatedEmail())
->to($user->getPendingNewEmail())
->subject("Validation de votre nouvelle adresse Email")
->htmlTemplate('Mail/changeEmail.html.twig');
$mailer->send($messageMail);
$this->addFlash(
"success",
'Votre nouvelle adresse email ' . $changeEmailDTO->getEmail() . ' a bien été pris en compte, pensez à la valider en suivant le lien envoyé par mail'
);
return $this->render('User/email.html.twig');
}
$em->flush();
return $this->render('User/changeEmail.html.twig', [
'changeEmailForm' => $changeEmailForm->createView(),
]);
}
/**
* @Route("/user/delete/account/send", name="user_delete_account_send")
*/
public function deleteAccountSendAction(UserService $srvUser, TokenStorageInterface $tokenStorage, Request $request, MailerInterface $mailer)
{
/* @var $user User */
$user = $this->getUser();
//TODO Remove this part before setting live
//$srvUser->delete($user);
//$request->getSession()->invalidate();
//$tokenStorage->setToken(); // TokenStorageInterface
//return $this->redirectToRoute('homepage');
$em = $this->getDoctrine()->getManager();
$deleteCode = mt_rand(100000, 999999);
$user->setDeleteCode($deleteCode);
$em->flush();
$email = (new DefaultTemplatedEmail())
->to(new Address($user->getEmail()))
->subject('Demande de suppression de compte Riposte')
// path of the Twig template to render
->htmlTemplate('Mail/deleteAccount.html.twig')
// pass variables (name => value) to the template
->context(['deleteCode' => $deleteCode,]);
try {
$mailer->send($email);
$this->addFlash(
"success_delete",
'Votre demande de clôture de compte a bien été enregistrée, et un email vous a été adressé pour vous permettre de finaliser cette procédure.'
);
return $this->redirectToRoute('user_settings_account');
} catch (TransportExceptionInterface $e) {
$this->addFlash('warning', 'Une erreur est survenue lors de l\'envoi du message.');
return $this->redirectToRoute('user_settings_account');
}
}
/**
* @Route("/user/delete/account/confirmation", name="user_delete_account_confirm")
*/
public function deleteAccountConfirmationAction(UserService $srvUser, Request $request, TokenStorageInterface $tokenStorage = null)
{
/* @var $user User */
$user = $this->getUser();
$deleteCode = $user->getDeleteCode();
$deleteAccountForm = $this->createForm(DeleteAccountType::class);
$deleteAccountForm->handleRequest($request);
if ($deleteAccountForm->isSubmitted() && $deleteAccountForm->isValid()) {
$codeArray = str_split($deleteCode);
$codeFormArray = [
$deleteAccountForm->get('code1')->getData(),
$deleteAccountForm->get('code2')->getData(),
$deleteAccountForm->get('code3')->getData(),
$deleteAccountForm->get('code4')->getData(),
$deleteAccountForm->get('code5')->getData(),
$deleteAccountForm->get('code6')->getData()
];
if (($codeArray === $codeFormArray)) {
$srvUser->delete($user);
$request->getSession()->invalidate();
$tokenStorage->setToken();
return $this->redirect($this->getParameter('portal_url'));
} else {
$this->addFlash("warning", 'Code invalide');
return $this->redirectToRoute('user_delete_account_confirm');
}
}
return $this->render('User/deleteAccountConfirmation.html.twig', [
'deleteAccountForm' => $deleteAccountForm->createView(),
]);
}
/**
* @Route("/user/parametres", name="user_settings_account")
*/
public function settingsAction(Request $request, EntityManagerInterface $manager): Response
{
$user = $this->getUser();
$settingsAccountForm = $this->createForm(SettingsAccountType::class, $user);
$settingsAccountForm->handleRequest($request);
if ($settingsAccountForm->isSubmitted()) {
$manager->flush();
return $this->redirectToRoute('user_settings_account');
}
return $this->render('User/settings.html.twig', [
'settingsAccountForm' => $settingsAccountForm->createView(),
]);
}
#[Route('/user/parameters/profile', name: 'user_settings_profile')]
public function settingsProfileAction(Request $request): Response
{
return $this->render('User/settings_profile.html.twig');
}
#[Route('/user/parameters/legal-info', name: 'user_settings_legal_info')]
public function settingsLegalInfoAction(Request $request): Response
{
return $this->render('User/settings_legal_info.html.twig');
}
#[Route('/user', name: 'user_homepage')]
public function homepageAction(): Response
{
$complaintXRepository = $this->getDoctrine()->getRepository(ComplaintX::class);
$complaints = $complaintXRepository->findLast($this->getUser(), 10);
return $this->render('User/homepage.html.twig', ['complaints' => $complaints]);
}
}