<?php
namespace App\Controller;
use App\Entity\DataStatus;
use App\Entity\Patient;
use Symfony\Bundle\FrameworkBundle\Controller\AbstractController;
use Symfony\Component\HttpFoundation\Response;
use Symfony\Component\HttpFoundation\Request;
use Symfony\Component\Routing\Annotation\Route;
use Symfony\Component\Security\Http\Authentication\AuthenticationUtils;
use Symfony\Component\Routing\Generator\UrlGeneratorInterface;
use Symfony\Component\Routing\RouterInterface;
use Symfony\Component\Routing\Exception\RouteNotFoundException;
use Doctrine\Persistence\ManagerRegistry;
use Symfony\Component\HttpFoundation\RequestStack;
use Symfony\Component\Mailer\MailerInterface;
use Symfony\Component\Mime\Email;
use Symfony\Component\Mime\Address;
use Symfony\Component\PasswordHasher\Hasher\UserPasswordHasherInterface;
use App\Service\Tool;
use App\Entity\User;
use App\Form\ProfileType;
use App\Form\UserType;
use App\Service\FileUploader;
use Symfony\Component\EventDispatcher\EventDispatcher;
use Symfony\Component\EventDispatcher\EventDispatcherInterface;
use Symfony\Component\HttpFoundation\JsonResponse;
use Symfony\Component\Security\Core\Authentication\Token\UsernamePasswordToken;
use Symfony\Component\Security\Http\Event\InteractiveLoginEvent;
class SecurityController extends AbstractController
{
private $requestStack;
private $doctrine;
public function __construct(ManagerRegistry $doctrine, RequestStack $requestStack)
{
$this->doctrine = $doctrine;
$this->requestStack = $requestStack;
}
/**
* @Route("/connexion", name="app_login")
*/
public function index(AuthenticationUtils $authenticationUtils): Response
{
if ($this->getUser()) {
return $this->redirectToRoute('dashboard_index');
}
$error = $authenticationUtils->getLastAuthenticationError();
$lastUsername = $authenticationUtils->getLastUsername();
return $this->render('security/login.html.twig', ['last_username' => $lastUsername, 'error' => $error]);
}
/**
* @Route("/check-user", name="app_check_user")
*/
public function checkUser(Request $request): Response
{
$em = $this->doctrine->getManager();
$checkUser = $em->getRepository(User::class)->findOneBy([
'email' => $request->get('email')
]);
if ($checkUser) {
return new JsonResponse([
'error' => true
]);
}
return new JsonResponse([
'success' => true
]);
}
/**
* @Route("/inscription", name="app_register")
*/
public function register(Request $request, AuthenticationUtils $authenticationUtils, FileUploader $fileUploader, UserPasswordHasherInterface $passwordEncoder, MailerInterface $mailer): Response
{
if ($this->getUser()) {
return $this->redirectToRoute('dashboard_index');
}
$error = $authenticationUtils->getLastAuthenticationError();
$lastUsername = $authenticationUtils->getLastUsername();
$em = $this->doctrine->getManager();
$form = $this->createForm(UserType::class, new User(), ["password" => true, "is_register" => true]);
$form->handleRequest($request);
if ($form->isSubmitted() && $form->isValid()) {
$session = $this->requestStack->getSession();
$checkUser = $em->getRepository(User::class)->findOneBy([
'email' => $form['email']->getData()
]);
if ($checkUser != null) {
$session->getFlashBag()->add('error', "L'adresse e-mail indiquée est déjà utilisée.");
return $this->redirect($request->getUri());
}
$user = $form->getData();
$user->setIsActive(true);
$user->setIsOptin(false);
$user->setOptinContact(false);
$user->setOptinConsentement(false);
$user->setIsDarkmode(false);
$user->setToken("");
$user->setCreatedAt(new \DateTimeImmutable());
$user->setStatus($em->getRepository(DataStatus::class)->findOneBy(["slug" => "en_attente"]));
$user->setRoles(["ROLE_CUSTOMER"]);
if ($form['password']->getData()) {
$user->setPassword($passwordEncoder->hashPassword(
$user,
$form['password']->getData()
));
}
$logo = $form->get('logo')->getData();
$dir = $this->getParameter('kernel.project_dir') . '/public/uploads/logos/';
if (!is_dir($this->getParameter('kernel.project_dir') . '/public/uploads/logos/')) {
mkdir($this->getParameter('kernel.project_dir') . '/public/uploads/logos/', 0755, true);
}
if ($logo) {
$fileName = $fileUploader->upload($logo, $dir, $logo->guessExtension());
$user->setLogo($fileName);
}
$fileDiplome = $form->get('diplome_copy')->getData();
$dir = $this->getParameter('kernel.project_dir') . '/public/uploads/diplomes/';
if (!is_dir($this->getParameter('kernel.project_dir') . '/public/uploads/diplomes/')) {
mkdir($this->getParameter('kernel.project_dir') . '/public/uploads/diplomes/', 0755, true);
}
if ($fileDiplome) {
$fileName = $fileUploader->upload($fileDiplome, $dir, $fileDiplome->guessExtension());
$user->setDiplomeCopy($fileName);
}
$fileAdeli = $form->get('adeli_certif')->getData();
$dir = $this->getParameter('kernel.project_dir') . '/public/uploads/adeli/';
if (!is_dir($this->getParameter('kernel.project_dir') . '/public/uploads/adeli/')) {
mkdir($this->getParameter('kernel.project_dir') . '/public/uploads/adeli/', 0755, true);
}
if ($fileAdeli) {
$fileName = $fileUploader->upload($fileAdeli, $dir, $fileAdeli->guessExtension());
$user->setAdeliCertif($fileName);
}
$file = $form->get('signature')->getData();
$dir = $this->getParameter('kernel.project_dir') . '/public/uploads/signatures/';
if(!is_dir($this->getParameter('kernel.project_dir') . '/public/uploads/signatures/')){
mkdir($this->getParameter('kernel.project_dir') . '/public/uploads/signatures/',0755, true);
}
if ($file) {
$fileName = $fileUploader->upload($file, $dir, $file->guessExtension());
$user->setSignature($fileName);
}
// $user->setRegisterToken(uniqid());
// $url = $this->generateUrl('security_confirm_register', ['email' => $user->getEmail(), 'token' => $user->getRegisterToken()], UrlGeneratorInterface::ABSOLUTE_URL);
// $mail = (new Email())
// ->subject('Bienvenue sur Profil-diet ! Veuillez activer votre compte')
// ->from(new Address($_ENV['MAILER_ADDRESS'], $_ENV['MAILER_NAME']))
// ->to($user->getEmail())
// ->html($this->renderView('email/validation.html.twig', array('user' => $user, "link" => $url)));
// $mailer->send($mail);
$mail = (new Email())
->subject('Bienvenue chez Profil-diet !')
->from(new Address($_ENV['MAILER_ADDRESS'], $_ENV['MAILER_NAME']))
->to($user->getEmail())
->html($this->renderView('email/en_attente_validation.html.twig', array('user' => $user)));
$mailer->send($mail);
$admins = $em->getRepository(User::class)->findByRole("ROLE_ADMIN");
$adminEmails = [];
foreach($admins as $a) {
$adminEmails[] = $a->getEmail();
}
$checkUrl = $this->generateUrl('user_index', [], UrlGeneratorInterface::ABSOLUTE_URL);
$mail = (new Email())
->subject('PROFIL- DIET : une nouvelle demande d\'essai gratuit vous attend !')
->from(new Address($_ENV['MAILER_ADDRESS'], $_ENV['MAILER_NAME']))
->to(...$adminEmails)
->html($this->renderView('email/nouveau_client.html.twig', array('patient' => $user, 'url' => $checkUrl)));
$mailer->send($mail);
$em = $this->doctrine->getManager();
$em->persist($user);
$em->flush();
$session->getFlashBag()->add('success', "Merci pour votre inscription, un administrateur va vérifier les données saisies avant d’activer le compte, vous recevrez une confirmation par e-mail");
return $this->redirectToRoute('app_login');
}
return $this->render('security/register.html.twig', ['form' => $form->createView(), 'last_username' => $lastUsername, 'error' => $error]);
}
/**
* @Route("/confirmation-inscription", name="security_confirm_register")
*/
public function confirmRegister(Request $request, Tool $tool, UrlGeneratorInterface $router, MailerInterface $mailer)
{
$em = $this->doctrine->getManager();
$session = $this->requestStack->getSession();
$email = $request->query->get('email');
$token = $request->query->get('token');
$checkEmail = $em->getRepository(User::class)->findOneBy(array("email" => $email));
if (!$checkEmail) {
$session->getFlashBag()->add('error', "L'adresse e-mail renseignée n'existe pas.");
return $this->redirectToRoute('app_register');
} else {
$checkEmail->setRegisterToken("");
$checkEmail->setIsActive(true);
$em->persist($checkEmail);
$em->flush();
$session = $this->requestStack->getSession();
$session->getFlashBag()->add('success', "Félicitations, votre compte est bien validé, vous pouvez vous connecter");
return $this->redirectToRoute('app_login');
}
}
/**
* @Route("/confirmation-inscription-email", name="security_confirm_register_email")
*/
public function confirmRegisterEmail(Request $request, Tool $tool, UrlGeneratorInterface $router, MailerInterface $mailer)
{
$em = $this->doctrine->getManager();
$user = $em->getRepository(User::class)->findOneBy(['email' => $request->request->get('email')]);
if(!$user) return $this->json(["success" => false, "message" => "Adresse email invalide"]);
$user->setRegisterToken(uniqid());
$url = $this->generateUrl('security_confirm_register', ['email' => $user->getEmail(), 'token' => $user->getRegisterToken()], UrlGeneratorInterface::ABSOLUTE_URL);
$mail = (new Email())
->subject('Activation compte')
->from(new Address($_ENV['MAILER_ADDRESS'], $_ENV['MAILER_NAME']))
->to($user->getEmail())
->html($this->renderView('email/template.html.twig', array('content' => 'Cliquez sur le bouton suivant pour activer votre compte et vous connecter.', 'user' => $user, 'button' => ["title" => "Me connecter", "link" => $url])));
$mailer->send($mail);
$session = $this->requestStack->getSession();
$em->persist($user);
$em->flush();
return $this->json(["success" => true, "message" => "Email envoyé avec succès"]);
}
/**
* @Route("/mot-de-passe-perdu", name="security_reset_password")
*/
public function resetPassword(Request $request, Tool $tool, UrlGeneratorInterface $router, MailerInterface $mailer)
{
if ($this->getUser()) {
return $this->redirectToRoute('dashboard_index');
}
if ($request->isMethod('post')) {
$em = $this->doctrine->getManager();
$session = $this->requestStack->getSession();
if (!$tool->captchaverify($request->get('recaptcha_response'))) {
$session->getFlashBag()->add('error', "Erreur de sécurité avec le captcha code.");
return $this->redirectToRoute('security_reset_password');
}
$email = $request->request->get('email');
$checkEmail = $em->getRepository(User::class)->findOneBy(array("email" => $email));
if (!$checkEmail) {
$session->getFlashBag()->add('error', "L'adresse e-mail renseignée n'existe pas.");
return $this->redirectToRoute('security_reset_password');
} else {
$token = $tool->generateToken();
$checkEmail->setToken($token);
$em->persist($checkEmail);
$em->flush();
$url = $router->generate('security_update_password', ['email' => $checkEmail->getEmail(), 'token' => $checkEmail->getToken()], UrlGeneratorInterface::ABSOLUTE_URL);
$message = (new Email())
->subject('Récupération de votre mot de passe')
->from(new Address($_ENV['MAILER_ADDRESS'], $_ENV['MAILER_NAME']))
->to($checkEmail->getEmail())
->html($this->renderView('email/reset_pwd.html.twig', array('user' => $checkEmail, 'url' => $url)));
$mailer->send($message);
$session->getFlashBag()->add('success', "Un e-mail de récupération de mot de passe a été envoyé.");
return $this->redirectToRoute('app_logout');
}
}
return $this->render('security/reset_password.html.twig', []);
}
/**
* @Route("/mise-a-jour-mot-de-passe/{email}/{token}", name="security_update_password")
*/
public function updatePassword(Request $request, $email, $token, UserPasswordHasherInterface $hasher, EventDispatcherInterface $eventDispatcher)
{
$em = $this->doctrine->getManager();
$session = $this->requestStack->getSession();
$checkUser = $em->getRepository(User::class)->findOneBy(array("email" => $email, "token" => $token));
if (!$checkUser) {
$session->getFlashBag()->add('error', "La page demandée n'existe pas.");
return $this->redirectToRoute('security_reset_password');
}
if ($request->isMethod('post')) {
$password = $request->request->get('password');
if (!hash_equals($request->request->get('password'), $request->request->get('confirm_password'))) {
$session->getFlashBag()->add('error', "Les deux mots de passe sont différents");
return $this->redirectToRoute('security_update_password', ['email' => $checkUser->getEmail(), 'token' => $checkUser->getToken()]);
} else if (!$password) {
$session->getFlashBag()->add('error', "Le mot de passe est obligatoire");
return $this->redirectToRoute('security_update_password', ['email' => $checkUser->getEmail(), 'token' => $checkUser->getToken()]);
} else {
$password = $hasher->hashPassword($checkUser, $request->request->get('password'));
$checkUser->setPassword($password);
$checkUser->setToken(null);
$checkUser->setIsActive(true);
$token = new UsernamePasswordToken($checkUser, 'main', $checkUser->getRoles());
$this->container->get('security.token_storage')->setToken($token);
$session->set('_security_main', serialize($token));
$event = new InteractiveLoginEvent($request, $token);
$eventDispatcher->dispatch($event, 'security.interactive_login');
$em->persist($checkUser);
$em->flush();
$session->getFlashBag()->add('success', "Votre mot de passe a été mis à jour !");
// $session->invalidate();
return $this->redirectToRoute('dashboard_index');
}
}
return $this->render('security/update_password.html.twig', []);
}
/**
* @Route("/changement-agence/{id}/{role_id}", name="switch_agency")
*/
public function switchCustomer(AuthenticationUtils $authenticationUtils, $id, $role_id)
{
$em = $this->doctrine->getManager();
$session = $this->requestStack->getSession();
$user = $this->container->get('security.token_storage')->getToken()->getUser();
$agency = $em->getRepository(Agency::class)->find($id);
$role = $em->getRepository(DataRole::class)->find($role_id);
$checkUserRole = $em->getRepository(UserAgency::class)->findOneBy(array("agency" => $agency, "role" => $role));
if ($checkUserRole) {
$user->setAgency($agency);
$user->setRole($role);
$em->persist($user);
$em->flush();
} else if ($id == 0 && $role_id == 0 && $this->isGranted('ROLE_ADMIN')) {
$user->setAgency(NULL);
$user->setRole(NULL);
$em->persist($user);
$em->flush();
}
//echo $user->getAgency()->getId();die;
return $this->redirectToRoute('dashboard_index');
}
/**
* @Route("/logout", name="app_logout")
*/
public function logout()
{
$session = $this->requestStack->getSession();
$session->getFlashBag()->add('success', "Déconnexion !");
return $this->redirectToRoute('app_login');
}
}