src/Controller/MainController.php line 33

Open in your IDE?
  1. <?php
  2. namespace App\Controller;
  3. use App\Entity\Usuario;
  4. use App\Form\CadastroCandidatoType;
  5. use App\Form\ChangeEmailSelfType;
  6. use App\Form\ChangePasswordType;
  7. use App\Form\DadosCandidatoType;
  8. use App\Form\ForgotChangeFormType;
  9. use App\Form\ForgotCpfFormType;
  10. use App\Form\ForgotFormType;
  11. use App\Form\ForgotPassportFormType;
  12. use App\Form\LoginFormType;
  13. use App\Form\Model\ChangePassword;
  14. use App\Repository\EditalRepository;
  15. use App\Repository\UsuarioRepository;
  16. use App\Service\Comunicador;
  17. use App\Service\CpfValidator;
  18. use Doctrine\DBAL\Exception\UniqueConstraintViolationException;
  19. use Doctrine\ORM\EntityManagerInterface;
  20. use Symfony\Component\HttpFoundation\Request;
  21. use Symfony\Component\HttpFoundation\Response;
  22. use Symfony\Component\Routing\Annotation\Route;
  23. use Symfony\Component\Security\Http\Authentication\AuthenticationUtils;
  24. use Sensio\Bundle\FrameworkExtraBundle\Configuration\IsGranted;
  25. class MainController extends AppController
  26. {
  27.     /**
  28.      * @Route("/", name="index")
  29.      */
  30.     public function index(EditalRepository $editalRepository): Response
  31.     {
  32.         $editaisDisponiveis $editalRepository->findEditaisDisponiveis();
  33.         $editaisFuturos $editalRepository->findEditaisFuturos();
  34.         return $this->render('main/index.html.twig', [
  35.             'editaisDisponiveis' => $editaisDisponiveis,
  36.             'editaisFuturos' => $editaisFuturos,
  37.         ]);
  38.     }
  39.     /**
  40.      * @Route("/cadastro", name="cadastro")
  41.      */
  42.     public function cadastroAction(Request $requestEntityManagerInterface $emComunicador $comunicador): Response
  43.     {
  44.         $candidato = new Usuario();
  45.         if ($request->query->has('cpf')) {
  46.             $candidato->setCpf($request->query->get('cpf'));
  47.         }
  48.         if ($request->query->has('email')) {
  49.             $candidato->setEmail($request->query->get('email'));
  50.         }
  51.         if ($request->query->has('pp')) {
  52.             list($pais$pass) = explode('/'$request->query->get('pp'));
  53.             $candidato->setNacionalidade($pais);
  54.             $candidato->setPassaporte($pass);
  55.         }
  56.         else {
  57.             $candidato->setNacionalidade('BR');
  58.         }
  59.         $candidato->setRoles(['ROLE_USER''ROLE_CANDIDATO']);
  60.         $form $this->createForm(CadastroCandidatoType::class, $candidato, ['repository' => $em->getRepository(Usuario::class)]);
  61.         $form->handleRequest($request);
  62.         if ($form->isSubmitted() && $form->isValid()) {
  63.             try {
  64.                 /** @var Usuario $candidato */
  65.                 $candidato $form->getData();
  66.                 $em->persist($candidato);
  67.                 $em->flush();
  68.                 $this->addFlash('success''Cadastro realizado com sucesso! Um email de verificação foi enviado para você.');
  69.                 $comunicador->sendCadastroRealizado($candidato);
  70.                 return $this->redirectToRoute('login');
  71.             } catch (UniqueConstraintViolationException $e) {
  72.                 $this->addFlash('error''Email ou CPF / passaporte já cadastrados no sistema!');
  73.                 return $this->redirectToRoute('cadastro');
  74.             }
  75.         }
  76.         return $this->render(
  77.             'main/cadastro.html.twig', [
  78.                 'form' => $form->createView(),
  79.             ]
  80.         );
  81.     }
  82.     /**
  83.      * @Route("/entrar", name="login")
  84.      */
  85.     public function loginAction(AuthenticationUtils $authenticationUtilsRequest $request): Response
  86.     {
  87.         // get the login error if there is one
  88.         $error $authenticationUtils->getLastAuthenticationError(false);
  89.         // last username entered by the user
  90.         $lastUsername $authenticationUtils->getLastUsername();
  91.         $form $this->createForm(LoginFormType::class, [
  92.             '_username' => $lastUsername,
  93.         ]);
  94.         return $this->render(
  95.             'main/login.html.twig',
  96.             array(
  97.                 'form' => $form->createView(),
  98.                 'error' => $error,
  99.             )
  100.         );
  101.     }
  102.     /**
  103.      * @Route("/esqueci", name="forgot")
  104.      */
  105.     public function forgotAction(Request $requestComunicador $comunicadorUsuarioRepository $repositoryEntityManagerInterface $em): Response
  106.     {
  107.         $form $this->createForm(ForgotFormType::class);
  108.         $form->handleRequest($request);
  109.         if ($form->isSubmitted() && $form->isValid()) {
  110.             $formData $form->getData();
  111.             $usuario $repository->findOneBy(['email' => $formData['email']]);
  112.             if (!$usuario) {
  113.                 $this->addFlash('error''Não foi possível localizar um cadastro com este e-mail. Faça um novo cadastro.');
  114.                 return $this->redirectToRoute('cadastro', ['email' => $formData['email']]);
  115.             }
  116.             $token $usuario->generateResetToken(\DateInterval::createFromDateString('1 hour'));
  117.             if ($comunicador->sendEsqueceuSenha($usuario$token)) {
  118.                 $em->persist($usuario);
  119.                 $em->flush();
  120.                 $this->addFlash('success''Email para alteração de senha enviado!');
  121.             }
  122.             else {
  123.                 $this->addFlash('error''A funcionalidade de recuperação de senha está temporariamente desativada no sistema!');
  124.             }
  125.             return $this->redirectToRoute('forgot');
  126.         }
  127.         return $this->render('main/forgot.html.twig', [
  128.             'form' => $form->createView()
  129.         ]);
  130.     }
  131.     /**
  132.      * @Route("/esqueci-cpf", name="forgot_cpf")
  133.      */
  134.     public function forgotCpf(Request $requestComunicador $comunicadorUsuarioRepository $repositoryEntityManagerInterface $em): Response
  135.     {
  136.         $form $this->createForm(ForgotCpfFormType::class);
  137.         $form->handleRequest($request);
  138.         if ($form->isSubmitted() && $form->isValid()) {
  139.             $formData $form->getData();
  140.             $cpf CpfValidator::prettyfy($formData['cpf']);
  141.             $usuario $repository->findOneBy(['cpf' => $cpf]);
  142.             if (!$usuario) {
  143.                 $this->addFlash('error''Não foi possível localizar um cadastro com este CPF. Faça um novo cadastro.');
  144.                 return $this->redirectToRoute('cadastro', ['cpf' => $cpf]);
  145.             }
  146.             $token $usuario->generateResetToken(\DateInterval::createFromDateString('1 hour'));
  147.             $comunicador->sendEsqueceuSenha($usuario$token);
  148.             $em->persist($usuario);
  149.             $em->flush();
  150.             $this->addFlash('success''Email para alteração de senha enviado!');
  151.             return $this->render('main/forgot_cpf.html.twig', [
  152.                 'usuario' => $usuario,
  153.                 'obfuscated' => $usuario->getObfuscatedEmail(),
  154.                 'first_name' => $usuario->getFirstName(),
  155.             ]);
  156.         }
  157.         return $this->render('main/forgot_cpf.html.twig', [
  158.             'form' => $form->createView()
  159.         ]);
  160.     }
  161.     /**
  162.      * @Route("/esqueci-passaporte", name="forgot_passport")
  163.      */
  164.     public function forgotPassaporte(Request $requestComunicador $comunicadorUsuarioRepository $repositoryEntityManagerInterface $em): Response
  165.     {
  166.         $form $this->createForm(ForgotPassportFormType::class);
  167.         $form->handleRequest($request);
  168.         if ($form->isSubmitted() && $form->isValid()) {
  169.             $formData $form->getData();
  170.             $pass $formData['passaporte'];
  171.             $nac $formData['nacionalidade'];
  172.             $usuario $repository->findOneBy(['passaporte' => $pass'nacionalidade' => $nac]);
  173.             if (!$usuario) {
  174.                 $this->addFlash('error''Não foi possível localizar um cadastro com este Passaporte. Faça um novo cadastro.');
  175.                 return $this->redirectToRoute('cadastro', ['pp' => "$nac/$pass"]);
  176.             }
  177.             $token $usuario->generateResetToken(\DateInterval::createFromDateString('1 hour'));
  178.             $comunicador->sendEsqueceuSenha($usuario$token);
  179.             $em->persist($usuario);
  180.             $em->flush();
  181.             $this->addFlash('success''Email para alteração de senha enviado!');
  182.             return $this->render('main/forgot_passport.html.twig', [
  183.                 'usuario' => $usuario,
  184.                 'obfuscated' => $usuario->getObfuscatedEmail(),
  185.                 'first_name' => $usuario->getFirstName(),
  186.             ]);
  187.         }
  188.         return $this->render('main/forgot_passport.html.twig', [
  189.             'form' => $form->createView()
  190.         ]);
  191.     }
  192.     /**
  193.      * @Route("/esqueci/{resetToken}", name="forgot_change")
  194.      */
  195.     public function forgotChangeAction(Usuario $usuarioRequest $requestComunicador $comunicadorEntityManagerInterface $em): Response
  196.     {
  197.         if ($usuario->isResetTokenValid()) {
  198.             $form $this->createForm(ForgotChangeFormType::class);
  199.             $form->handleRequest($request);
  200.             if ($form->isSubmitted() && $form->isValid()) {
  201.                 $formData $form->getData();
  202.                 $usuario->setPlainPassword($formData['senha']);
  203.                 $usuario->clearResetToken();
  204.                 $comunicador->sendSenhaRecuperada($usuario);
  205.                 $em->persist($usuario);
  206.                 $em->flush();
  207.                 $this->addFlash('success'"Senha de {$usuario->getFirstName()} alterada com sucesso!");
  208.                 return $this->redirectToRoute('login');
  209.             }
  210.             return $this->render('main/forgot_change.html.twig', [
  211.                 'form' => $form->createView(),
  212.                 'usuario' => $usuario,
  213.             ]);
  214.         } else {
  215.             $this->addFlash('error''Solicitação inválida ou expirada.');
  216.             return $this->redirectToRoute('forgot');
  217.         }
  218.     }
  219.     /**
  220.      * @Route("/trocar-senha", name="change_pass")
  221.      * @IsGranted("ROLE_USER")
  222.      */
  223.     public function trocarSenhaAction(Request $requestEntityManagerInterface $emComunicador $comunicador): Response
  224.     {
  225.         /** @var Usuario $usuario */
  226.         $usuario $this->getUser();
  227.         $form $this->createForm(ChangePasswordType::class);
  228.         $form->handleRequest($request);
  229.         if ($form->isSubmitted() && $form->isValid()) {
  230.             /** @var ChangePassword $formData */
  231.             $formData $form->getData();
  232.             $usuario->setPlainPassword($formData->getNewPassword());
  233.             $usuario->clearResetToken();
  234.             $em->persist($usuario);
  235.             $em->flush();
  236.             $comunicador->sendSenhaTrocada($usuario$formData->getNewPassword());
  237.             $this->addFlash('success''Senha alterada com sucesso!');
  238.             return $this->redirectToRoute('inscricao');
  239.         }
  240.         return $this->render('main/change_pass.html.twig', [
  241.             'trocarSenhaForm' => $form->createView(),
  242.             'usuario' => $usuario,
  243.         ]);
  244.     }
  245.     /**
  246.      * @Route("/sair", name="logout")
  247.      */
  248.     public function logoutAction(): Response
  249.     {
  250.         throw new \Exception('this should not be reached!');
  251.     }
  252.     /**
  253.      * @Route("/trocar-email", name="trocar_email")
  254.      * @IsGranted("ROLE_USER")
  255.      */
  256.     public function trocarEmail(Request $requestComunicador $comunicadorUsuarioRepository $repositoryEntityManagerInterface $em): Response
  257.     {
  258.         /** @var Usuario $usuario */
  259.         $usuario $this->getUser();
  260.         $form $this->createForm(ChangeEmailSelfType::class, null, [
  261.             'repository' => $repository,
  262.             'user' => $usuario,
  263.         ]);
  264.         $form->handleRequest($request);
  265.         if ($form->isSubmitted() && $form->isValid()) {
  266.             $data $form->getData();
  267.             $email $data['email'];
  268.             $token $usuario->generateEmailResetToken($email, \DateInterval::createFromDateString('1 hour'));
  269.             $comunicador->sendTrocarEmail($usuario$token);
  270.             $em->persist($usuario);
  271.             $em->flush();
  272.             $this->addFlash('success''Email para alteração de e-mail enviado!');
  273.             return $this->redirectToRoute('trocar_email');
  274.         }
  275.         return $this->render('main/email.html.twig', [
  276.             'form' => $form->createView()
  277.         ]);
  278.     }
  279.     /**
  280.      * @Route("/trocar-email/{resetToken}", name="email_change")
  281.      * @IsGranted("ROLE_USER")
  282.      */
  283.     public function confirmarTrocaEmail($resetTokenUsuario $usuarioRequest $requestComunicador $comunicadorEntityManagerInterface $emUsuarioRepository $usuarioRepository): Response
  284.     {
  285.         if ($usuario->isEmailResetTokenValid($this->getUser()->getId())) {
  286.             if ($request->isXmlHttpRequest() && $request->isMethod('patch')) {
  287.                 // Cancelamento da requisição
  288.                 $email $usuario->getResetEmail();
  289.                 $usuario->clearResetToken();
  290.                 $em->persist($usuario);
  291.                 $em->flush();
  292.                 return $this->json([
  293.                     'message' => "Trocar de e-mail para {$email} cancelada com sucesso.",
  294.                     'url' => $this->generateUrl('trocar_email'),
  295.                 ], 200);
  296.             }
  297.             $form $this->createForm(ChangeEmailSelfType::class, ['email' => $usuario->getResetEmail()], [
  298.                 'locked' => true,
  299.                 'user' => $usuario,
  300.                 'repository' => $usuarioRepository,
  301.             ]);
  302.             $form->handleRequest($request);
  303.             if ($form->isSubmitted() && $form->isValid()) {
  304.                 $formData $form->getData();
  305.                 $antigo $usuario->getEmail();
  306.                 $usuario->setEmail($usuario->getResetEmail());
  307.                 $usuario->clearResetToken();
  308.                 $comunicador->sendEmailTrocado($usuario$antigo);
  309.                 $em->persist($usuario);
  310.                 $em->flush();
  311.                 $this->addFlash('success''E-mail alterado!');
  312.                 return $this->redirectToRoute('trocar_email');
  313.             }
  314.             return $this->render('main/email_change.html.twig', [
  315.                 'form' => $form->createView(),
  316.                 'usuario' => $usuario,
  317.                 'token' => $resetToken,
  318.             ]);
  319.         } else {
  320.             if ($request->isXmlHttpRequest()) {
  321.                 return $this->json([
  322.                     'message' => 'Solicitação inválida ou expirada!'
  323.                 ], 409);
  324.             }
  325.             else {
  326.                 $this->addFlash('error''Solicitação inválida ou expirada!');
  327.                 return $this->redirectToRoute('trocar_email');
  328.             }
  329.         }
  330.     }
  331.     /**
  332.      * @Route("/meus-dados", name="account")
  333.      * @IsGranted("ROLE_USER")
  334.      */
  335.     public function meusDados(Request $requestEntityManagerInterface $emUsuarioRepository $repository): Response
  336.     {
  337.         /** @var Usuario $usuario */
  338.         $usuario $this->getUser();
  339.         $form $this->createForm(DadosCandidatoType::class, $usuario, [
  340.             'candidato' => $usuario,
  341.             'repository' => $repository,
  342.         ]);
  343.         $form->handleRequest($request);
  344.         if ($form->isSubmitted() && $form->isValid()) {
  345.             $usuario $form->getData();
  346.             $em->persist($usuario);
  347.             $em->flush();
  348.             $this->addFlash('success''Cadastro de Usuário Atualizado!');
  349.             return $this->redirectToRoute('account');
  350.         }
  351.         return $this->render('main/account.html.twig', [
  352.             'form' => $form->createView()
  353.         ]);
  354.     }
  355. }