src/Controller/UsersController.php line 58

  1. <?php
  2. namespace App\Controller;
  3. use Symfony\Bundle\FrameworkBundle\Controller\AbstractController;
  4. use Symfony\Component\Routing\Annotation\Route;
  5. use Symfony\Component\Routing\Annotation\ParamConverter;
  6. use Symfony\Component\HttpFoundation\Response;
  7. use Symfony\Component\HttpFoundation\RedirectResponse;
  8. use Symfony\Component\HttpFoundation\Cookie;
  9. use Doctrine\Persistence\ManagerRegistry;
  10. use Symfony\Component\HttpFoundation\Request;
  11. use Symfony\Component\Security\Core\Authentication\Token\UsernamePasswordToken;
  12. use Symfony\Component\Mailer\MailerInterface;
  13. use Symfony\Bridge\Twig\Mime\TemplatedEmail;
  14. use Symfony\Component\Mime\Email;
  15. use OlaSoft\Common;
  16. use App\Entity\Users;
  17. use App\Entity\Profiles;
  18. use App\Entity\UsersActivities;
  19. use App\Form\UsersType;
  20. /**
  21.  * @Route("/os-admin", name="users-")
  22.  */
  23. class UsersController extends AbstractController
  24. {
  25.     public function __construct(ManagerRegistry $doctrine){
  26.         $this->doctrine =  $doctrine;
  27.     }
  28.     
  29.     private $doctrine;
  30.     
  31.     public function getDoctrine()
  32.     {
  33.         return $this->doctrine;
  34.     }
  35.     
  36.     /**
  37.      * @Route("/users/page/{offset}", name="admin-page")
  38.      * @Route("/users/", name="admin")
  39.      * @Route("/users/search/{keywords}/page/{offset}/",name="search-admin-page")
  40.      * @Route("/users/search/{keywords}/",name="search-admin")
  41.      *
  42.      * @Route("/users-disabled/page/{offset}", name="disabled-admin-page", defaults={"isEnabled"=0})
  43.      * @Route("/users-disabled/", name="disabled-admin", defaults={"isEnabled"=0})
  44.      * @Route("/users-disabled/search/{keywords}/page/{offset}/", name="disabled-search-admin-page"), defaults={"isEnabled"=0}
  45.      * @Route("/users-disabled/search/{keywords}/", name="disabled-search-admin", defaults={"isEnabled"=0})
  46.      *
  47.      * @Route("/users-enabled/page/{offset}", name="enabled-admin-page", defaults={"isEnabled"=1})
  48.      * @Route("/users-enabled/", name="enabled-admin", defaults={"isEnabled"=1})
  49.      * @Route("/users-enabled/search/{keywords}/page/{offset}/", name="enabled-search-admin-page"), defaults={"isEnabled"=1}
  50.      * @Route("/users-enabled/search/{keywords}/", name="v-search-admin", defaults={"isEnabled"=1})
  51.      */
  52.     public function admin(Request $request$keywords=null$offset=1$isEnabled null)
  53.     {
  54.         $em $this->getDoctrine()->getManager();
  55.         $offset--;
  56.         $limit 20;
  57.         $of=$offset*$limit;
  58.         $list$em->getRepository(Users::class)->getAll($limit,$of,$isEnabled,$keywords?$keywords:null);
  59.         $count=$em->getRepository(Users::class)->getCount();
  60.         $ajax $request->isXmlHttpRequest();
  61.         $response $this->render('Admin\index.html.twig',[
  62.             'list'=>$list,
  63.             'ajax'=>$ajax,
  64.             'count'=>$count,
  65.             'offset'=>$offset,
  66.             "title"=>"Gestion des utilisateurs ",
  67.             "subtitle"=>"Utilisateurs ".($isEnabled 'activés' 'désactivés')
  68.         ]);
  69.         return $ajax ?
  70.             new Response(\json_encode([
  71.                 'content'=>$response->getContent(),
  72.                 "title"=>"Gestion des utilisateurs",
  73.                 "subtitle"=>"Liste de tous les utilisateurs".($isEnabled 'activés' 'désactivés')
  74.             ]))
  75.         : $response;
  76.     }
  77.     /**
  78.      * @Route("/users/add", name="new")
  79.      * @Route("/users/edit/{id}/", name="edit")
  80.      * @Route("/account/edit/", name="account-edit", defaults={"currentUser":true})
  81.      */
  82.     public function edit(Request $requestUsers $user null$currentUser false)
  83.     {
  84.         if($user === null){
  85.             $user $currentUser $this->getUser() : new Users;
  86.         }
  87.         $em $this->getDoctrine()->getManager();
  88.         $form $this->createForm(UsersType::class,$user);
  89.         $form->remove('password');
  90.         $form->remove('npassword');
  91.         if($currentUser)
  92.             $form->remove('profile');
  93.         $form->handleRequest($request);
  94.         if($form->isSubmitted() && $form->isValid()){
  95.             $em->persist($user);
  96.             $em->flush();
  97.             Common::trackChange($em$user$this->getUser(), 'edit''Modification '.($currentUser 'de' 'd\'un').' compte');
  98.             $this->addFlash("notice","Enregistrement effectué avec succès");
  99.             return $currentUser $this->redirectToRoute('users-account') : $this->redirectToRoute('users-admin');
  100.         }
  101.         $ajax $request->isXmlHttpRequest();
  102.         $response $this->render('Admin\edit.html.twig',[
  103.             'form'=>$form->createView(),
  104.             'ajax'=>$ajax,
  105.             'redirect'=> $currentUser $this->generateURL('users-account') : $this->generateURL('users-admin'),
  106.             'title'=> $currentUser 'Gestion de compte' 'Gestion des utilisateurs',
  107.             'subtitle'=> $currentUser 'Mise à jour d\'informations personnelles' 'Edition d\'un compte'
  108.         ]);
  109.         return $ajax ?
  110.             new Response(\json_encode([
  111.                 'content'=>$response->getContent(),
  112.                 'title'=> $currentUser 'Gestion de compte' 'Gestion des utilisateurs',
  113.                 'subtitle'=> $currentUser 'Mise à jour d\'informations personnelles' 'Edition d\'un compte'
  114.             ]))
  115.         : $response;
  116.     }
  117.     /**
  118.      * @Route("/account/password-edit/", name="password-edit")
  119.      */
  120.     public function passwordEdit(Request $request)
  121.     {
  122.         $em $this->getDoctrine()->getManager();
  123.         if($this->getUser())
  124.             $user $this->getUser();
  125.         $form $this->createForm(UsersType::class,$user);
  126.         $form->remove('fName');
  127.         $form->remove('lName');
  128.         $form->remove('phone');
  129.         $form->remove('sex');
  130.         $form->remove('profile');
  131.         $form->handleRequest($request);
  132.         if($form->isSubmitted() && $form->isValid()){
  133.             if(password_verify($form->get('password')->getData(),$user->getPassword())){
  134.                 if($form->get('npassword')->get('first')->getData()==$form->get('npassword')->get('second')->getData())
  135.                     $user->setPassword($form->get('npassword')->get('first')->getData());
  136.                 $em->persist($user);
  137.                 $em->flush();
  138.                 Common::trackChange($em$user$this->getUser(), 'password'"Changement de mot de passe");
  139.                 $this->addFlash("notice","Enregistrement effectué avec succès.");
  140.             }
  141.             else
  142.                 $this->addFlash("error","Le mot de passe saisi n'est pas correct.");
  143.         }
  144.         $ajax $request->isXmlHttpRequest();
  145.         $response $this->render('Users\password.html.twig',[
  146.             'form'=>$form->createView(),
  147.             'ajax'=>$ajax,
  148.             'title'=>'Gestion de compte',
  149.             'subtitle'=>'Mise à jour de mot de passe'
  150.         ]);
  151.         return $ajax ?
  152.             new Response(\json_encode([
  153.                 'content'=>$response->getContent(),
  154.                 'title'=>'Gestion de compte',
  155.                 'subtitle'=>'Mise à jour de mot de passe'
  156.             ]))
  157.         : $response;
  158.     }
  159.     /**
  160.      * @Route("/users/enabled/{id}/", name="enable")
  161.      */
  162.     public function enable(Request $requestMailerInterface $mailerUsers $user)
  163.     {
  164.         $em $this->getDoctrine()->getManager();
  165.         if($user->getIsEnabled()){
  166.             $user->setIsEnabled(false);
  167.             $user->setPassword(null);
  168.         }
  169.         else{
  170.             $user->setIsEnabled(true);
  171.             if(!$user->getPassword()){
  172.                 $user->setToken(Common::generateToken());
  173.                 $email = (new TemplatedEmail())
  174.                     ->from('noreply@olasoft.net')
  175.                     ->to($user->getEmail())
  176.                     ->replyTo('technique@olasoft.net')
  177.                     ->priority(Email::PRIORITY_HIGH)
  178.                     ->subject('OS Admin > Activation de votre compte')
  179.                     ->htmlTemplate('Users/first-connexion.html.twig')
  180.                     ->context([
  181.                         'user' => $user,
  182.                     ]);
  183.                 $mailer->send($email);
  184.             }
  185.         }
  186.         $em->persist($user);
  187.         $em->flush();
  188.         Common::trackChange($em$user$this->getUser(), 'edit'"Activation / Désactivation d'un compte utilisateur");
  189.         $ajax $request->isXmlHttpRequest();
  190.         if(!$ajax)
  191.             $this->addFlash('notice','Activation / Désactivation effectuée avec succès.');
  192.         return $ajax
  193.             ? new Response(\json_encode(['status'=>$user->getIsEnabled(), 'notice'=>'Activation / Désactivation effectuée avec succès.']))
  194.             : $this->redirectToRoute('users-admin');
  195.     }
  196.     /**
  197.      * @Route("/users/reset/{id}/", name="reset")
  198.      * @Route("/reset-password/", name="reset-password")
  199.      */
  200.     public function reset(Request $requestMailerInterface $mailerUsers $user null)
  201.     {
  202.         $em $this->getDoctrine()->getManager();
  203.         $isAdmin true;
  204.         if($user === null && $request->getMethod() == 'POST'){
  205.             $email $request->request->get('_username');
  206.             $user $em->getRepository(Users::class)->findOneByEmail($email);
  207.             $isAdmin false;
  208.         }
  209.         if ($user){
  210.             $user->setToken(Common::generateToken());
  211.             $user->setPassword(null);
  212.             $email = (new TemplatedEmail())
  213.                 ->from('noreply@olasoft.net')
  214.                 ->to($user->getEmail())
  215.                 ->replyTo('technique@olasoft.net')
  216.                 ->priority(Email::PRIORITY_HIGH)
  217.                 ->subject('OS Admin > Réinitialisation de votre compte')
  218.                 ->htmlTemplate('Users/first-connexion.html.twig')
  219.                 ->context([
  220.                     'user' => $user,
  221.                 ]);
  222.             $mailer->send($email);
  223.             $em->persist($user);
  224.             $em->flush();
  225.             Common::trackChange($em$user$isAdmin $this->getUser() : $user'reset'"Réinitialisation d'un compte utilisateur");
  226.             $this->addFlash('notice''Demande de réinitialisation effectuée avec succès.'.($isAdmin '' '\nVeuillez consulter votre boîte e-mail.'));
  227.             return $this->redirectToRoute($isAdmin 'users-admin' 'login');
  228.         }
  229.         else
  230.             return $this->redirectToRoute($isAdmin 'users-admin' 'forgot-password');
  231.     }
  232.     /**
  233.      * @Route("/first-login/{token}/{email}/", name="first-login")
  234.      */
  235.     public function fLogin(Request $request$token,$email)
  236.     {
  237.         if($this->getUser())
  238.             return $this->redirectToRoute('admin-home');
  239.         $em $this->getDoctrine()->getManager();
  240.         $user $em->getRepository(Users::class)->findOneBy(['email'=>$email,'token'=>$token]);
  241.         if($request->getMethod() == 'POST'){
  242.             if($user){
  243.                 $pwd $request->request->get('new-password');
  244.                 $cpwd $request->request->get('confirmed-password');
  245.                 if($pwd == $cpwd){
  246.                     $user->setPassword($pwd);
  247.                     $user->setToken(null);
  248.                     $em->persist($user);
  249.                     $em->flush();
  250.                     Common::trackChange($em$user$user'password'"Changement de mot de passe");
  251.                     $this->addFlash('notice''Changement de mot de passe effectué avec succès. Vous pouvez maintenant vous connecter.');
  252.                     return $this->redirectToRoute('login');
  253.                 }
  254.                 else
  255.                     $this->addFlash('error''Les deux mots de passe ne sont pas conformes. Veuillez réessayer svp.');
  256.             }
  257.             else
  258.                 $this->addFlash('error''Votre identifiant n\'est pas valide et / ou votre token a expiré. ');
  259.         }
  260.         return $this->render('Admin/login.html.twig', array(
  261.             'token' => $token,'email' => $email,'type' => 'flogin'
  262.         ));
  263.     }
  264.     /**
  265.      * @Route("/users/view/{id}/", name="view")
  266.      * @Route("/account/", name="account")
  267.      */
  268.     public function user(Request $requestUsers $item null)
  269.     {
  270.         if (!$item$item $this->getUser();
  271.         $ajax $request->isXmlHttpRequest();
  272.         $response $this->render('Users\view.html.twig',[
  273.             'item' => $item,
  274.             'ajax'=>$ajax,
  275.             'title'=>'Gestion de compte',
  276.             'subtitle'=>'Mon profil utilisateur'
  277.         ]);
  278.         return $ajax ?
  279.             new Response(\json_encode([
  280.                 'content'=>$response->getContent(),
  281.                 'title'=>'Profil | '.$item->getLName().' '.$item->getFName(),
  282.                 'subtitle'=>null
  283.             ]))
  284.             : $response;
  285.     }
  286.     /**
  287.      * @Route("/dashbord/", name="my-dashbord")
  288.      * @Route("/dashbord/page/{offset}/", name="my-dashbord-page")
  289.      * @Route("/dashbord/search/{offset}/", name="my-dashbord-search")
  290.      * @Route("/users/dashbord/{id}/", name="dashbord")
  291.      * @Route("/users/dashbord/{id}/page/{offset}/", name="dashbord-page")
  292.      * @Route("/users/dashbord/{id}/search/{offset}/", name="dashbord-search")
  293.      * @Route("/users/activities/", name="dashbords", defaults={"isOneUser":false})
  294.      * @Route("/users/activities/page/{offset}/", name="dashbords-page", defaults={"isOneUser":false})
  295.      * @Route("/users/activities/search/{keywords}/", name="dashbords-search", defaults={"isOneUser":false})
  296.      */
  297.     public function activities(Request $requestUsers $user null$offset 1$isOneUser true$keywords null)
  298.     {
  299.         $offset--;
  300.         $limit 100;
  301.         $of=$offset*$limit;
  302.         $user $user ?? $this->getUser();
  303.         $em $this->getDoctrine()->getManager();
  304.         $list$em->getRepository(UsersActivities::class)->getAll($limit$of$user $user->getId() : null$keywords);
  305.         $count=$em->getRepository(UsersActivities::class)->getCount();
  306.         $ajax $request->isXmlHttpRequest();
  307.         $response $this->render('Admin\index.html.twig',[
  308.             'list'=>$list,
  309.             'view'=>'Users\dashbord.html.twig',
  310.             'isOneUser'=>$isOneUser,
  311.             'ajax'=>$ajax,
  312.             'count'=>$count,
  313.             'noAddBtn'=>true,
  314.             'table_limit'=>$limit,
  315.             'offset'=>$of,
  316.             'params'=>['id'=>$user $user->getId() : null],
  317.             'title'=>'Tableau de bord',
  318.             'subtitle'=> $user $user->getFName().' '.$user->getLName() : 'Mes dernières actions'
  319.         ]);
  320.         return $ajax ?
  321.             new Response(\json_encode([
  322.                 'content'=>$response->getContent(),
  323.                 'title'=>'Tableau de bord',
  324.                 'subtitle'=> $user $user->getFName().' '.$user->getLName() : 'Mes dernières actions'
  325.             ]))
  326.         : $response;
  327.     }
  328. }