src/Http/Controller/Auth/RegistrationController.php line 26

Open in your IDE?
  1. <?php
  2. namespace App\Http\Controller\Auth;
  3. use App\Application\CommandBus\Command\User\RegistrationCommand;
  4. use App\Database\Domain\Entity\User\User;
  5. use App\Database\Domain\Entity\User\UserConfirmEmailToken;
  6. use App\Database\Domain\Repository\UserRepository;
  7. use App\Infrastructure\Mailer\Email\ConfirmEmailAddressEmail;
  8. use App\Infrastructure\Mailer\SimpleMailer;
  9. use App\Infrastructure\Messenger\CommandBus\CommandBusInterface;
  10. use App\Infrastructure\Security\AuthManager;
  11. use App\Infrastructure\Service\ActionResponseHandler;
  12. use App\Infrastructure\Util\ExceptionMessage;
  13. use App\Infrastructure\Util\Identifier;
  14. use Doctrine\ORM\EntityManagerInterface;
  15. use Sensio\Bundle\FrameworkExtraBundle\Configuration\ParamConverter;
  16. use Symfony\Bundle\FrameworkBundle\Controller\AbstractController;
  17. use Symfony\Component\HttpFoundation\Request;
  18. use Symfony\Component\HttpFoundation\Response;
  19. use Symfony\Component\Routing\Annotation\Route;
  20. /**
  21.  * @Route("/user-register", name="registration_")
  22.  */
  23. class RegistrationController extends AbstractController
  24. {
  25.     /**
  26.      * @Route("", name="index", methods={"GET"})
  27.      */
  28.     public function __invoke(Request $request, AuthManager $manager): Response
  29.     {
  30.         return $this->redirectToRoute('user_login');
  31.         /**
  32.          * Special param from browser extension.
  33.          * Such user must be redirected to specific route after email confirmation.
  34.          */
  35.         $isSafari = $request->query->getBoolean('safari', false);
  36.         $request->getSession()->set('is_safari', $isSafari);
  37.         $request->getSession()->set('redirect-uri', $request->query->get('redirect-uri'));
  38.         return $this->render('user/auth/registration.html.twig');
  39.     }
  40.     /**
  41.      * @Route("/{email}/resend-email", name="resend_email", methods={"GET"})
  42.      */
  43.     public function resendEmail(
  44.         string $email,
  45.         UserRepository $userRepository,
  46.         SimpleMailer $simpleMailer,
  47.         EntityManagerInterface $em
  48.     ): \Symfony\Component\HttpFoundation\JsonResponse {
  49.         $user = $userRepository->findByEmail($email);
  50.         $confirmEmailToken = new UserConfirmEmailToken(Identifier::generate(), $user, bin2hex(random_bytes(16)));
  51.         $em->persist($confirmEmailToken);
  52.         $em->flush();
  53.         $email = new ConfirmEmailAddressEmail($user, $confirmEmailToken);
  54.         $simpleMailer->send($email);
  55.         return $this->json([]);
  56.     }
  57.     /**
  58.      * @Route("", name="form", methods={"POST"})
  59.      */
  60.     public function register(
  61.         Request $request,
  62.         CommandBusInterface $commandBus,
  63.         ActionResponseHandler $actionResponseHandler
  64.     ): Response {
  65.         $data = $request->request->all();
  66.         try {
  67.             $command = new RegistrationCommand();
  68.             $command->id = Identifier::generate();
  69.             $command->name = $data['name'];
  70.             $command->username = $data['email'];
  71.             $command->password = $data['password'];
  72.             $command->surname = $data['surname'];
  73.             $command->email = $data['email'];
  74.             $commandBus->execute($command);
  75.         } catch (\Exception $exception) {
  76.             return $actionResponseHandler->errorRedirect('registration_index', ExceptionMessage::getMessage($exception), [], $data);
  77.         }
  78.         return $actionResponseHandler->successRedirect('registration_index', 'Check your email for confirmation link!');
  79.     }
  80.     /**
  81.      * @Route("/confirm-email/{token}", name="confirm_email")
  82.      *
  83.      * @ParamConverter("token", options={"mapping": {"token": "token"}})
  84.      */
  85.     public function confirmEmail(
  86.         UserConfirmEmailToken $token,
  87.         EntityManagerInterface $em,
  88.         AuthManager $authManager,
  89.         ActionResponseHandler $actionResponseHandler
  90.     ): Response {
  91.         if ($token->isUsed()) {
  92.             return $actionResponseHandler->errorRedirect('registration_index', 'Your email is already confirmed');
  93.         }
  94.         $user = $token->getUser();
  95.         $user->getProfile()->setEmailConfirmed(true);
  96.         $token->setIsUsed(true);
  97.         $em->flush();
  98.         return $authManager->manualLogin($user, 'registration_finish_registration', ['source' => 'basic']);
  99.     }
  100.     /**
  101.      * @Route("/finish-registration", name="finish_registration")
  102.      */
  103.     public function finishRegistration(Request $request, AuthManager $authManager)
  104.     {
  105.         /** @var User $user */
  106.         $user = $this->getUser();
  107.         if (null === $user) {
  108.             return $this->redirectToRoute('user_login');
  109.         }
  110.         if ($request->getMethod() === Request::METHOD_POST) {
  111.             $name = $request->request->get('name');
  112.             $surname = $request->request->get('surname');
  113.             $profession = $request->request->get('profession');
  114.             if (null !== $name) {
  115.                 $user->getProfile()
  116.                     ->setName($name)
  117.                     ->setSurname($surname);
  118.             }
  119.             $user->getProfile()->setProfession($profession);
  120.             $this->getDoctrine()->getManager()->flush();
  121.             return $authManager->manualLogin($user, 'user_sessions_index', ['source' => 'registered']);
  122.         }
  123.         return $this->render('user/auth/finish_registration.html.twig');
  124.     }
  125. }