src/Controller/Front/UserController.php line 67

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()],
  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()],
  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.            
  278.             if ($user['firstName'] == '') {
  279.                 $response = [
  280.                     'res' => 'ERROR',
  281.                     'message' => "Le prénom est obligatoire",
  282.                 ];
  283.             } elseif ($user['email'] == '') {
  284.                 $response = [
  285.                     'res' => 'ERROR',
  286.                     'message' => "L'adresse mail est obligatoire",
  287.                 ];
  288.             } elseif (!filter_var($user['email'], FILTER_VALIDATE_EMAIL)) {
  289.                 $response = [
  290.                     'res' => 'ERROR',
  291.                     'message' => "L'adresse mail n'est pas valide",
  292.                 ];
  293.             } elseif ($userByMail && $userByMail->getId() <> $this->getUser()->getId()) {
  294.                 $response = [
  295.                     'res' => 'ERROR',
  296.                     'message' => "E-mail déja utilisé.",
  297.                 ];
  298.             } elseif (strlen($user['password']) < && strlen($user['password']) > 0) {
  299.                 $response = [
  300.                     'res' => 'ERROR',
  301.                     'message' => "La longueur de mot de passe doît être supérieur à 5",
  302.                 ];
  303.             } elseif (!$passwordEncoder->isPasswordValid($this->getUser(), $user['password']) && strlen($user['password']) > 0) {
  304.                 $response = [
  305.                     'res' => 'ERROR',
  306.                     'message' => "Le mot de passe ne correspond pas",
  307.                 ];
  308.             } elseif (strlen($user['newPassword']) == && strlen($user['password']) > 0) {
  309.                 $response = [
  310.                     'res' => 'ERROR',
  311.                     'message' => "Saisir le nouveau mot de passe",
  312.                 ];
  313.             } elseif (strlen($user['confirmPassword']) == && strlen($user['password']) > 0) {
  314.                 $response = [
  315.                     'res' => 'ERROR',
  316.                     'message' => "Saisir la confirmaion de mot de passe",
  317.                 ];
  318.             } elseif (strlen($user['newPassword']) < && strlen($user['newPassword']) > && strlen($user['password']) > 0) {
  319.                 $response = [
  320.                     'res' => 'ERROR',
  321.                     'message' => "La longueur de nouveau mot de passe doît être supérieur à 5",
  322.                 ];
  323.             } elseif (strlen($user['confirmPassword']) < && strlen($user['confirmPassword']) > && strlen($user['password']) > 0) {
  324.                 $response = [
  325.                     'res' => 'ERROR',
  326.                     'message' => "La longueur de confirmation mot de passe doît être supérieur à 5",
  327.                 ];
  328.             } elseif ($user['newPassword'] != $user['confirmPassword'] && strlen($user['password']) > 0) {
  329.                 $response = [
  330.                     'res' => 'ERROR',
  331.                     'message' => "La confirmation de nouveau mot de passe ne correspond pas",
  332.                 ];
  333.             } else {
  334.                 $this->getUser()->setFirstName($user['firstName']);
  335.                 $this->getUser()->setEmail($user['email']);
  336.                 if (strlen($user['newPassword']) > && $passwordEncoder->isPasswordValid($this->getUser(), $user['password']) && strlen($user['password']) > 0) {
  337.                     $this->getUser()->setPassword(
  338.                         $passwordEncoder->encodePassword(
  339.                             $this->getUser(),
  340.                             $user['newPassword']
  341.                         )
  342.                     );
  343.                 };
  344.                 $this->em->persist($this->getUser());
  345.                 $this->em->flush();
  346.                 $response = [
  347.                     'res' => 'OK',
  348.                     'data' => $this->getUser(),
  349.                     'message' => 'Enregsitrement effectué avec succès.',
  350.                 ];
  351.             }
  352.         }
  353.         return new jsonResponse($response);
  354.     }
  355.     /**
  356.      * @Route("/document/{id}", name="document_details", methods={"GET"}, options={"expose"=true})
  357.      */
  358.     public function document(Request $request$id): Response
  359.     {
  360.         $max = isset($_ENV['FREE_DELIVERY_AMOUNT']) ? floatval($_ENV['FREE_DELIVERY_AMOUNT']) : 0// Maximum pour avoir une livraison gratuite
  361.         if ($this->getUser()) {
  362.             $document $this->em->getRepository(Document::class)->find($id);
  363.             // Vérifier l'existance de la commande
  364.             if (!$document) {
  365.                 return $this->redirectToRoute('user_account');
  366.             }
  367.             return $this->render('front/user/order.html.twig'compact('document''max'));
  368.         } else {
  369.             return $this->redirectToRoute('user_login');
  370.         }
  371.     }
  372.     // Functions to encrypt and decrypt a string
  373.     public function encrypt($string$salt null): ?string
  374.     {
  375.         // Concaténer la chaine avec la date en cours
  376.         $string $string '|' . (new \DateTime('now'))->format('Y-m-d H:i:s');
  377.         if ($salt === null) {
  378.             $salt hash('sha256'uniqid(mt_rand(), true));
  379.         }  // this is an unique salt per entry and directly stored within a password
  380.         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*/ ;
  381.     }
  382.     public function decrypt($string): ?string
  383.     {
  384.         //if( count(explode(':', $string)) !== 2 ) { return $string; }
  385.         //$salt = explode(":",$string)[1];
  386.         //$string = explode(":",$string)[0]; // read salt from entry
  387.         return openssl_decrypt(base64_decode($string), 'AES-256-CBC'self::ENCRYPTION_KEY0str_pad(substr(self::SALT_KEY016), 16'0'STR_PAD_LEFT));
  388.     }
  389.     /**
  390.      * @Route("/account-activation/{key}", name="account_activation", methods={"GET"}, options={"expose"=true})
  391.      */
  392.     public function activateAccount(Request $request$key): Response
  393.     {
  394.         $string $this->decrypt($key);
  395.         $parts explode('|'$string);
  396.         // Récupérer le nom utilisateur
  397.         $username $parts[0];
  398.         // Récupérer la date d'inscription
  399.         $dateSignUp $parts[1];
  400.         $date strtotime('now');
  401.         $dateSignUp strtotime($dateSignUp);
  402.         // Vérifier si le lien a expiré (envoyé depuis plus de 30 minutes)
  403.         if (round(abs($date $dateSignUp) / 602) > 30) {
  404.             return $this->render('front/user/login.html.twig', array(
  405.                 'message' => 'Votre lien a expiré. Merci de réassayer.',
  406.             ));
  407.         }
  408.         // Activation du compte et redirection vers la page login
  409.         $user $this->em->getRepository(User::class)->findOneBy(array('username' => $username));
  410.         // Vérification existance utiliateur
  411.         if (!$user) {
  412.             return $this->render('front/user/login.html.twig', array(
  413.                 'message' => "Votre nom d'utilisateur n'existe pas.",
  414.             ));
  415.         }
  416.         // Vérification existance utiliateur
  417.         if ($user->isVerified()) {
  418.             return $this->render('front/user/login.html.twig', array(
  419.                 'message' => "Votre compte est déjà vérifié. Merci de connecter.",
  420.             ));
  421.         }
  422.         // Activation
  423.         $user->setIsVerified(true);
  424.         // Enregistrement
  425.         $this->em->persist($user);
  426.         $this->em->flush();
  427.         return $this->render('front/user/login.html.twig', array(
  428.             'message' => "Votre compte a été vérifié. Merci de connecter.",
  429.         ));
  430.     }
  431.     /**
  432.      * @Route("/password-restore/{key}", name="password_restore", methods={"GET"}, options={"expose"=true})
  433.      */
  434.     public function restorePassword(Request $request$key): Response
  435.     {
  436.         $string $this->decrypt($key);
  437.         $parts explode('|'$string);
  438.         // Récupérer l'email
  439.         $email $parts[0];
  440.         // Récupérer la date
  441.         $dateRestore $parts[1];
  442.         $date strtotime('now');
  443.         $dateRestore strtotime($dateRestore);
  444.         // Vérifier si le lien a expiré (envoyé depuis plus de 30 minutes)
  445.         if (round(abs($date $dateRestore) / 602) > 30) {
  446.             return $this->render('front/user/login.html.twig', array(
  447.                 'message' => 'Votre lien a expiré. Merci de réassayer.',
  448.             ));
  449.         }
  450.         // Activation du compte et redirection vers la page login
  451.         $user $this->em->getRepository(User::class)->findOneBy(array('email' => $email));
  452.         // Vérification existance utiliateur
  453.         if (!$user) {
  454.             return $this->render('front/user/login.html.twig', array(
  455.                 'message' => "Votre email n'existe pas.",
  456.             ));
  457.         }
  458.         return $this->render('front/user/password.html.twig', array(
  459.             'message' => "Saisir votre nouvelle mot de passe.",
  460.             'key' => $key
  461.         ));
  462.     }
  463.     /**
  464.      * @Route("/api/user_signup", name="api_user_signup", options={"expose"=true}, methods={"POST"})
  465.      */
  466.     public function userSignUpAPI(Request $requestUserPasswordEncoderInterface $passwordEncoderMessageBusInterface $bus): Response
  467.     {
  468.         $client json_decode($request->request->get('client'), true);
  469.         // Vérifier les saisies obligatoires
  470.         if ($client['nom'] == '') {
  471.             $response = [
  472.                 'res' => 'ERROR',
  473.                 'message' => "Le nom est obligatoire",
  474.             ];
  475.         } elseif ($client['prenom'] == '') {
  476.             $response = [
  477.                 'res' => 'ERROR',
  478.                 'message' => "Le prénom est obligatoire",
  479.             ];
  480.         } /*elseif ($client['username'] == '') {
  481.             $response = [
  482.                 'res' => 'ERROR',
  483.                 'message' => "Le nom d'utilisateur est obligatoire",
  484.             ];
  485.         } */elseif ($client['telephone'] == '') {
  486.             $response = [
  487.                 'res' => 'ERROR',
  488.                 'message' => "Le numéro de téléphone est obligatoire",
  489.             ];
  490.         } elseif ($client['email'] == '') {
  491.             $response = [
  492.                 'res' => 'ERROR',
  493.                 'message' => "L'adresse mail est obligatoire",
  494.             ];
  495.         } elseif (!filter_var($client['email'], FILTER_VALIDATE_EMAIL)) {
  496.             $response = [
  497.                 'res' => 'ERROR',
  498.                 'message' => "L'adresse mail n'est pas valide",
  499.             ];
  500.         } elseif (strlen($client['password']) == 0) {
  501.             $response = [
  502.                 'res' => 'ERROR',
  503.                 'message' => "Le mot de passe est obligatoire",
  504.             ];
  505.         } elseif (strlen($client['password']) < && strlen($client['password']) > 0) {
  506.             $response = [
  507.                 'res' => 'ERROR',
  508.                 'message' => "La longueur de mot de passe doît être supérieur à 5",
  509.             ];
  510.         } elseif (strlen($client['confirmPassword']) == 0) {
  511.             $response = [
  512.                 'res' => 'ERROR',
  513.                 'message' => "Saisir la confirmaion de mot de passe",
  514.             ];
  515.         } elseif (strlen($client['confirmPassword']) < && strlen($client['confirmPassword']) > 0) {
  516.             $response = [
  517.                 'res' => 'ERROR',
  518.                 'message' => "La longueur de confirmation mot de passe doît être supérieur à 5",
  519.             ];
  520.         } elseif ($client['password'] != $client['confirmPassword']) {
  521.             $response = [
  522.                 'res' => 'ERROR',
  523.                 'message' => "La confirmation de mot de passe ne correspond pas",
  524.             ];
  525.         } elseif (!$client['accept']) {
  526.             $response = [
  527.                 'res' => 'ERROR',
  528.                 'message' => "Veuillez accepter les termes et la politique",
  529.             ];
  530.         } else {
  531.             // Vérification de l'existance de client
  532.             $userByPhone $this->em->getRepository(User::class)->findOneBy(array('phone' => str_replace(' '''$client['telephone'])));
  533. //            $userByUsername = $this->em->getRepository(User::class)->findOneBy(array('username' => $client['username']));
  534.             $userByUsername $this->em->getRepository(User::class)->findOneBy(array('username' => $client['email']));
  535.             $userByMail $this->em->getRepository(User::class)->findOneBy(array('email' => $client['email']));
  536.             //$userAll = $this->em->getRepository(User::class)->findOneBy(array('email' => $client['email'], 'phone' => str_replace(' ', '', $client['telephone']), 'username' => $client['username'], 'isVerified' => 0));
  537.             $userAll $this->em->getRepository(User::class)->findOneBy(array('email' => $client['email'], 'phone' => str_replace(' '''$client['telephone']), 'username' => $client['email'], 'isVerified' => 0));
  538.             if ($userAll) {
  539.                 $response = [
  540.                     'res' => 'ERROR',
  541.                     'message' => "Ce compte existe mais n'est pas vérifié.",
  542.                 ];
  543.             } elseif ($userByPhone) {
  544.                 $response = [
  545.                     'res' => 'ERROR',
  546.                     'message' => "Numéro de téléphone déja utilisé.",
  547.                 ];
  548.             } elseif ($userByUsername) {
  549.                 $response = [
  550.                     'res' => 'ERROR',
  551.                     //'message' => "Nom d'utilisateur déja utilisé.",
  552.                     'message' => "E-mail déja utilisé.",
  553.                 ];
  554.             } elseif ($userByMail) {
  555.                 $response = [
  556.                     'res' => 'ERROR',
  557.                     'message' => "E-mail déja utilisé.",
  558.                 ];
  559.             } else {
  560.                 // Suspend auto commit : début de la transaction
  561.                 $this->em->getConnection()->beginTransaction();
  562.                 try {
  563.                     // Création de nouveau utiliateur
  564.                     $user = new User();
  565.                     $user->setType('client');
  566.                     $user->setUsername($client['email']);
  567.                     $user->setFirstName($client['nom']);
  568.                     //$user->setCity($client['civilite']);
  569.                     $user->setPhone(str_replace(''''$client['telephone']));
  570.                     $user->setEmail($client['email']);
  571.                     $user->setCreatedAt(new \DateTime('now'));
  572.                     $user->setCivility($client['civilite']);
  573.                     // Mot de passe
  574.                     $user->setPassword(
  575.                         $passwordEncoder->encodePassword(
  576.                             $user,
  577.                             $client['password']
  578.                         )
  579.                     );
  580.                     // Enregistrer le nouveau client
  581.                     $this->em->persist($user);
  582.                     $this->em->flush();
  583.                     // Génération de chaine de username crypté
  584.                     $key $this->encrypt($user->getUsername());
  585.                     // Envoi de mail
  586.                     if (isset($_ENV['MAILER_DSN']) && isset($_ENV['MAILER_MAIL'])) {
  587.                         if ($user->getEmail() && filter_var($user->getEmail(), FILTER_VALIDATE_EMAIL)) {
  588.                             $bus->dispatch(new Mail('front/mail/activation.html.twig'null$key$user->getEmail(), 'Activation compte SUNSHINE-ELEGANCE'), [new DelayStamp(10000)]);
  589.                         }
  590.                     };
  591.                     // Try and commit the transaction
  592.                     $this->em->getConnection()->commit();
  593.                 } catch (Exception $e) {
  594.                     // Rollback the failed transaction
  595.                     $this->em->getConnection()->rollBack();
  596.                     throw $e;
  597.                 }
  598.                 $response = [
  599.                     'res' => 'OK',
  600.                     'message' => 'Votre compte a été crée avec succès. Consulter votre boite mail pour activer votre compte.',
  601.                 ];
  602.             }
  603.         }
  604.         return new jsonResponse($response);
  605.     }
  606.     /**
  607.      * @Route("/user-request-password", name="user_request_password", methods={"GET"})
  608.      */
  609.     public function requestPassword(Request $request): Response
  610.     {
  611.         return $this->render('front/user/requestPassword.html.twig');
  612.     }
  613.     /**
  614.      * @Route("/user-request-verify", name="user_request_verify", methods={"GET"})
  615.      */
  616.     public function requestVerify(Request $request): Response
  617.     {
  618.         return $this->render('front/user/requestVerify.html.twig');
  619.     }
  620.     /**
  621.      * @Route("/api/user-change-password", name="api_user_change_password", options={"expose"=true}, methods={"POST"})
  622.      */
  623.     public function changePasswordAPI(Request $requestUserPasswordEncoderInterface $passwordEncoderMessageBusInterface $bus): Response
  624.     {
  625.         $client json_decode($request->request->get('client'), true);
  626.         // Vérifier les saisies obligatoires
  627.         if (strlen($client['password']) == 0) {
  628.             $response = [
  629.                 'res' => 'ERROR',
  630.                 'message' => "Saisir votre nouveau passe",
  631.             ];
  632.         } elseif (strlen($client['password']) < && strlen($client['password']) > 0) {
  633.             $response = [
  634.                 'res' => 'ERROR',
  635.                 'message' => "La longueur de mot de passe doît être supérieur à 5",
  636.             ];
  637.         } elseif (strlen($client['confMotDePasse']) == 0) {
  638.             $response = [
  639.                 'res' => 'ERROR',
  640.                 'message' => "Saisir la confirmaion de mot de passe",
  641.             ];
  642.         } elseif (strlen($client['confMotDePasse']) < && strlen($client['confMotDePasse']) > 0) {
  643.             $response = [
  644.                 'res' => 'ERROR',
  645.                 'message' => "La longueur de confirmation mot de passe doît être supérieur à 5",
  646.             ];
  647.         } elseif ($client['password'] != $client['confMotDePasse']) {
  648.             $response = [
  649.                 'res' => 'ERROR',
  650.                 'message' => "La confirmation de mot de passe ne correspond pas",
  651.             ];
  652.         } else {
  653.             $string $this->decrypt($client['key']);
  654.             $parts explode('|'$string);
  655.             // Récupérer le nom utilisateur
  656.             $email $parts[0];
  657.             // Récupérer la date d'inscription
  658.             $dateRestore $parts[1];
  659.             $date strtotime('now');
  660.             $dateRestore strtotime($dateRestore);
  661.             // Vérifier si le lien a expiré (envoyé depuis plus de 30 minutes)
  662.             if (round(abs($date $dateRestore) / 602) > 30) {
  663.                 return $this->render('front/user/login.html.twig', array(
  664.                     'message' => 'Votre lien a expiré. Merci de réassayer.',
  665.                 ));
  666.             }
  667.             // Activation du compte et redirection vers la page login
  668.             $user $this->em->getRepository(User::class)->findOneBy(array('email' => $email));
  669.             // Vérification existance utiliateur
  670.             if (!$user) {
  671.                 return $this->render('front/user/login.html.twig', array(
  672.                     'message' => "Votre nom d'utilisateur n'existe pas.",
  673.                 ));
  674.             }
  675.             // Mot de passe
  676.             $user->setPassword(
  677.                 $passwordEncoder->encodePassword(
  678.                     $user,
  679.                     $client['password']
  680.                 )
  681.             );
  682.             // Enregistrement
  683.             $this->em->persist($user);
  684.             $this->em->flush();
  685.             /*return $this->render('front/user/login.html.twig', array(
  686.                 'message' => "Votre compte a été vérifié. Merci de connecter.",
  687.             ));*/
  688.             $response = [
  689.                 'res' => 'OK',
  690.                 'message' => 'Votre mote de passe a été réinitialisé avec succès.',
  691.             ];
  692.         }
  693.         return new jsonResponse($response);
  694.     }
  695.     /**
  696.      * @Route("/email-test", name="email_test", options={"expose"=true}, methods={"GET"})
  697.      */
  698.     public function emailTest(Request $requestMessageBusInterface $bus): Response
  699.     {
  700.         $document $this->em->getRepository(Document::class)->find(26119);
  701.         // send mail
  702.         $bus->dispatch(new Mail('front/mail/order.html.twig'$document), [new DelayStamp(10000)]);
  703.         $response = [
  704.             'res' => 'Ok',
  705.             'message' => 'Email envoyé.',
  706.         ];
  707.         return new jsonResponse($response);
  708.     }
  709.     /**
  710.      * @Route("/api/user-request-password", name="api_user_request_password", options={"expose"=true}, methods={"POST"})
  711.      */
  712.     public function requestPasswordAPI(Request $requestUserPasswordEncoderInterface $passwordEncoderMessageBusInterface $bus): Response
  713.     {
  714.         $client json_decode($request->request->get('client'), true);
  715.         // Vérifier les saisies obligatoires
  716.         if ($client['email'] == '') {
  717.             $response = [
  718.                 'res' => 'ERROR',
  719.                 'message' => "L'adresse mail est obligatoire",
  720.             ];
  721.         } elseif (!filter_var($client['email'], FILTER_VALIDATE_EMAIL)) {
  722.             $response = [
  723.                 'res' => 'ERROR',
  724.                 'message' => "L'adresse mail n'est pas valide",
  725.             ];
  726.         } else {
  727.             // Vérification de l'existance de client
  728.             // $userByUsername = $this->em->getRepository(User::class)->findOneBy(array('username' => $client['email']));
  729.             $userByMail $this->em->getRepository(User::class)->findOneBy(array('email' => $client['email']));
  730.             /*if (!$userByUsername) {
  731.                 $response = [
  732.                     'res' => 'ERROR',
  733.                     'message' => "Nom d'utilisateur inexistant.",
  734.                 ];
  735.             } */
  736.             if (!$userByMail) {
  737.                 $response = [
  738.                     'res' => 'ERROR',
  739.                     'message' => "E-mail inexistant.",
  740.                 ];
  741.             } else {
  742.                 // Suspend auto commit : début de la transaction
  743.                 $this->em->getConnection()->beginTransaction();
  744.                 try {
  745.                     // Génération de chaine de username crypté
  746.                     $key $this->encrypt($userByMail->getEmail());
  747.                     // Envoi de mail
  748.                     if (isset($_ENV['MAILER_DSN']) && isset($_ENV['MAILER_MAIL'])) {
  749.                         if ($client['email'] && filter_var($client['email'], FILTER_VALIDATE_EMAIL)) {
  750.                             $bus->dispatch(new Mail('front/mail/password.html.twig'null$key$userByMail->getEmail(), 'Réinitialisation mot de passe'), [new DelayStamp(10000)]);
  751.                         }
  752.                     };
  753.                     // Try and commit the transaction
  754.                     $this->em->getConnection()->commit();
  755.                 } catch (Exception $e) {
  756.                     // Rollback the failed transaction
  757.                     $this->em->getConnection()->rollBack();
  758.                     throw $e;
  759.                 }
  760.                 $response = [
  761.                     'res' => 'OK',
  762.                     'message' => 'Un e-mail de réinitialisation de mot de passe vous a été envoyé. Merci de consulter votre boite mail.',
  763.                 ];
  764.             }
  765.         }
  766.         return new jsonResponse($response);
  767.     }
  768.     /**
  769.      * @Route("/api/user_request_verify", name="api_user_request_verify", options={"expose"=true}, methods={"POST"})
  770.      */
  771.     public function requestUserVerifyAPI(Request $requestUserPasswordEncoderInterface $passwordEncoderMessageBusInterface $bus): Response
  772.     {
  773.         $client json_decode($request->request->get('client'), true);
  774.         // Vérifier les saisies obligatoires
  775.         if ($client['email'] == '') {
  776.             $response = [
  777.                 'res' => 'ERROR',
  778.                 'message' => "L'adresse mail est obligatoire",
  779.             ];
  780.         } elseif (!filter_var($client['email'], FILTER_VALIDATE_EMAIL)) {
  781.             $response = [
  782.                 'res' => 'ERROR',
  783.                 'message' => "L'adresse mail n'est pas valide",
  784.             ];
  785.         } else {
  786.             // Vérification de l'existance de client
  787.             // $userByUsername = $this->em->getRepository(User::class)->findOneBy(array('username' => $client['email']));
  788.             $userByMail $this->em->getRepository(User::class)->findOneBy(array('email' => $client['email']));
  789.             /*if (!$userByUsername) {
  790.                 $response = [
  791.                     'res' => 'ERROR',
  792.                     'message' => "Nom d'utilisateur inexistant.",
  793.                 ];
  794.             } */
  795.             if (!$userByMail) {
  796.                 $response = [
  797.                     'res' => 'ERROR',
  798.                     'message' => "E-mail inexistant.",
  799.                 ];
  800.             } else {
  801.                 // Suspend auto commit : début de la transaction
  802.                 $this->em->getConnection()->beginTransaction();
  803.                 try {
  804.                     // Génération de chaine de username crypté
  805.                     $key $this->encrypt($userByMail->getUsername());
  806.                     // Envoi de mail
  807.                     if (isset($_ENV['MAILER_DSN']) && isset($_ENV['MAILER_MAIL'])) {
  808.                         if ($client['email'] && filter_var($client['email'], FILTER_VALIDATE_EMAIL)) {
  809.                             $bus->dispatch(new Mail('front/mail/activation.html.twig'null$key$userByMail->getEmail(), 'Activation compte SUNSHINE-ELEGANCE'), [new DelayStamp(10000)]);
  810.                         }
  811.                     };
  812.                     // Try and commit the transaction
  813.                     $this->em->getConnection()->commit();
  814.                 } catch (Exception $e) {
  815.                     // Rollback the failed transaction
  816.                     $this->em->getConnection()->rollBack();
  817.                     throw $e;
  818.                 }
  819.                 $response = [
  820.                     'res' => 'OK',
  821.                     'message' => 'Un e-mail de vérification vous a été envoyé. Merci de consulter votre boite mail.',
  822.                 ];
  823.             }
  824.         }
  825.         return new jsonResponse($response);
  826.     }
  827.     /**
  828.      * @Route("/api/user_contact", name="api_user_contact", options={"expose"=true}, methods={"POST"})
  829.      */
  830.     public function userContactAPI(Request $requestUserPasswordEncoderInterface $passwordEncoderMessageBusInterface $bus): Response
  831.     {
  832.         $client json_decode($request->request->get('client'), true);
  833.         // Vérifier les saisies obligatoires
  834.         if ($client['telephone'] == '') {
  835.             $response = [
  836.                 'res' => 'ERROR',
  837.                 'message' => "Le numéro de téléphone est obligatoire.",
  838.             ];
  839.         } elseif ($client['email'] != '' && !filter_var($client['email'], FILTER_VALIDATE_EMAIL)) {
  840.             $response = [
  841.                 'res' => 'ERROR',
  842.                 'message' => "L'adresse mail n'est pas valide.",
  843.             ];
  844.         } elseif ($client['message'] == '') {
  845.             $response = [
  846.                 'res' => 'ERROR',
  847.                 'message' => "Saisir votre message.",
  848.             ];
  849.         } else {
  850.             // Envoi de mail
  851.             if (isset($_ENV['MAILER_DSN']) && isset($_ENV['MAILER_MAIL']) && isset($_ENV['MAILER_CONTACT'])) {
  852.                 if (filter_var($_ENV['MAILER_CONTACT'], FILTER_VALIDATE_EMAIL)) {
  853.                     $bus->dispatch(new Mail('front/mail/contact.html.twig'nullnull$_ENV['MAILER_CONTACT'], 'Message client contact'$client), [new DelayStamp(10000)]);
  854.                 }
  855.             };
  856.             $response = [
  857.                 'res' => 'OK',
  858.                 'message' => 'Votre message a été envoyé avec succès.'
  859.             ];
  860.         }
  861.         return new jsonResponse($response);
  862.     }
  863. }