src/Controller/RegistrationController.php line 55

Open in your IDE?
  1. <?php
  2. namespace App\Controller;
  3. use App\Constant\RegisterTypeConstant;
  4. use App\Entity\CommonInformation;
  5. use App\Entity\User;
  6. use App\Form\RegistrationType;
  7. use App\Repository\UserRepository;
  8. use App\Security\EmailVerifier;
  9. use App\Services\CurlHttpClient;
  10. use App\Services\SeoManager;
  11. use App\Services\WebhookManager;
  12. use DateTime;
  13. use Doctrine\ORM\EntityManagerInterface;
  14. use Symfony\Bridge\Twig\Mime\TemplatedEmail;
  15. use Symfony\Component\Form\FormError;
  16. use Symfony\Component\HttpFoundation\RedirectResponse;
  17. use Symfony\Component\HttpFoundation\Request;
  18. use Symfony\Component\HttpFoundation\Response;
  19. use Symfony\Component\Mime\Address;
  20. use Symfony\Component\PasswordHasher\Hasher\UserPasswordHasherInterface;
  21. use Symfony\Component\Routing\Annotation\Route;
  22. use Symfony\Contracts\Translation\TranslatorInterface;
  23. use SymfonyCasts\Bundle\VerifyEmail\Exception\VerifyEmailExceptionInterface;
  24. const SESSION 'session';
  25. class RegistrationController extends WhiplayController
  26. {
  27.     private EmailVerifier $emailVerifier;
  28.     public function __construct(
  29.         WebhookManager $webhookManager,
  30.         EmailVerifier $emailVerifier
  31.     ) {
  32.         parent::__construct($webhookManager);
  33.         $this->emailVerifier $emailVerifier;
  34.     }
  35.     /**
  36.      * Show register page or process form if data was sent
  37.      *
  38.      * @param Request $request
  39.      * @param TranslatorInterface $translator
  40.      * @param SeoManager $seoManager
  41.      * @param WebhookManager $webhookManager
  42.      * @param CurlHttpClient $httpClient
  43.      * @param UserPasswordHasherInterface $userPasswordHasher
  44.      * @param EntityManagerInterface $entityManager
  45.      * @param string $registerType
  46.      * @return Response
  47.      */
  48.     public function register(
  49.         Request $request,
  50.         TranslatorInterface $translator,
  51.         SeoManager $seoManager,
  52.         WebhookManager $webhookManager,
  53.         CurlHttpClient $httpClient,
  54.         UserPasswordHasherInterface $userPasswordHasher,
  55.         EntityManagerInterface $entityManager,
  56.         string $registerType RegisterTypeConstant::REGISTER_TYPE_USER
  57.     ): Response {
  58.         $title 'registration.user.seo.title';
  59.         $description 'registration.user.seo.description';
  60.         if ($registerType === RegisterTypeConstant::REGISTER_TYPE_BAND) {
  61.             $title 'registration.band.seo.title';
  62.             $description 'registration.band.seo.description';
  63.         }
  64.         $seoManager
  65.             ->setTitleAndDescription($title$description)
  66.             ->useLogo();
  67.         $user = new User();
  68.         if ($request->query->get('email')) {
  69.             $user->setEmail($request->query->get('email'));
  70.         }
  71.         if ($request->query->get('first_name')) {
  72.             $user->setFirstName($request->query->get('first_name'));
  73.         }
  74.         if ($request->query->get('last_name')) {
  75.             $user->setLastName($request->query->get('last_name'));
  76.         }
  77.         if ($request->query->get('user_name')) {
  78.             $user->setUsername($request->query->get('user_name'));
  79.         }
  80.         $birthDayKey 'birthday';
  81.         if ($request->query->get($birthDayKey)) {
  82.             $birthDay DateTime::createFromFormat('Y-m-d'$request->query->get($birthDayKey));
  83.             $user->setBirthday($birthDay);
  84.         }
  85.         $form $this->createForm(RegistrationType::class, $user);
  86.         $form->setData($user);
  87.         $formData $request->request->get('registration');
  88.         if (is_array($formData) && isset($formData[$birthDayKey]) && !empty($formData[$birthDayKey])) {
  89.             $form->handleRequest($request);
  90.         }
  91.         if ($request->query->get('external') && !$form->isSubmitted()) {
  92.             $form->get('external')->setData('true');
  93.         }
  94.         $birthDay $form->get($birthDayKey)->getData();
  95.         if ($birthDay) {
  96.             $interval $birthDay->diff(new DateTime());
  97.             if ($interval->13) {
  98.                 $form->get($birthDayKey)->addError(
  99.                     new FormError($translator->trans('registration.errors.minimum_age'))
  100.                 );
  101.             }
  102.             if ($interval->130) {
  103.                 $form->get($birthDayKey)->addError(
  104.                     new FormError($translator->trans('registration.errors.maximum_age'))
  105.                 );
  106.             }
  107.         }
  108.         if ($form->isSubmitted() && $form->isValid() && $request->get('contra') == 'true') {
  109.             $data = array(
  110.                 'secret' => $this->getParameter('hcaptcha_secret_key'),
  111.                 'response' => $request->request->get('h-captcha-response')
  112.             );
  113.             $response $httpClient->post("https://hcaptcha.com/siteverify"$datafalse);
  114.             $captchaData json_decode($response);
  115.             if ($captchaData->success) {
  116.                 $commonInformation = new CommonInformation();
  117.                 $commonInformation->setInscriptionDate(new DateTime());
  118.                 $user->setCommonInformation($commonInformation);
  119.                 $user->setPassword(
  120.                     $userPasswordHasher->hashPassword(
  121.                         $user,
  122.                         $form->get('plainPassword')->getData()
  123.                     )
  124.                 );
  125.                 $entityManager->persist($user);
  126.                 $entityManager->flush();
  127.                 // generate a signed url and email it to the user
  128.                 $this->emailVerifier->sendEmailConfirmation('registration_verify_email'$user,
  129.                     (new TemplatedEmail())
  130.                         ->from(new Address('no-reply@whiplay.fr'$translator->trans('band.mail.email_verification.from')))
  131.                         ->to($user->getEmail())
  132.                         ->subject($translator->trans('band.mail.email_verification.subject'))
  133.                         ->htmlTemplate('Registration/confirmation_email.html.twig')
  134.                 );
  135.                 $url $this->generateUrl('registration_check_email');
  136.                 $response = new RedirectResponse($url);
  137.                 $webhookManager->sendNewUserOnDiscord($user);
  138.                 return $response;
  139.             } else {
  140.                 $form->addError(new FormError(
  141.                     $translator->trans('registration.errors.captcha')
  142.                 ));
  143.             }
  144.         }
  145.         return $this->render('Registration/register.html.twig', array(
  146.             'form' => $form->createView(),
  147.             'registerType' => $registerType,
  148.         ));
  149.     }
  150.     /**
  151.      * Tell the user to check their email provider.
  152.      */
  153.     public function checkEmail(): Response
  154.     {
  155.         return $this->render('Registration/check_email.html.twig');
  156.     }
  157.     public function verifyUserEmail(Request $requestUserRepository $userRepository): Response
  158.     {
  159.         $id $request->get('id');
  160.         if (null === $id) {
  161.             return $this->redirectToRoute('app_register');
  162.         }
  163.         $user $userRepository->find($id);
  164.         if (null === $user) {
  165.             return $this->redirectToRoute('app_register');
  166.         }
  167.         // validate email confirmation link, sets User::isVerified=true and persists
  168.         try {
  169.             $this->emailVerifier->handleEmailConfirmation($request$user);
  170.         } catch (VerifyEmailExceptionInterface $exception) {
  171.             $this->addFlash('verify_email_error'$exception->getReason());
  172.             return $this->redirectToRoute('app_register');
  173.         }
  174.         // @TODO Change the redirect on success and handle or remove the flash message in your templates
  175.         $this->addFlash('success''Your email address has been verified.');
  176.         return $this->redirectToRoute('app_register');
  177.     }
  178. }