src/Controller/Front/UserController.php line 692

Open in your IDE?
  1. <?php
  2. namespace App\Controller\Front;
  3. use App\Entity\Document;
  4. use App\Entity\User;
  5. use App\Mail\Mail;
  6. use App\Repository\AddressRepository;
  7. use App\Repository\DocumentRepository;
  8. use App\Repository\UserRepository;
  9. use App\Service\ActivityService;
  10. use App\Service\GlobalVariables;
  11. use App\Service\RightService;
  12. use Doctrine\DBAL\Exception;
  13. use Doctrine\ORM\EntityManagerInterface;
  14. use Symfony\Bundle\FrameworkBundle\Controller\AbstractController;
  15. use Symfony\Component\HttpFoundation\JsonResponse;
  16. use Symfony\Component\HttpFoundation\Request;
  17. use Symfony\Component\HttpFoundation\Response;
  18. use Symfony\Component\Messenger\MessageBusInterface;
  19. use Symfony\Component\Messenger\Stamp\DelayStamp;
  20. use Symfony\Component\Security\Core\Encoder\UserPasswordEncoderInterface;
  21. use Symfony\Component\Routing\Annotation\Route;
  22. /**
  23.  * @Route("/client")
  24.  */
  25. class UserController extends AbstractController
  26. {
  27.     // Keys for encryption
  28.     private const ENCRYPTION_KEY 'nb689fgnf23vic54dfmg21n872121fdf3hpbd212gbn36ed87yxwa89jmspcyf87';
  29.     private const SALT_KEY 'sunshine-elegance';
  30.     private $addressRepository;
  31.     private $userRepository;
  32.     private $documentRepository;
  33.     private $rightService;
  34.     private $activityService;
  35.     private $globalVariables;
  36.     /** @var EntityManagerInterface */
  37.     private $em;
  38.     public function __construct(
  39.         AddressRepository      $addressRepository,
  40.         UserRepository         $userRepository,
  41.         DocumentRepository     $documentRepository,
  42.         RightService           $rightService,
  43.         ActivityService        $activityService,
  44.         EntityManagerInterface $manager,
  45.         GlobalVariables        $globalVariables
  46.     )
  47.     {
  48.         $this->addressRepository $addressRepository;
  49.         $this->userRepository $userRepository;
  50.         $this->documentRepository $documentRepository;
  51.         $this->rightService $rightService;
  52.         $this->activityService $activityService;
  53.         $this->em $manager;
  54.         $this->globalVariables $globalVariables;
  55.     }
  56.     /**
  57.      * @Route("/login", name="user_login", methods={"GET"})
  58.      */
  59.     public function login(Request $request): Response
  60.     {
  61.         $message $request->query->get('message');
  62.         if ($this->getUser()) {
  63.             return $this->redirectToRoute('user_account');
  64.         } else {
  65.             return $this->render('front/user/login.html.twig'compact('message'));
  66.         }
  67.     }
  68.     /**
  69.      * @Route("/account", name="user_account", methods={"GET"}, options={"expose"=true})
  70.      */
  71.     public function account(): Response
  72.     {
  73.         return ($this->getUser())? $this->render('front/user/account.html.twig'):$this->redirectToRoute('user_login');
  74.     }
  75.     /**
  76.      * @Route("/api/get_documents", name="api_get_documents", options={"expose"=true}, methods={"GET"})
  77.      */
  78.     public function getDocumentsAPI(Request $request): Response
  79.     {
  80.         // Vérifier si utilisateur connecté
  81.         if (!$this->globalVariables->timeout()) {
  82.             $response = [
  83.                 'res' => 'ERROR_CNX',
  84.                 'message' => 'Session has ended.',
  85.             ];
  86.             return new jsonResponse($response);
  87.         };
  88.         $page $request->query->get('page');
  89.         $orderBy $request->query->get('orderBy');
  90.         // get the product repository
  91.         $documents $this->em->getRepository(Document::class);
  92.         // build the query for the doctrine paginator
  93.         $query $documents->createQueryBuilder('d')
  94.             ->where('d.client = :user')
  95.             ->setParameter('user'$this->getUser());
  96.         /*->setParameter('minPrice', $minPrice);*/
  97.         // Order by
  98.         switch ($orderBy) {
  99.             case 1:
  100.                 $query->orderBy('d.createdAt''ASC');
  101.                 break;
  102.             case 2:
  103.                 $query->orderBy('d.createdAt''DESC');
  104.                 break;
  105.             case 3:
  106.                 $query->orderBy('d.id''ASC');
  107.                 break;
  108.             case 4:
  109.                 $query->orderBy('d.id''DESC');
  110.                 break;
  111.             case 5:
  112.                 $query->orderBy('d.totalAmountTtc''ASC');
  113.                 break;
  114.             case 6:
  115.                 $query->orderBy('d.totalAmountTtc''DESC');
  116.                 break;
  117.         }
  118.         $query->getQuery();
  119.         // set page size
  120.         $pageSize $request->query->get('pageSize');
  121.         // load doctrine Paginator
  122.         $paginator = new \Doctrine\ORM\Tools\Pagination\Paginator($query);
  123.         // you can get total items
  124.         $totalItems count($paginator);
  125.         // get total pages
  126.         $pagesCount ceil($totalItems $pageSize);
  127.         // now get one page's items:
  128.         $paginator
  129.             ->getQuery()
  130.             ->setFirstResult($pageSize * ($page 1)) // set the offset
  131.             ->setMaxResults($pageSize); // set the limit
  132.         $data = array();
  133.         foreach ($paginator as $pageItem) {
  134.             // do stuff with results...
  135.             array_push($data$pageItem);
  136.         }
  137.         // Les nombres de pages
  138.         $pages = array();
  139.         for ($i max($page 31); $i <= min($page 3$pagesCount); $i++) {
  140.             array_push($pages$i);
  141.         }
  142.         $response = [
  143.             'res' => 'OK',
  144.             'data' => $data,
  145.             'pagesCount' => $pagesCount,
  146.             'total' => $totalItems,
  147.             'pages' => $pages,
  148.             'message' => 'Commandes récupérés avec succès.',
  149.         ];
  150.         return new jsonResponse($response);
  151.     }
  152.     /**
  153.      * @Route("/api/get_document_status", name="api_get_document_status", options={"expose"=true}, methods={"GET"})
  154.      */
  155.     public function getStatusAPI(Request $request): Response
  156.     {
  157.         // Vérifier si utilisateur connecté
  158.         if (!$this->globalVariables->timeout()) {
  159.             $response = [
  160.                 'res' => 'ERROR_CNX',
  161.                 'message' => 'Session has ended.',
  162.             ];
  163.             return new jsonResponse($response);
  164.         };
  165.         $id $request->query->get('id');
  166.         // get the product repository
  167.         $document $this->em->getRepository(Document::class)->find($id);
  168.         if (!$document) {
  169.             $response = [
  170.                 'res' => 'ERROR',
  171.                 'message' => 'Aucune commande trouvée.',
  172.             ];
  173.         } else {
  174.             $response = [
  175.                 'res' => 'OK',
  176.                 'data' => $document->getConditionDocument(),
  177.                 'message' => 'Commandes récupérés avec succès.',
  178.             ];
  179.         }
  180.         return new jsonResponse($response);
  181.     }
  182.     /**
  183.      * @Route("/api/get_user_adress", name="api_get_user_adress", options={"expose"=true}, methods={"GET"})
  184.      */
  185.     public function getUserAdressAPI(Request $request): Response
  186.     {
  187.         // Vérifier si utilisateur connecté
  188.         if (!$this->globalVariables->timeout()) {
  189.             $response = [
  190.                 'res' => 'ERROR_CNX',
  191.                 'message' => 'Session has ended.',
  192.             ];
  193.         } else {
  194.             $response = [
  195.                 'res' => 'OK',
  196.                 'data' => [$this->getUser()->getAdress(), $this->getUser()->getSecondAdress()],
  197.                 'message' => 'Adresses récupérés avec succès.',
  198.             ];
  199.         }
  200.         return new jsonResponse($response);
  201.     }
  202.     /**
  203.      * @Route("/api/save_user_adress", name="api_save_user_adress", options={"expose"=true}, methods={"POST"})
  204.      */
  205.     public function saveUserAdressAPI(Request $request): Response
  206.     {
  207.         // Vérifier si utilisateur connecté
  208.         if (!$this->globalVariables->timeout()) {
  209.             $response = [
  210.                 'res' => 'ERROR_CNX',
  211.                 'message' => 'Session has ended.',
  212.             ];
  213.         } else {
  214.             $adresses json_decode($request->request->get('adresses'), true);
  215.             $type json_decode($request->request->get('type'), true);
  216.             // Vérifier si l'adresse est vide
  217.             if ($adresses[$type] == '') {
  218.                 $response = [
  219.                     'res' => 'ERROR',
  220.                     'message' => "L'adresse " . ($type 1) . " ne doît pas être vide.",
  221.                 ];
  222.             } else {
  223.                 $user $this->getUser();
  224.                 switch ($type) {
  225.                     case 0:
  226.                         $user->setAdress($adresses[$type]);
  227.                         break;
  228.                     case 1:
  229.                         $user->setSecondAdress($adresses[$type]);
  230.                         break;
  231.                 }
  232.                 $this->em->persist($user);
  233.                 $this->em->flush();
  234.                 $response = [
  235.                     'res' => 'OK',
  236.                     'data' => [$this->getUser()->getAdress(), $this->getUser()->getSecondAdress()],
  237.                     'message' => 'Adresse modifiée avec succès.',
  238.                 ];
  239.             }
  240.         }
  241.         return new jsonResponse($response);
  242.     }
  243.     /**
  244.      * @Route("/api/get_user_details", name="api_get_user_details", options={"expose"=true}, methods={"GET"})
  245.      */
  246.     public function getUserDetailsAPI(Request $request): Response
  247.     {
  248.         // Vérifier si utilisateur connecté
  249.         if (!$this->globalVariables->timeout()) {
  250.             $response = [
  251.                 'res' => 'ERROR_CNX',
  252.                 'message' => 'Session has ended.',
  253.             ];
  254.         } else {
  255.             $response = [
  256.                 'res' => 'OK',
  257.                 'data' => $this->getUser(),
  258.                 'message' => 'Détails récupérés avec succès.',
  259.             ];
  260.         };
  261.         return new jsonResponse($response);
  262.     }
  263.     /**
  264.      * @Route("/api/save_user_details", name="api_save_user_details", options={"expose"=true}, methods={"POST"})
  265.      */
  266.     public function saveUserDetailsAPI(Request $requestUserPasswordEncoderInterface $passwordEncoder): Response
  267.     {
  268.         if (!$this->globalVariables->timeout()) {
  269.             $response = [
  270.                 'res' => 'ERROR_CNX',
  271.                 'message' => 'Session has ended.',
  272.             ];
  273.         } else {
  274.             $user json_decode($request->request->get('user'), true);
  275.             $userByMail $this->em->getRepository(User::class)->findOneBy(array('email' => $user['email']));
  276.             // Vérifier si l'adresse est vide
  277.             if ($user['lastName'] == '') {
  278.                 $response = [
  279.                     'res' => 'ERROR',
  280.                     'message' => "Le nom est obligatoire",
  281.                 ];
  282.             } elseif ($user['firstName'] == '') {
  283.                 $response = [
  284.                     'res' => 'ERROR',
  285.                     'message' => "Le prénom est obligatoire",
  286.                 ];
  287.             } elseif ($user['email'] == '') {
  288.                 $response = [
  289.                     'res' => 'ERROR',
  290.                     'message' => "L'adresse mail est obligatoire",
  291.                 ];
  292.             } elseif (!filter_var($user['email'], FILTER_VALIDATE_EMAIL)) {
  293.                 $response = [
  294.                     'res' => 'ERROR',
  295.                     'message' => "L'adresse mail n'est pas valide",
  296.                 ];
  297.             } elseif ($userByMail && $userByMail->getId() <> $this->getUser()->getId()) {
  298.                 $response = [
  299.                     'res' => 'ERROR',
  300.                     'message' => "E-mail déja utilisé.",
  301.                 ];
  302.             } elseif (strlen($user['password']) < && strlen($user['password']) > 0) {
  303.                 $response = [
  304.                     'res' => 'ERROR',
  305.                     'message' => "La longueur de mot de passe doît être supérieur à 5",
  306.                 ];
  307.             } elseif (!$passwordEncoder->isPasswordValid($this->getUser(), $user['password']) && strlen($user['password']) > 0) {
  308.                 $response = [
  309.                     'res' => 'ERROR',
  310.                     'message' => "Le mot de passe ne correspond pas",
  311.                 ];
  312.             } elseif (strlen($user['newPassword']) == && strlen($user['password']) > 0) {
  313.                 $response = [
  314.                     'res' => 'ERROR',
  315.                     'message' => "Saisir le nouveau mot de passe",
  316.                 ];
  317.             } elseif (strlen($user['confirmPassword']) == && strlen($user['password']) > 0) {
  318.                 $response = [
  319.                     'res' => 'ERROR',
  320.                     'message' => "Saisir la confirmaion de mot de passe",
  321.                 ];
  322.             } elseif (strlen($user['newPassword']) < && strlen($user['newPassword']) > && strlen($user['password']) > 0) {
  323.                 $response = [
  324.                     'res' => 'ERROR',
  325.                     'message' => "La longueur de nouveau mot de passe doît être supérieur à 5",
  326.                 ];
  327.             } elseif (strlen($user['confirmPassword']) < && strlen($user['confirmPassword']) > && strlen($user['password']) > 0) {
  328.                 $response = [
  329.                     'res' => 'ERROR',
  330.                     'message' => "La longueur de confirmation mot de passe doît être supérieur à 5",
  331.                 ];
  332.             } elseif ($user['newPassword'] != $user['confirmPassword'] && strlen($user['password']) > 0) {
  333.                 $response = [
  334.                     'res' => 'ERROR',
  335.                     'message' => "La confirmation de nouveau mot de passe ne correspond pas",
  336.                 ];
  337.             } else {
  338.                 $this->getUser()->setFirstName($user['firstName']);
  339.                 $this->getUser()->setLastName($user['lastName']);
  340.                 $this->getUser()->setEmail($user['email']);
  341.                 if (strlen($user['newPassword']) > && $passwordEncoder->isPasswordValid($this->getUser(), $user['password']) && strlen($user['password']) > 0) {
  342.                     $this->getUser()->setPassword(
  343.                         $passwordEncoder->encodePassword(
  344.                             $this->getUser(),
  345.                             $user['newPassword']
  346.                         )
  347.                     );
  348.                 };
  349.                 $this->em->persist($this->getUser());
  350.                 $this->em->flush();
  351.                 $response = [
  352.                     'res' => 'OK',
  353.                     'data' => $this->getUser(),
  354.                     'message' => 'Enregsitrement effectué avec succès.',
  355.                 ];
  356.             }
  357.         }
  358.         return new jsonResponse($response);
  359.     }
  360.     /**
  361.      * @Route("/document/{id}", name="document_details", methods={"GET"}, options={"expose"=true})
  362.      */
  363.     public function document(Request $request$id): Response
  364.     {
  365.         $max = isset($_ENV['FREE_DELIVERY_AMOUNT']) ? floatval($_ENV['FREE_DELIVERY_AMOUNT']) : 0// Maximum pour avoir une livraison gratuite
  366.         if ($this->getUser()) {
  367.             $document $this->em->getRepository(Document::class)->find($id);
  368.             // Vérifier l'existance de la commande
  369.             if (!$document) {
  370.                 return $this->redirectToRoute('user_account');
  371.             }
  372.             return $this->render('front/user/order.html.twig'compact('document''max'));
  373.         } else {
  374.             return $this->redirectToRoute('user_login');
  375.         }
  376.     }
  377.     // Functions to encrypt and decrypt a string
  378.     public function encrypt($string$salt null): ?string
  379.     {
  380.         // Concaténer la chaine avec la date en cours
  381.         $string $string '|' . (new \DateTime('now'))->format('Y-m-d H:i:s');
  382.         if ($salt === null) {
  383.             $salt hash('sha256'uniqid(mt_rand(), true));
  384.         }  // this is an unique salt per entry and directly stored within a password
  385.         return base64_encode(openssl_encrypt($string'AES-256-CBC'self::ENCRYPTION_KEY0str_pad(substr(self::SALT_KEY016), 16'0'STR_PAD_LEFT)))/*.':'.self::SALT_KEY*/ ;
  386.     }
  387.     public function decrypt($string): ?string
  388.     {
  389.         //if( count(explode(':', $string)) !== 2 ) { return $string; }
  390.         //$salt = explode(":",$string)[1];
  391.         //$string = explode(":",$string)[0]; // read salt from entry
  392.         return openssl_decrypt(base64_decode($string), 'AES-256-CBC'self::ENCRYPTION_KEY0str_pad(substr(self::SALT_KEY016), 16'0'STR_PAD_LEFT));
  393.     }
  394.     /**
  395.      * @Route("/account-activation/{key}", name="account_activation", methods={"GET"}, options={"expose"=true})
  396.      */
  397.     public function activateAccount(Request $request$key): Response
  398.     {
  399.         $string $this->decrypt($key);
  400.         $parts explode('|'$string);
  401.         // Récupérer le nom utilisateur
  402.         $username $parts[0];
  403.         // Récupérer la date d'inscription
  404.         $dateSignUp $parts[1];
  405.         $date strtotime('now');
  406.         $dateSignUp strtotime($dateSignUp);
  407.         // Vérifier si le lien a expiré (envoyé depuis plus de 30 minutes)
  408.         if (round(abs($date $dateSignUp) / 602) > 30) {
  409.             return $this->render('front/user/login.html.twig', array(
  410.                 'message' => 'Votre lien a expiré. Merci de réassayer.',
  411.             ));
  412.         }
  413.         // Activation du compte et redirection vers la page login
  414.         $user $this->em->getRepository(User::class)->findOneBy(array('usermane' => $username));
  415.         // Vérification existance utiliateur
  416.         if (!$user) {
  417.             return $this->render('front/user/login.html.twig', array(
  418.                 'message' => "Votre nom d'utilisateur n'existe pas.",
  419.             ));
  420.         }
  421.         // Vérification existance utiliateur
  422.         if ($user->isVerified()) {
  423.             return $this->render('front/user/login.html.twig', array(
  424.                 'message' => "Votre compte est déjà vérifié. Merci de connecter.",
  425.             ));
  426.         }
  427.         // Activation
  428.         $user->setIsVerified(true);
  429.         // Enregistrement
  430.         $this->em->persist($user);
  431.         $this->em->flush();
  432.         return $this->render('front/user/login.html.twig', array(
  433.             'message' => "Votre compte a été vérifié. Merci de connecter.",
  434.         ));
  435.     }
  436.     /**
  437.      * @Route("/password-restore/{key}", name="password_restore", methods={"GET"}, options={"expose"=true})
  438.      */
  439.     public function restorePassword(Request $request$key): Response
  440.     {
  441.         $string $this->decrypt($key);
  442.         $parts explode('|'$string);
  443.         // Récupérer l'email
  444.         $email $parts[0];
  445.         // Récupérer la date
  446.         $dateRestore $parts[1];
  447.         $date strtotime('now');
  448.         $dateRestore strtotime($dateRestore);
  449.         // Vérifier si le lien a expiré (envoyé depuis plus de 30 minutes)
  450.         if (round(abs($date $dateRestore) / 602) > 30) {
  451.             return $this->render('front/user/login.html.twig', array(
  452.                 'message' => 'Votre lien a expiré. Merci de réassayer.',
  453.             ));
  454.         }
  455.         // Activation du compte et redirection vers la page login
  456.         $user $this->em->getRepository(User::class)->findOneBy(array('email' => $email));
  457.         // Vérification existance utiliateur
  458.         if (!$user) {
  459.             return $this->render('front/user/login.html.twig', array(
  460.                 'message' => "Votre email n'existe pas.",
  461.             ));
  462.         }
  463.         return $this->render('front/user/password.html.twig', array(
  464.             'message' => "Saisir votre nouvelle mot de passe.",
  465.             'key' => $key
  466.         ));
  467.     }
  468.     /**
  469.      * @Route("/api/user_signup", name="api_user_signup", options={"expose"=true}, methods={"POST"})
  470.      */
  471.     public function userSignUpAPI(Request $requestUserPasswordEncoderInterface $passwordEncoderMessageBusInterface $bus): Response
  472.     {
  473.         $client json_decode($request->request->get('client'), true);
  474.         // Vérifier les saisies obligatoires
  475.         if ($client['nom'] == '') {
  476.             $response = [
  477.                 'res' => 'ERROR',
  478.                 'message' => "Le nom est obligatoire",
  479.             ];
  480.         } elseif ($client['prenom'] == '') {
  481.             $response = [
  482.                 'res' => 'ERROR',
  483.                 'message' => "Le prénom est obligatoire",
  484.             ];
  485.         } /*elseif ($client['username'] == '') {
  486.             $response = [
  487.                 'res' => 'ERROR',
  488.                 'message' => "Le nom d'utilisateur est obligatoire",
  489.             ];
  490.         } */elseif ($client['telephone'] == '') {
  491.             $response = [
  492.                 'res' => 'ERROR',
  493.                 'message' => "Le numéro de téléphone est obligatoire",
  494.             ];
  495.         } elseif ($client['email'] == '') {
  496.             $response = [
  497.                 'res' => 'ERROR',
  498.                 'message' => "L'adresse mail est obligatoire",
  499.             ];
  500.         } elseif (!filter_var($client['email'], FILTER_VALIDATE_EMAIL)) {
  501.             $response = [
  502.                 'res' => 'ERROR',
  503.                 'message' => "L'adresse mail n'est pas valide",
  504.             ];
  505.         } elseif (strlen($client['password']) == 0) {
  506.             $response = [
  507.                 'res' => 'ERROR',
  508.                 'message' => "Le mot de passe est obligatoire",
  509.             ];
  510.         } elseif (strlen($client['password']) < && strlen($client['password']) > 0) {
  511.             $response = [
  512.                 'res' => 'ERROR',
  513.                 'message' => "La longueur de mot de passe doît être supérieur à 5",
  514.             ];
  515.         } elseif (strlen($client['confirmPassword']) == 0) {
  516.             $response = [
  517.                 'res' => 'ERROR',
  518.                 'message' => "Saisir la confirmaion de mot de passe",
  519.             ];
  520.         } elseif (strlen($client['confirmPassword']) < && strlen($client['confirmPassword']) > 0) {
  521.             $response = [
  522.                 'res' => 'ERROR',
  523.                 'message' => "La longueur de confirmation mot de passe doît être supérieur à 5",
  524.             ];
  525.         } elseif ($client['password'] != $client['confirmPassword']) {
  526.             $response = [
  527.                 'res' => 'ERROR',
  528.                 'message' => "La confirmation de mot de passe ne correspond pas",
  529.             ];
  530.         } elseif (!$client['accept']) {
  531.             $response = [
  532.                 'res' => 'ERROR',
  533.                 'message' => "Veuillez accepter les termes et la politique",
  534.             ];
  535.         } else {
  536.             // Vérification de l'existance de client
  537.             $userByPhone $this->em->getRepository(User::class)->findOneBy(array('phone' => str_replace(' '''$client['telephone'])));
  538. //            $userByUsername = $this->em->getRepository(User::class)->findOneBy(array('usermane' => $client['username']));
  539.             $userByUsername $this->em->getRepository(User::class)->findOneBy(array('usermane' => $client['email']));
  540.             $userByMail $this->em->getRepository(User::class)->findOneBy(array('email' => $client['email']));
  541.             //$userAll = $this->em->getRepository(User::class)->findOneBy(array('email' => $client['email'], 'phone' => str_replace(' ', '', $client['telephone']), 'usermane' => $client['username'], 'isVerified' => 0));
  542.             $userAll $this->em->getRepository(User::class)->findOneBy(array('email' => $client['email'], 'phone' => str_replace(' '''$client['telephone']), 'usermane' => $client['email'], 'isVerified' => 0));
  543.             if ($userAll) {
  544.                 $response = [
  545.                     'res' => 'ERROR',
  546.                     'message' => "Ce compte existe mais n'est pas vérifié.",
  547.                 ];
  548.             } elseif ($userByPhone) {
  549.                 $response = [
  550.                     'res' => 'ERROR',
  551.                     'message' => "Numéro de téléphone déja utilisé.",
  552.                 ];
  553.             } elseif ($userByUsername) {
  554.                 $response = [
  555.                     'res' => 'ERROR',
  556.                     //'message' => "Nom d'utilisateur déja utilisé.",
  557.                     'message' => "E-mail déja utilisé.",
  558.                 ];
  559.             } elseif ($userByMail) {
  560.                 $response = [
  561.                     'res' => 'ERROR',
  562.                     'message' => "E-mail déja utilisé.",
  563.                 ];
  564.             } else {
  565.                 // Suspend auto commit : début de la transaction
  566.                 $this->em->getConnection()->beginTransaction();
  567.                 try {
  568.                     // Création de nouveau utiliateur
  569.                     $user = new User();
  570.                     $user->setType('client');
  571. //                    $user->setUsermane($client['username']);
  572.                     $user->setUsermane($client['email']);
  573.                     $user->setFirstName($client['nom']);
  574.                     $user->setLastName($client['prenom']);
  575.                     //$user->setCity($client['civilite']);
  576.                     $user->setPhone(str_replace(''''$client['telephone']));
  577.                     $user->setEmail($client['email']);
  578.                     $user->setCreatedAt(new \DateTime('now'));
  579.                     $user->setCivility($client['civilite']);
  580.                     // Mot de passe
  581.                     $user->setPassword(
  582.                         $passwordEncoder->encodePassword(
  583.                             $user,
  584.                             $client['password']
  585.                         )
  586.                     );
  587.                     // Enregistrer le nouveau client
  588.                     $this->em->persist($user);
  589.                     $this->em->flush();
  590.                     // Génération de chaine de username crypté
  591.                     $key $this->encrypt($user->getUsermane());
  592.                     // Envoi de mail
  593.                     if (isset($_ENV['MAILER_DSN']) && isset($_ENV['MAILER_MAIL'])) {
  594.                         if ($user->getEmail() && filter_var($user->getEmail(), FILTER_VALIDATE_EMAIL)) {
  595.                             $bus->dispatch(new Mail('front/mail/activation.html.twig'null$key$user->getEmail(), 'Activation compte SUNSHINE-ELEGANCE'), [new DelayStamp(10000)]);
  596.                         }
  597.                     };
  598.                     // Try and commit the transaction
  599.                     $this->em->getConnection()->commit();
  600.                 } catch (Exception $e) {
  601.                     // Rollback the failed transaction
  602.                     $this->em->getConnection()->rollBack();
  603.                     throw $e;
  604.                 }
  605.                 $response = [
  606.                     'res' => 'OK',
  607.                     'message' => 'Votre compte a été crée avec succès. Consulter votre boite mail pour activer votre compte.',
  608.                 ];
  609.             }
  610.         }
  611.         return new jsonResponse($response);
  612.     }
  613.     /**
  614.      * @Route("/user-request-password", name="user_request_password", methods={"GET"})
  615.      */
  616.     public function requestPassword(Request $request): Response
  617.     {
  618.         return $this->render('front/user/requestPassword.html.twig');
  619.     }
  620.     /**
  621.      * @Route("/user-request-verify", name="user_request_verify", methods={"GET"})
  622.      */
  623.     public function requestVerify(Request $request): Response
  624.     {
  625.         return $this->render('front/user/requestVerify.html.twig');
  626.     }
  627.     /**
  628.      * @Route("/api/user-change-password", name="api_user_change_password", options={"expose"=true}, methods={"POST"})
  629.      */
  630.     public function changePasswordAPI(Request $requestUserPasswordEncoderInterface $passwordEncoderMessageBusInterface $bus): Response
  631.     {
  632.         $client json_decode($request->request->get('client'), true);
  633.         // Vérifier les saisies obligatoires
  634.         if (strlen($client['password']) == 0) {
  635.             $response = [
  636.                 'res' => 'ERROR',
  637.                 'message' => "Saisir votre nouveau passe",
  638.             ];
  639.         } elseif (strlen($client['password']) < && strlen($client['password']) > 0) {
  640.             $response = [
  641.                 'res' => 'ERROR',
  642.                 'message' => "La longueur de mot de passe doît être supérieur à 5",
  643.             ];
  644.         } elseif (strlen($client['confMotDePasse']) == 0) {
  645.             $response = [
  646.                 'res' => 'ERROR',
  647.                 'message' => "Saisir la confirmaion de mot de passe",
  648.             ];
  649.         } elseif (strlen($client['confMotDePasse']) < && strlen($client['confMotDePasse']) > 0) {
  650.             $response = [
  651.                 'res' => 'ERROR',
  652.                 'message' => "La longueur de confirmation mot de passe doît être supérieur à 5",
  653.             ];
  654.         } elseif ($client['password'] != $client['confMotDePasse']) {
  655.             $response = [
  656.                 'res' => 'ERROR',
  657.                 'message' => "La confirmation de mot de passe ne correspond pas",
  658.             ];
  659.         } else {
  660.             $string $this->decrypt($client['key']);
  661.             $parts explode('|'$string);
  662.             // Récupérer le nom utilisateur
  663.             $email $parts[0];
  664.             // Récupérer la date d'inscription
  665.             $dateRestore $parts[1];
  666.             $date strtotime('now');
  667.             $dateRestore strtotime($dateRestore);
  668.             // Vérifier si le lien a expiré (envoyé depuis plus de 30 minutes)
  669.             if (round(abs($date $dateRestore) / 602) > 30) {
  670.                 return $this->render('front/user/login.html.twig', array(
  671.                     'message' => 'Votre lien a expiré. Merci de réassayer.',
  672.                 ));
  673.             }
  674.             // Activation du compte et redirection vers la page login
  675.             $user $this->em->getRepository(User::class)->findOneBy(array('email' => $email));
  676.             // Vérification existance utiliateur
  677.             if (!$user) {
  678.                 return $this->render('front/user/login.html.twig', array(
  679.                     'message' => "Votre nom d'utilisateur n'existe pas.",
  680.                 ));
  681.             }
  682.             // Mot de passe
  683.             $user->setPassword(
  684.                 $passwordEncoder->encodePassword(
  685.                     $user,
  686.                     $client['password']
  687.                 )
  688.             );
  689.             // Enregistrement
  690.             $this->em->persist($user);
  691.             $this->em->flush();
  692.             /*return $this->render('front/user/login.html.twig', array(
  693.                 'message' => "Votre compte a été vérifié. Merci de connecter.",
  694.             ));*/
  695.             $response = [
  696.                 'res' => 'OK',
  697.                 'message' => 'Votre mote de passe a été réinitialisé avec succès.',
  698.             ];
  699.         }
  700.         return new jsonResponse($response);
  701.     }
  702.     /**
  703.      * @Route("/email-test", name="email_test", options={"expose"=true}, methods={"GET"})
  704.      */
  705.     public function emailTest(Request $requestMessageBusInterface $bus): Response
  706.     {
  707.         $document $this->em->getRepository(Document::class)->find(26119);
  708.         // send mail
  709.         $bus->dispatch(new Mail('front/mail/order.html.twig'$document), [new DelayStamp(10000)]);
  710.         $response = [
  711.             'res' => 'Ok',
  712.             'message' => 'Email envoyé.',
  713.         ];
  714.         return new jsonResponse($response);
  715.     }
  716.     /**
  717.      * @Route("/api/user-request-password", name="api_user_request_password", options={"expose"=true}, methods={"POST"})
  718.      */
  719.     public function requestPasswordAPI(Request $requestUserPasswordEncoderInterface $passwordEncoderMessageBusInterface $bus): Response
  720.     {
  721.         $client json_decode($request->request->get('client'), true);
  722.         // Vérifier les saisies obligatoires
  723.         if ($client['email'] == '') {
  724.             $response = [
  725.                 'res' => 'ERROR',
  726.                 'message' => "L'adresse mail est obligatoire",
  727.             ];
  728.         } elseif (!filter_var($client['email'], FILTER_VALIDATE_EMAIL)) {
  729.             $response = [
  730.                 'res' => 'ERROR',
  731.                 'message' => "L'adresse mail n'est pas valide",
  732.             ];
  733.         } else {
  734.             // Vérification de l'existance de client
  735.             // $userByUsername = $this->em->getRepository(User::class)->findOneBy(array('usermane' => $client['email']));
  736.             $userByMail $this->em->getRepository(User::class)->findOneBy(array('email' => $client['email']));
  737.             /*if (!$userByUsername) {
  738.                 $response = [
  739.                     'res' => 'ERROR',
  740.                     'message' => "Nom d'utilisateur inexistant.",
  741.                 ];
  742.             } */
  743.             if (!$userByMail) {
  744.                 $response = [
  745.                     'res' => 'ERROR',
  746.                     'message' => "E-mail inexistant.",
  747.                 ];
  748.             } else {
  749.                 // Suspend auto commit : début de la transaction
  750.                 $this->em->getConnection()->beginTransaction();
  751.                 try {
  752.                     // Génération de chaine de username crypté
  753.                     $key $this->encrypt($userByMail->getEmail());
  754.                     // Envoi de mail
  755.                     if (isset($_ENV['MAILER_DSN']) && isset($_ENV['MAILER_MAIL'])) {
  756.                         if ($client['email'] && filter_var($client['email'], FILTER_VALIDATE_EMAIL)) {
  757.                             $bus->dispatch(new Mail('front/mail/password.html.twig'null$key$userByMail->getEmail(), 'Réinitialisation mot de passe'), [new DelayStamp(10000)]);
  758.                         }
  759.                     };
  760.                     // Try and commit the transaction
  761.                     $this->em->getConnection()->commit();
  762.                 } catch (Exception $e) {
  763.                     // Rollback the failed transaction
  764.                     $this->em->getConnection()->rollBack();
  765.                     throw $e;
  766.                 }
  767.                 $response = [
  768.                     'res' => 'OK',
  769.                     'message' => 'Un e-mail de réinitialisation de mot de passe vous a été envoyé. Merci de consulter votre boite mail.',
  770.                 ];
  771.             }
  772.         }
  773.         return new jsonResponse($response);
  774.     }
  775.     /**
  776.      * @Route("/api/user_request_verify", name="api_user_request_verify", options={"expose"=true}, methods={"POST"})
  777.      */
  778.     public function requestUserVerifyAPI(Request $requestUserPasswordEncoderInterface $passwordEncoderMessageBusInterface $bus): Response
  779.     {
  780.         $client json_decode($request->request->get('client'), true);
  781.         // Vérifier les saisies obligatoires
  782.         if ($client['email'] == '') {
  783.             $response = [
  784.                 'res' => 'ERROR',
  785.                 'message' => "L'adresse mail est obligatoire",
  786.             ];
  787.         } elseif (!filter_var($client['email'], FILTER_VALIDATE_EMAIL)) {
  788.             $response = [
  789.                 'res' => 'ERROR',
  790.                 'message' => "L'adresse mail n'est pas valide",
  791.             ];
  792.         } else {
  793.             // Vérification de l'existance de client
  794.             // $userByUsername = $this->em->getRepository(User::class)->findOneBy(array('usermane' => $client['email']));
  795.             $userByMail $this->em->getRepository(User::class)->findOneBy(array('email' => $client['email']));
  796.             /*if (!$userByUsername) {
  797.                 $response = [
  798.                     'res' => 'ERROR',
  799.                     'message' => "Nom d'utilisateur inexistant.",
  800.                 ];
  801.             } */
  802.             if (!$userByMail) {
  803.                 $response = [
  804.                     'res' => 'ERROR',
  805.                     'message' => "E-mail inexistant.",
  806.                 ];
  807.             } else {
  808.                 // Suspend auto commit : début de la transaction
  809.                 $this->em->getConnection()->beginTransaction();
  810.                 try {
  811.                     // Génération de chaine de username crypté
  812.                     $key $this->encrypt($userByMail->getUsermane());
  813.                     // Envoi de mail
  814.                     if (isset($_ENV['MAILER_DSN']) && isset($_ENV['MAILER_MAIL'])) {
  815.                         if ($client['email'] && filter_var($client['email'], FILTER_VALIDATE_EMAIL)) {
  816.                             $bus->dispatch(new Mail('front/mail/activation.html.twig'null$key$userByMail->getEmail(), 'Activation compte SUNSHINE-ELEGANCE'), [new DelayStamp(10000)]);
  817.                         }
  818.                     };
  819.                     // Try and commit the transaction
  820.                     $this->em->getConnection()->commit();
  821.                 } catch (Exception $e) {
  822.                     // Rollback the failed transaction
  823.                     $this->em->getConnection()->rollBack();
  824.                     throw $e;
  825.                 }
  826.                 $response = [
  827.                     'res' => 'OK',
  828.                     'message' => 'Un e-mail de vérification vous a été envoyé. Merci de consulter votre boite mail.',
  829.                 ];
  830.             }
  831.         }
  832.         return new jsonResponse($response);
  833.     }
  834.     /**
  835.      * @Route("/api/user_contact", name="api_user_contact", options={"expose"=true}, methods={"POST"})
  836.      */
  837.     public function userContactAPI(Request $requestUserPasswordEncoderInterface $passwordEncoderMessageBusInterface $bus): Response
  838.     {
  839.         $client json_decode($request->request->get('client'), true);
  840.         // Vérifier les saisies obligatoires
  841.         if ($client['telephone'] == '') {
  842.             $response = [
  843.                 'res' => 'ERROR',
  844.                 'message' => "Le numéro de téléphone est obligatoire.",
  845.             ];
  846.         } elseif ($client['email'] != '' && !filter_var($client['email'], FILTER_VALIDATE_EMAIL)) {
  847.             $response = [
  848.                 'res' => 'ERROR',
  849.                 'message' => "L'adresse mail n'est pas valide.",
  850.             ];
  851.         } elseif ($client['message'] == '') {
  852.             $response = [
  853.                 'res' => 'ERROR',
  854.                 'message' => "Saisir votre message.",
  855.             ];
  856.         } else {
  857.             // Envoi de mail
  858.             if (isset($_ENV['MAILER_DSN']) && isset($_ENV['MAILER_MAIL']) && isset($_ENV['MAILER_CONTACT'])) {
  859.                 if (filter_var($_ENV['MAILER_CONTACT'], FILTER_VALIDATE_EMAIL)) {
  860.                     $bus->dispatch(new Mail('front/mail/contact.html.twig'nullnull$_ENV['MAILER_CONTACT'], 'Message client contact'$client), [new DelayStamp(10000)]);
  861.                 }
  862.             };
  863.             $response = [
  864.                 'res' => 'OK',
  865.                 'message' => 'Votre message a été envoyé avec succès.'
  866.             ];
  867.         }
  868.         return new jsonResponse($response);
  869.     }
  870. }