<?php
namespace App\Controller;
use App\Entity\RequestPassword;
use App\Entity\User;
use App\Form\ForgetPasswordType;
use App\Form\NewRegistrationType;
use App\Form\PasswordUserType;
use App\Form\RegistrationType;
use Doctrine\ORM\EntityManagerInterface;
use Doctrine\Persistence\ManagerRegistry;
use Symfony\Bundle\FrameworkBundle\Controller\AbstractController;
use Symfony\Component\HttpFoundation\Request;
use Symfony\Component\HttpFoundation\Response;
use Symfony\Component\Routing\Annotation\Route;
use Symfony\Component\Security\Core\Encoder\UserPasswordEncoderInterface;
use Symfony\Component\Security\Http\Authentication\AuthenticationUtils;
class UserController extends AbstractController
{
/**
* @var EntityManagerInterface
*/
protected $manager;
/**
* AdminController constructor.
*
* @param EntityManagerInterface $manager
*/
public function __construct(EntityManagerInterface $manager)
{
$this->manager = $manager;
}
/**
* @Route("/user/new", name="user_create")
* @Route("/user/{id}/edit", name="user_edit")
*/
public function form(User $user = null, Request $request, UserPasswordEncoderInterface $encoder)
{
if(!$user){
$user = new User();
}
$form = $this->createForm(RegistrationType::class, $user, ['userConnected'=>$this->getUser()]);
$form->handleRequest($request);
if($form->isSubmitted() && $form->isValid()){
if ($user->getId() === null ){
$hash = $encoder->encodePassword($user, $user->getPassword());
$user->setPassword($hash)
->addRole($request->request->get('registration')["roles"]);
$request->getSession()->getFlashBag()->add('info', 'Ajout utilisateur réalisé avec succès.');
}else{
$request->getSession()->getFlashBag()->add('info', 'Modifications utilisateur réalisées avec succès.');
}
$this->manager->persist($user);
$this->manager->flush();
return $this->redirectToRoute("user_edit", ['id'=>$user->getId()]);
}
return $this->render('user/registration.html.twig', [
'form' => $form->createView(),
'typeForm' => $user->getId()
]);
}
/**
* @Route("/user/new-society", name="society_create")
*/
public function newSocietyAction(Request $request, UserPasswordEncoderInterface $encoder)
{
$user = new User();
$form = $this->createForm(RegistrationType::class, $user, ['userConnected'=>$this->getUser(), 'typeForm' => 'new_society']);
$form->handleRequest($request);
if($form->isSubmitted() && $form->isValid()){
$hash = $encoder->encodePassword($user, $user->getPassword());
$user->setPassword($hash)
->addRole('ROLE_USER');
$request->getSession()->getFlashBag()->add('info', 'Ajout société réalisé avec succès.');
$this->manager->persist($user);
$this->manager->flush();
return $this->redirectToRoute("user_edit", ['id'=>$user->getId()]);
}
return $this->render('user/registration.html.twig', [
'form' => $form->createView(),
'typeForm' => $user->getId(),
'formSociety' => true
]);
}
/**
* @Route("/user/{id}/new_password", name="user_new_password")
*/
public function formPassword(User $user = null, Request $request, UserPasswordEncoderInterface $encoder)
{
if(!$user){
$user = new User();
}
$form = $this->createForm(PasswordUserType::class, $user);
$form->handleRequest($request);
if($form->isSubmitted() &&$form->isValid()){
$hash = $encoder->encodePassword($user, $user->getPassword());
$user->setPassword($hash);
$this->manager->persist($user);
$this->manager->flush();
$request->getSession()->getFlashBag()->add('info', 'Modification mot de passe réalisée avec succès.');
return $this->redirectToRoute('user_new_password', ['id'=>$user->getId()]);
}
return $this->render('user/change-password.html.twig', [
'form' => $form->createView()
]);
}
/**
* @Route("/reset-password", name="user_reset_password")
*/
public function resetPassword(Request $request, UserPasswordEncoderInterface $encoder)
{
$repository = $this->getDoctrine()->getRepository(User::class);
if ($request->query->get('token') !==null){
$user = $repository->findOneByConfirmationToken($request->query->get('token'));
}
if ($request->request->get('token')!==null){
$user = $repository->findOneByConfirmationToken($request->request->get('token'));
}
if (!$user){
$request->getSession()->getFlashBag()->add('info', ['texte'=>'Le lien que vous utilisé n\'est pas valide', 'type'=>'danger']);
return $this->redirectToRoute('security_login');
}
$form = $this->createForm(PasswordUserType::class, $user);
$form->handleRequest($request);
if($form->isSubmitted() &&$form->isValid()){
$hash = $encoder->encodePassword($user, $user->getPassword());
$user->setPassword($hash);
$this->manager->persist($user);
$this->manager->flush();
$request->getSession()->getFlashBag()->add('info', ['texte'=>'Modification mot de passe réalisée avec succès. Vous pouvez désormais vous connecter', 'type'=>'success']);
return $this->redirectToRoute('security_login');
}
return $this->render('user/reset-password.html.twig', [
'form' => $form->createView()
]);
}
/**
* @Route("/login", name="security_login")
*/
public function login(Request $request, AuthenticationUtils $authenticationUtils){
// Formualaire de premiere connection
$user = new User();
$form = $this->createForm(NewRegistrationType::class, $user);
// get the login error if there is one
$error = $authenticationUtils->getLastAuthenticationError();
// last username entered by the user
$lastUsername = $authenticationUtils->getLastUsername();
return $this->render('user/login.html.twig', array(
'last_username' => $lastUsername,
'error' => $error,
'form' => $form->createView()
));
}
/**
* @Route("/forget-password", name="security_forget_password")
*/
public function forgetPassword(Request $request, \Swift_Mailer $mailer){
$rp = new RequestPassword();
$form = $this->createForm(ForgetPasswordType::class,$rp );
$form->handleRequest($request);
if($form->isSubmitted() &&$form->isValid()){
$repository = $this->getDoctrine()->getRepository(User::class);
$user = $repository->findOneByEmail($rp->getIdentifier());
if (!$user){
$request->getSession()->getFlashBag()->add('info', ["texte"=>"Mail non trouvée", "type"=>"danger"]);
return $this->redirectToRoute("security_forget_password");
}
$user->setConfirmationToken(hash("sha512", uniqid()));
$user->setIsAlreadyRequested(true);
$user->setDateRequestPassword(new \DateTime());
$this->manager->persist($user);
$this->manager->flush();
$message = (new \Swift_Message('Mot de passe oublié'))
->setFrom('postmaster@helpers-pro.com')
//->setTo(['joachim@cupani.fr', 'benoit@helpers-pro.com'])
->setTo($user->getEmail())
->setBody(
$this->renderView(
// templates/emails/registration.html.twig
'user/forget-password-email.html.twig',
array('name' => $user->getFullName(),'token' => $user->getConfirmationToken())
),
'text/html'
);
$mailer->send($message);
// return new Response('<html><body>OK</body></html>');
$request->getSession()->getFlashBag()->add('info', ["texte"=>"Mail envoyé", "type"=>"success"]);
return $this->redirectToRoute("security_forget_password");
}
return $this->render('user/forget-password.html.twig', [
'form' => $form->createView()
]);
}
/**
* @Route("/new-registration", name="security_new_registration")
*/
public function NewRegistration(Request $request, \Swift_Mailer $mailer, UserPasswordEncoderInterface $encoder){
$user = new User();
$form = $this->createForm(NewRegistrationType::class,$user );
$form->handleRequest($request);
if($form->isSubmitted() && $form->isValid()){
// generation du mot de passe
$password_plain = $this->generateRandomPassword();
$hash = $encoder->encodePassword($user, $password_plain);
$user->setPassword($hash);
// role
$user->addRole('ROLE_USER');
$this->manager->persist($user);
$this->manager->flush();
$message = (new \Swift_Message('Confirmation de création de votre compte'))
->setFrom('no-reply@helpers-pro.com')
//->setTo(['joachim@cupani.fr', 'benoit@helpers-pro.com'])
->setTo([$user->getEmail()])
->setBody(
$this->renderView(
// templates/emails/registration.html.twig
'user/new-registration-email.html.twig',
array('name' => $user->getFullName(),'password' => $password_plain)
),
'text/html'
);
$mailer->send($message);
$request->getSession()->getFlashBag()->add('info', ["texte"=>"Votre inscription a bien été prise en compte. Votre mot de passe vous as été transmis par mail.", "type"=>"success"]);
}else{
$request->getSession()->getFlashBag()->add('info', ["texte"=>"Une erreur est survenue lors de l'enregistrement", "type"=>"danger"]);
}
return $this->redirectToRoute("security_login");
}
/**
* @Route("/", name="dashboard")
*/
public function dashboard(){
if(in_array('ROLE_SUPER_ADMIN', $this->getUser()->getRoles())){
return $this->redirectToRoute("user_admin_liste", ['role'=>'members']);
}elseif(in_array('ROLE_ADMIN', $this->getUser()->getRoles())) {
return $this->redirectToRoute("user_admin_liste", ['role'=>'members']);
}elseif(in_array('ROLE_USER', $this->getUser()->getRoles())) {
return $this->redirectToRoute("members", ['user'=>$this->getUser()->getToken()]);
}else{
return $this->render('user/index.html.twig');
}
}
/**
* @Route("/logout", name="security_logout")
*/
public function logout(){}
/**
* @Route("/user/{role}/liste", name="user_admin_liste", requirements={
* "role"="admin|members"
* })
*/
public function listeAdmin($role)
{
// get all access
$repository = $this->getDoctrine()->getRepository(User::class);
if($role == "admin"){
$users = $repository->findByRole('ROLE_ADMIN');
}else{
if(in_array('ROLE_ADMIN', $this->getUser()->getRoles())){
$users = $repository->findByRole('ROLE_USER', $this->getUser()->getCategoryUser());
}else{
$users = $repository->findByRole('ROLE_USER');
}
}
return $this->render(
'user/liste.html.twig',
array('users' => $users)
);
}
/**
* @Route("/user/{role}/delete/{user}", name="user_delete", requirements={
* "role"="admin|members"
* })
*/
public function delete(User $user = null, $role)
{
if(!$user){
throw $this->createNotFoundException('User does not exist');
}
$this->manager->remove($user);
$this->manager->flush();
return $this->redirectToRoute("user_admin_liste", ['role'=>$role]);
}
private function generateRandomPassword() {
return substr( str_shuffle( 'abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789' ), 0, 12 );
}
}