<?php
namespace App\Controller;
use Symfony\Bundle\FrameworkBundle\Controller\AbstractController;
use Symfony\Component\Routing\Annotation\Route;
use Symfony\Component\Routing\Annotation\ParamConverter;
use Symfony\Component\HttpFoundation\Response;
use Symfony\Component\HttpFoundation\RedirectResponse;
use Symfony\Component\HttpFoundation\Cookie;
use Symfony\Component\HttpFoundation\Request;
use Symfony\Component\Security\Core\Authentication\Token\UsernamePasswordToken;
use Symfony\Component\Mailer\MailerInterface;
use Symfony\Bridge\Twig\Mime\TemplatedEmail;
use Symfony\Component\Mime\Email;
use OlaSoft\Common;
use App\Entity\Users;
use App\Entity\Profiles;
use App\Entity\UsersActivities;
use App\Form\UsersType;
/**
* @Route("/os-admin", name="users-")
*/
class UsersController extends AbstractController
{
/**
* @Route("/users/page/{offset}", name="admin-page")
* @Route("/users/", name="admin")
* @Route("/users/search/{keywords}/page/{offset}/",name="search-admin-page")
* @Route("/users/search/{keywords}/",name="search-admin")
*
* @Route("/users-disabled/page/{offset}", name="disabled-admin-page", defaults={"isEnabled"=0})
* @Route("/users-disabled/", name="disabled-admin", defaults={"isEnabled"=0})
* @Route("/users-disabled/search/{keywords}/page/{offset}/", name="disabled-search-admin-page"), defaults={"isEnabled"=0}
* @Route("/users-disabled/search/{keywords}/", name="disabled-search-admin", defaults={"isEnabled"=0})
*
* @Route("/users-enabled/page/{offset}", name="enabled-admin-page", defaults={"isEnabled"=1})
* @Route("/users-enabled/", name="enabled-admin", defaults={"isEnabled"=1})
* @Route("/users-enabled/search/{keywords}/page/{offset}/", name="enabled-search-admin-page"), defaults={"isEnabled"=1}
* @Route("/users-enabled/search/{keywords}/", name="v-search-admin", defaults={"isEnabled"=1})
*/
public function admin($keywords=null, $offset=1, $isEnabled = null)
{
$em = $this->getDoctrine()->getManager();
$request = $this->get('request_stack')->getCurrentRequest();
$offset--;
$limit = 20;
$of=$offset*$limit;
$list= $em->getRepository(Users::class)->getAll($limit,$of,$isEnabled,$keywords?$keywords:null);
$count=$em->getRepository(Users::class)->getCount();
$ajax = $request->isXmlHttpRequest();
$response = $this->render('Admin\index.html.twig',[
'list'=>$list,
'ajax'=>$ajax,
'count'=>$count,
'offset'=>$offset,
"title"=>"Gestion des utilisateurs ",
"subtitle"=>"Utilisateurs ".($isEnabled ? 'activés' : 'désactivés')
]);
return $ajax ?
new Response(\json_encode([
'content'=>$response->getContent(),
"title"=>"Gestion des utilisateurs",
"subtitle"=>"Liste de tous les utilisateurs".($isEnabled ? 'activés' : 'désactivés')
]))
: $response;
}
/**
* @Route("/users/add", name="new")
* @Route("/users/edit/{id}/", name="edit")
* @Route("/account/edit/", name="account-edit", defaults={"currentUser":true})
*/
public function edit(Users $user = null, $currentUser = false)
{
if($user === null){
$user = $currentUser ? $this->getUser() : new Users;
}
$request = $this->get('request_stack')->getCurrentRequest();
$em = $this->getDoctrine()->getManager();
$form = $this->createForm(UsersType::class,$user);
$form->remove('password');
$form->remove('npassword');
if($currentUser)
$form->remove('profile');
$form->handleRequest($request);
if($form->isSubmitted() && $form->isValid()){
$em->persist($user);
$em->flush();
Common::trackChange(new UsersActivities, $em, $user, $this->getUser(), 'edit', 'Modification '.($currentUser ? 'de' : 'd\'un').' compte');
$this->addFlash("notice","Enregistrement effectué avec succès");
return $currentUser ? $this->redirectToRoute('users-account') : $this->redirectToRoute('users-admin');
}
$ajax = $request->isXmlHttpRequest();
$response = $this->render('Admin\edit.html.twig',[
'form'=>$form->createView(),
'ajax'=>$ajax,
'redirect'=> $currentUser ? $this->generateURL('users-account') : $this->generateURL('users-admin'),
'title'=> $currentUser ? 'Gestion de compte' : 'Gestion des utilisateurs',
'subtitle'=> $currentUser ? 'Mise à jour d\'informations personnelles' : 'Edition d\'un compte'
]);
return $ajax ?
new Response(\json_encode([
'content'=>$response->getContent(),
'title'=> $currentUser ? 'Gestion de compte' : 'Gestion des utilisateurs',
'subtitle'=> $currentUser ? 'Mise à jour d\'informations personnelles' : 'Edition d\'un compte'
]))
: $response;
}
/**
* @Route("/account/password-edit/", name="password-edit")
*/
public function passwordEdit()
{
$request = $this->get('request_stack')->getCurrentRequest();
$em = $this->getDoctrine()->getManager();
if($this->getUser())
$user = $this->getUser();
$form = $this->createForm(UsersType::class,$user);
$form->remove('fName');
$form->remove('lName');
$form->remove('phone');
$form->remove('sex');
$form->remove('profile');
$form->handleRequest($request);
if($form->isSubmitted()){
if($form->isValid()){
if(password_verify($form->get('password')->getData(),$user->getPassword())){
if($form->get('npassword')->get('first')->getData()==$form->get('npassword')->get('second')->getData())
$user->setPassword($form->get('npassword')->get('first')->getData());
$em->persist($user);
$em->flush();
$this->addFlash("notice","Enregistrement effectué avec succès.");
}
else
$this->addFlash("error","Le mot de passe saisi n'est pas correct.");
}
else{
foreach ($form->getErrors(true) as $error)
$this->addFlash("error",$error->getMessage());
}
}
$ajax = $request->isXmlHttpRequest();
$response = $this->render('Users\password.html.twig',[
'form'=>$form->createView(),
'ajax'=>$ajax,
'title'=>'Gestion de compte',
'subtitle'=>'Mise à jour de mot de passe'
]);
return $ajax ?
new Response(\json_encode([
'content'=>$response->getContent(),
'title'=>'Gestion de compte',
'subtitle'=>'Mise à jour de mot de passe'
]))
: $response;
}
/**
* @Route("/users/enabled/{id}/", name="enable")
*/
public function enable(MailerInterface $mailer, Users $user)
{
$request = $this->get('request_stack')->getCurrentRequest();
$em = $this->getDoctrine()->getManager();
if($user->getIsEnabled()){
$user->setIsEnabled(false);
$user->setPassword(null);
}
else{
$user->setIsEnabled(true);
if(!$user->getPassword()){
$user->setToken(Common::generateToken());
$email = (new TemplatedEmail())
->from('noreply@olasoft.net')
->to($user->getEmail())
//->cc('cc@example.com')
//->bcc('bcc@example.com')
->replyTo('technique@olasoft.net')
->priority(Email::PRIORITY_HIGH)
->subject('OS Admin > Activation de votre compte')
->htmlTemplate('Users/first-connexion.html.twig')
->context([
'user' => $user,
]);
$mailer->send($email);
}
}
$em->persist($user);
$em->flush();
$ajax = $request->isXmlHttpRequest();
if(!$ajax)
$this->addFlash('notice','Activation / Désactivation effctuée avec succès.');
return $ajax
? new Response(\json_encode(['status'=>$user->getIsEnabled(), 'notice'=>'Activation / Désactivation effectuée avec succès.']))
: $this->redirectToRoute('users-admin');
}
/**
* @Route("/users/reset/{id}/", name="reset")
* @Route("/reset-password/", name="reset-password")
*/
public function reset(MailerInterface $mailer, Users $user = null)
{
$request = $this->get('request_stack')->getCurrentRequest();
$em = $this->getDoctrine()->getManager();
$isAdmin = true;
if($user === null)
if($request->getMethod() == 'POST'){
$email = $request->request->get('_username');
$user = $em->getRepository(Users::class)->findOneByEmail($email);
$isAdmin = false;
}
if ($user){
$user->setToken(Common::generateToken());
$user->setPassword(null);
$email = (new TemplatedEmail())
->from('noreply@olasoft.net')
->to($user->getEmail())
//->cc('cc@example.com')
//->bcc('bcc@example.com')
->replyTo('technique@olasoft.net')
->priority(Email::PRIORITY_HIGH)
->subject('OS Admin > Réinitialisation de votre compte')
->htmlTemplate('Users/first-connexion.html.twig')
->context([
'user' => $user,
]);
$mailer->send($email);
$em->persist($user);
$em->flush();
$this->addFlash('notice', 'Demande de réinitialisation effectuée avec succès.'.($isAdmin ? '' : '\nVeuillez consulter votre boîte e-mail.'));
return $this->redirectToRoute($isAdmin ? 'users-admin' : 'login');
}
else
return $this->redirectToRoute($isAdmin ? 'users-admin' : 'forgot-password');
}
/**
* @Route("/first-login/{token}/{email}/", name="first-login")
*/
public function fLogin($token,$email)
{
if($this->getUser())
return $this->redirectToRoute('os-admin-home');
$request = $this->get('request_stack')->getCurrentRequest();
$em = $this->getDoctrine()->getManager();
$user = $em->getRepository(Users::class)->findOneBy(['email'=>$email,'token'=>$token]);
if($request->getMethod() == 'POST'){
if($user){
$pwd = $request->request->get('new-password');
$cpwd = $request->request->get('confirmed-password');
if($pwd == $cpwd){
$user->setPassword($pwd);
$user->setToken(null);
$em->persist($user);
$em->flush();
$this->addFlash('notice', 'Changement de mot de passe effectué avec succès. Vous pouvez maintenant vous connecter.');
return $this->redirectToRoute('login');
}
else
$this->addFlash('error', 'Les deux mots de passe ne sont pas conformes. Veuillez réessayer svp.');
}
else
$this->addFlash('error', 'Votre identifiant n\'est pas valide et / ou votre token a expiré. ');
}
return $this->render('Admin/login.html.twig', array(
'token' => $token,'email' => $email,'type' => 'flogin'
));
}
/**
* @Route("/users/view/{id}/", name="view")
* @Route("/account/", name="account")
*/
public function user(Users $item = null)
{
if (!$item) $item = $this->getUser();
$request = $this->get('request_stack')->getCurrentRequest();
$ajax = $request->isXmlHttpRequest();
$response = $this->render('Users\view.html.twig',[
'item' => $item,
'ajax'=>$ajax,
'title'=>'Gestion de compte',
'subtitle'=>'Mon profil utilisateur'
]);
return $ajax ?
new Response(\json_encode([
'content'=>$response->getContent(),
'title'=>'Profil | '.$item->getLName().' '.$item->getFName(),
'subtitle'=>null
]))
: $response;
}
/**
* @Route("/dashbord/", name="my-dashbord")
* @Route("/dashbord/page/{offset}/", name="my-dashbord-page")
* @Route("/dashbord/search/{offset}/", name="my-dashbord-search")
* @Route("/users/dashbord/{id}/", name="dashbord")
* @Route("/users/dashbord/{id}/page/{offset}/", name="dashbord-page")
* @Route("/users/dashbord/{id}/search/{offset}/", name="dashbord-search")
* @Route("/users/activities/", name="dashbords", defaults={"isOneUser":false})
* @Route("/users/activities/page/{offset}/", name="dashbords-page", defaults={"isOneUser":false})
* @Route("/users/activities/search/{keywords}/", name="dashbords-search", defaults={"isOneUser":false})
*/
public function activities(Users $user = null, $offset = 1, $isOneUser = true, $keywords = null)
{
$request = $this->get('request_stack')->getCurrentRequest();
$offset--;
$limit = 100;
$of=$offset*$limit;
$user = $user ?? $this->getUser();
$em = $this->getDoctrine()->getManager();
$list= $em->getRepository(UsersActivities::class)->getAll($limit, $of, $user->getId(), $keywords);
$count=$em->getRepository(UsersActivities::class)->getCount();
$ajax = $request->isXmlHttpRequest();
$response = $this->render('Admin\index.html.twig',[
'list'=>$list,
'view'=>'Users\dashbord.html.twig',
'isOneUser'=>$isOneUser,
'ajax'=>$ajax,
'count'=>$count,
'noAddBtn'=>true,
'table_limit'=>$limit,
'offset'=>$of,
'params'=>['id'=>$user->getId()],
'title'=>'Tableau de bord',
'subtitle'=> $user ? $user->getFName().' '.$user->getLName() : 'Mes dernières actions'
]);
return $ajax ?
new Response(\json_encode([
'content'=>$response->getContent(),
'title'=>'Tableau de bord',
'subtitle'=> $user ? $user->getFName().' '.$user->getLName() : 'Mes dernières actions'
]))
: $response;
}
}