src/Controller/MainController.php line 152

Open in your IDE?
  1. <?php
  2. /**
  3.  * Created by PhpStorm.
  4.  * User: ricar
  5.  * Date: 06/08/2018
  6.  * Time: 09:43
  7.  */
  8. namespace App\Controller;
  9. use App\Entity\Usuario;
  10. use App\Form\ChangeEmailConfirmType;
  11. use App\Form\ChangeEmailType;
  12. use App\Form\ChangePasswordType;
  13. use App\Form\ForgotChangeFormType;
  14. use App\Form\ForgotEmailFormType;
  15. use App\Form\ForgotFormType;
  16. use App\Form\LoginFormType;
  17. use App\Form\Model\ChangePassword;
  18. use App\Form\PerfilType;
  19. use App\Notification\UsuarioEmailAlterado;
  20. use App\Notification\UsuarioEsqueciSenha;
  21. use App\Notification\UsuarioSenhaAlterada;
  22. use App\Notification\UsuarioTrocarEmail;
  23. use App\Repository\ProficienciaRepository;
  24. use App\Repository\UsuarioRepository;
  25. use App\Service\Notifier;
  26. use App\Validator\BrasilCpfValidator;
  27. use Doctrine\ORM\EntityManagerInterface;
  28. use Sensio\Bundle\FrameworkExtraBundle\Configuration\IsGranted;
  29. use Symfony\Component\Finder\Exception\AccessDeniedException;
  30. use Symfony\Component\HttpFoundation\Request;
  31. use Symfony\Component\HttpFoundation\Response;
  32. use Symfony\Component\Routing\Annotation\Route;
  33. use Symfony\Component\Security\Core\User\UserInterface;
  34. use Symfony\Component\Security\Http\Authentication\AuthenticationUtils;
  35. class MainController extends AppController
  36. {
  37.     /**
  38.      * @Route("/", name="homepage")
  39.      * @IsGranted(Usuario::IS_AUTHENTICATED)
  40.      */
  41.     public function homepageAction(): Response
  42.     {
  43.         return $this->render('main/homepage.html.twig');
  44.     }
  45.     /**
  46.      * @Route("/login", name="login")
  47.      * @IsGranted(Usuario::PUBLIC_ACCESS)
  48.      */
  49.     public function loginAction(AuthenticationUtils $authenticationUtils): Response
  50.     {
  51.         if ($this->isGranted(Usuario::IS_AUTHENTICATED)) {
  52.             return $this->redirectToRoute('homepage');
  53.         }
  54.         // get the login error if there is one
  55.         $error $authenticationUtils->getLastAuthenticationError();
  56.         // last username entered by the user
  57.         $lastUsername $authenticationUtils->getLastUsername();
  58.         $form $this->createForm(LoginFormType::class, [
  59.             '_username' => $lastUsername,
  60.         ]);
  61.         return $this->render(
  62.             'main/login.html.twig',
  63.             array(
  64.                 'form' => $form->createView(),
  65.                 'error' => $error,
  66.             )
  67.         );
  68.     }
  69.     /**
  70.      * @Route("/esqueci", name="forgot")
  71.      * @IsGranted(Usuario::PUBLIC_ACCESS)
  72.      */
  73.     public function forgotAction(Request $requestNotifier $notifierUsuarioRepository $repositoryEntityManagerInterface $em): Response
  74.     {
  75.         if ($this->isGranted(Usuario::IS_AUTHENTICATED)) {
  76.             return $this->redirectToRoute('change_pass');
  77.         }
  78.         $form $this->createForm(ForgotFormType::class);
  79.         $form->handleRequest($request);
  80.         if ($form->isSubmitted() && $form->isValid()) {
  81.             $formData $form->getData();
  82.             $usuario $repository->findOneBy(['email' => $formData['email']]);
  83.             if ($usuario instanceof Usuario) {
  84.                 if (!$usuario->getAtivo()) {
  85.                     $this->addFlash('warning''Este usuário encontra-se bloqueado no sistema!');
  86.                     return $this->redirectToRoute('forgot');
  87.                 }
  88.                 $token $usuario->generateResetToken(\DateInterval::createFromDateString('1 hour'));
  89.                 $notifier->prepareAndSend(new UsuarioEsqueciSenha($usuario$token));
  90.                 $em->persist($usuario);
  91.                 $em->flush();
  92.             }
  93.             $this->addFlash('success''Email para alteração de senha enviado!');
  94.             return $this->redirectToRoute('login');
  95.         }
  96.         return $this->render('main/forgot.html.twig', [
  97.             'form' => $form->createView()
  98.         ]);
  99.     }
  100.     /**
  101.      * @Route("/esqueci/{resetToken}", name="forgot_change")
  102.      * @IsGranted(Usuario::PUBLIC_ACCESS)
  103.      */
  104.     public function forgotChangeAction(Usuario $usuarioRequest $requestNotifier $notifierEntityManagerInterface $em): Response
  105.     {
  106.         if ($usuario->isResetTokenValid()) {
  107.             $form $this->createForm(ForgotChangeFormType::class);
  108.             $form->handleRequest($request);
  109.             if ($form->isSubmitted() && $form->isValid()) {
  110.                 $formData $form->getData();
  111.                 $usuario->setPlainPassword($formData['senha']);
  112.                 $usuario->clearResetToken();
  113.                 $notifier->prepareAndSend(new UsuarioSenhaAlterada($usuario));
  114.                 $em->persist($usuario);
  115.                 $em->flush();
  116.                 $this->addFlash('success''Senha alterada!');
  117.                 return $this->redirectToRoute('login');
  118.             }
  119.             return $this->render('main/forgot_change.html.twig', [
  120.                 'form' => $form->createView()
  121.             ]);
  122.         } else {
  123.             throw $this->createNotFoundException('Token não encontrado!');
  124.         }
  125.     }
  126.     /**
  127.      * @Route("/esqueci-email", name="forgot_email")
  128.      * @IsGranted(Usuario::PUBLIC_ACCESS)
  129.      */
  130.     public function forgotEmailAction(Request $requestNotifier $notifierUsuarioRepository $repositoryEntityManagerInterface $em): Response
  131.     {
  132.         if ($this->isGranted(Usuario::IS_AUTHENTICATED)) {
  133.             return $this->redirectToRoute('change_email');
  134.         }
  135.         $form $this->createForm(ForgotEmailFormType::class);
  136.         $form->handleRequest($request);
  137.         if ($form->isSubmitted() && $form->isValid()) {
  138.             $formData $form->getData();
  139.             $cpf BrasilCpfValidator::normalize($formData['cpf']);
  140.             $usuario $repository->findOneBy(['cpf' => $cpf]);
  141.             if ($usuario instanceof Usuario) {
  142.                 if (!$usuario->getAtivo()) {
  143.                     $this->addFlash('warning''Este usuário encontra-se bloqueado no sistema!');
  144.                     return $this->redirectToRoute('forgot');
  145.                 }
  146.                 $token $usuario->generateResetToken(\DateInterval::createFromDateString('1 hour'));
  147.                 $notifier->prepareAndSend(new UsuarioEsqueciSenha($usuario$token));
  148.                 $em->persist($usuario);
  149.                 $em->flush();
  150.                 $email $usuario->getObfuscatedEmail();
  151.                 $this->addFlash('success'"Email para alteração de senha enviado para $email!");
  152.             } elseif ($form->isSubmitted()) {
  153.                 $this->addFlash('error'"Nenhum usuário localizado com o CPF informado!");
  154.             }
  155.         }
  156.         return $this->render('main/forgot_email.html.twig', [
  157.             'form' => $form->createView()
  158.         ]);
  159.     }
  160.     /**
  161.      * @Route("/trocar-senha", name="change_pass")
  162.      * @IsGranted(Usuario::IS_AUTHENTICATED_FULLY)
  163.      */
  164.     public function trocarSenhaAction(Request $requestEntityManagerInterface $emNotifier $notifier): Response
  165.     {
  166.         /** @var Usuario $usuario */
  167.         $usuario $this->getUsuario();
  168.         if (!is_object($usuario) || !$usuario instanceof UserInterface) {
  169.             throw new AccessDeniedException('Você não tem permissão para estar aqui...');
  170.         }
  171.         $form $this->createForm(ChangePasswordType::class);
  172.         $form->handleRequest($request);
  173.         if ($form->isSubmitted() && $form->isValid()) {
  174.             /** @var ChangePassword $formData */
  175.             $formData $form->getData();
  176.             $usuario->setPlainPassword($formData->getNewPassword());
  177.             $usuario->clearResetToken();
  178.             $notifier->prepareAndSend(new UsuarioSenhaAlterada($usuario));
  179.             $em->persist($usuario);
  180.             $em->flush();
  181.             $this->addFlash('success''Senha alterada com sucesso!');
  182.             return $this->redirectToRoute('change_pass');
  183.         }
  184.         return $this->render('main/change_pass.html.twig', [
  185.             'trocarSenhaForm' => $form->createView()
  186.         ]);
  187.     }
  188.     /**
  189.      * @Route("/trocar-email", name="change_email")
  190.      * @IsGranted(Usuario::IS_AUTHENTICATED_FULLY)
  191.      */
  192.     public function changeEmailAction(Request $requestNotifier $notifierUsuarioRepository $repositoryEntityManagerInterface $em): Response
  193.     {
  194.         /** @var Usuario $usuario */
  195.         $usuario $this->getUsuario();
  196.         if (!is_object($usuario) || !$usuario instanceof UserInterface) {
  197.             throw new AccessDeniedException('Você não tem permissão para estar aqui...');
  198.         }
  199.         $form $this->createForm(ChangeEmailType::class);
  200.         $form->handleRequest($request);
  201.         if ($form->isSubmitted() && $form->isValid()) {
  202.             $formData $form->getData();
  203.             $token $usuario->generateResetToken(\DateInterval::createFromDateString('1 hour'));
  204.             $notifier->prepareAndSend(new UsuarioTrocarEmail($usuario$token$formData->getEmail()));
  205.             $em->persist($usuario);
  206.             $em->flush();
  207.             $this->addFlash('success''Email para alteração de e-mail enviado!');
  208.             return $this->redirectToRoute('change_email');
  209.         }
  210.         return $this->render('main/change_email.html.twig', [
  211.             'form' => $form->createView(),
  212.             'confirmed' => false,
  213.         ]);
  214.     }
  215.     /**
  216.      * @Route("/trocar-email/{newEmail}/{resetToken}", name="confirm_email_change")
  217.      * @IsGranted(Usuario::PUBLIC_ACCESS)
  218.      */
  219.     public function confirmEmailChangeAction($newEmailUsuario $usuarioRequest $requestNotifier $notifierEntityManagerInterface $em): Response
  220.     {
  221.         if ($usuario->isResetTokenValid() && $newEmail) {
  222.             if ($this->getUsuario()->getId() != $usuario->getId()) {
  223.                 throw new AccessDeniedException('Você não tem permissão para estar aqui...');
  224.             }
  225.             $oldEmail $usuario->getEmail();
  226.             $form $this->createForm(ChangeEmailConfirmType::class, [
  227.                 'old_email' => $oldEmail,
  228.                 'new_email' => $newEmail,
  229.             ]);
  230.             $form->handleRequest($request);
  231.             if ($form->isSubmitted() && $form->isValid()) {
  232.                 $usuario->setEmail($newEmail);
  233.                 $usuario->clearResetToken();
  234.                 $notifier->prepareAndSend(new UsuarioEmailAlterado($usuario$oldEmail));
  235.                 $em->persist($usuario);
  236.                 $em->flush();
  237.                 $this->addFlash('success''E-mail alterado!');
  238.                 return $this->redirectToRoute('perfil');
  239.             }
  240.             return $this->render('main/change_email.html.twig', [
  241.                 'form' => $form->createView(),
  242.                 'confirmed' => true,
  243.             ]);
  244.         } else {
  245.             throw $this->createNotFoundException('Token não encontrado!');
  246.         }
  247.     }
  248.     /**
  249.      * @Route("/perfil", name="perfil")
  250.      * @IsGranted(Usuario::IS_AUTHENTICATED_FULLY)
  251.      */
  252.     public function perfilAction(Request $requestEntityManagerInterface $emProficienciaRepository $proficienciaRepository): Response
  253.     {
  254.         /** @var Usuario $usuario */
  255.         $usuario $this->getUsuario();
  256.         if (!is_object($usuario) || !$usuario instanceof UserInterface) {
  257.             throw new AccessDeniedException('Você não tem permissão para estar aqui...');
  258.         }
  259.         $form $this->createForm(PerfilType::class, $usuario, [
  260.             'usuario' => $usuario,
  261.         ]);
  262.         $form->handleRequest($request);
  263.         if ($form->isSubmitted() && $form->isValid()) {
  264.             /** @var Usuario $usuario */
  265.             $usuario $form->getData();
  266.             $em->persist($usuario);
  267.             $em->flush();
  268.             $this->addFlash('success''Perfil atualizado com sucesso!');
  269.             return $this->redirectToRoute('perfil');
  270.         }
  271.         $proficiencias $proficienciaRepository->findBy([
  272.             'usuario' => $usuario
  273.         ]);
  274.         return $this->render('main/perfil.html.twig', [
  275.             'form' => $form->createView(),
  276.             'proficiencias' => $proficiencias
  277.         ]);
  278.     }
  279.     /**
  280.      * @Route("/logout", name="logout")
  281.      * @IsGranted(Usuario::PUBLIC_ACCESS)
  282.      */
  283.     public function logoutAction(): Response
  284.     {
  285.         throw new \Exception('this should not be reached!');
  286.     }
  287. }