src/Controller/RegistrationController.php line 65

  1. <?php
  2. namespace App\Controller;
  3. use App\Exceptions\RecaptchaException;
  4. use App\Exceptions\ValidationException;
  5. use App\Model\Registration\ProofForm;
  6. use App\Model\Registration\RegistrationForm;
  7. use App\Model\Registration\SubscriptionSignatureForm;
  8. use App\Services\Bank\BeneficiaryService;
  9. use App\Services\RecaptchaService;
  10. use App\Services\RegistrationService;
  11. use App\Services\TokenVerifier;
  12. use App\Services\User\AuthUserService;
  13. use Exception;
  14. use Symfony\Component\HttpFoundation\JsonResponse;
  15. use Symfony\Component\HttpFoundation\Request;
  16. use Symfony\Component\HttpFoundation\Response;
  17. use Symfony\Component\Routing\Annotation\Route;
  18. use Symfony\Component\Serializer\Exception\ExceptionInterface;
  19. use Symfony\Component\Serializer\SerializerInterface;
  20. use Symfony\Component\Validator\Validation;
  21. use Symfony\Contracts\HttpClient\Exception\ClientExceptionInterface;
  22. use Symfony\Contracts\HttpClient\Exception\RedirectionExceptionInterface;
  23. use Symfony\Contracts\HttpClient\Exception\ServerExceptionInterface;
  24. use Symfony\Contracts\HttpClient\Exception\TransportExceptionInterface;
  25. use Symfony\Contracts\HttpClient\HttpClientInterface;
  26. use Symfony\Contracts\Translation\TranslatorInterface;
  27. use Symfony\Bundle\FrameworkBundle\Controller\AbstractController;
  28. use Karser\Recaptcha3Bundle\Validator\Constraints\Recaptcha3Validator;
  29. class RegistrationController extends AbstractController
  30. {
  31.     const REG_TOKEN_SESSION_KEY 'REGISTRATION_TOKEN';
  32.     const REG_USER_ID_SESSION_KEY 'REGISTRATION_USER_ID';
  33.     const REG_REQUEST_ID_SESSION_KEY 'REGISTRATION_REQUEST_ID';
  34.     const REG_REQUEST_COMPLETED_SESSION_KEY 'REGISTRATION_REQUEST_COMPLETED';
  35.     protected RegistrationService $registrationService;
  36.     protected BeneficiaryService $beneficiaryService;
  37.     private AuthUserService $authUserServive;
  38.     private TokenVerifier $tokenVerifier;
  39.     protected $recaptcha3Validator;
  40.     protected $httpClient;
  41.     protected $translator;
  42.     public function __construct(RegistrationService $registrationServiceRecaptcha3Validator $recaptcha3ValidatorAuthUserService $authUserServive,
  43.                                 HttpClientInterface $httpClientTranslatorInterface $translatorBeneficiaryService $beneficiaryService,
  44.                                 TokenVerifier $tokenVerifier)
  45.     {
  46.         $this->translator $translator;
  47.         $this->registrationService $registrationService;
  48.         $this->recaptcha3Validator $recaptcha3Validator;
  49.         $this->httpClient $httpClient;
  50.         $this->beneficiaryService $beneficiaryService;
  51.         $this->authUserServive $authUserServive;
  52.         $this->tokenVerifier $tokenVerifier;
  53.     }
  54.     #[Route('/register'name'app_register')]
  55.     public function register(Request $request): Response
  56.     {
  57.         $user_id $request->getSession()->get(self::REG_USER_ID_SESSION_KEY);
  58.         $request_id $request->getSession()->get(self::REG_REQUEST_COMPLETED_SESSION_KEY);
  59.         $completed $request->getSession()->get(self::REG_REQUEST_COMPLETED_SESSION_KEYfalse);
  60.         $beneficiary_token $request->get('token');
  61.         $beneficiary null;
  62.         if (!empty($beneficiary_token)) {
  63.             $beneficiary $this->beneficiaryService->getBeneficiaryByToken($beneficiary_token);
  64.             if ($beneficiary->client !== null) {
  65.                 $this->addFlash('danger''Vous disposez déjà d\'un compte. Connectez-vous pour gérer votre invitation.');
  66.                 return $this->redirectToRoute('app_login');
  67.             }
  68.         }
  69.         if ($completed && $user_id !== null && $request_id !== null) {
  70.             return $this->redirectToRoute('app_registration_success');
  71.         }
  72.         return $this->render('security/registration/index.html.twig', [
  73.             'beneficiary' => $beneficiary,
  74.         ]);
  75.     }
  76.     #[Route('/registration/save'name'app_registration_save'methods: ['GET''POST'])]
  77.     public function save(Request $requestSerializerInterface $serializerRecaptchaService $recaptchaService): Response
  78.     {
  79.         try {
  80.             $input $serializer->deserialize($request->getContent(), RegistrationForm::class, 'json');
  81.             try {
  82.                 $recaptchaService->verify($input->captchaToken'registration');
  83.             } catch (RecaptchaException $exception) {
  84.                 return new JsonResponse([
  85.                     'message' => $exception->getFormattedMessages(),
  86.                 ], 500);
  87.             }
  88.             $validator Validation::createValidatorBuilder()
  89.                 ->enableAnnotationMapping()
  90.                 ->getValidator()
  91.             ;
  92.             $form_errors $validator->validate($inputnull$input->getGroupSequence());
  93.             if (count($form_errors) > 0) {
  94.                 $errors = [];
  95.                 foreach ($form_errors as $error) {
  96.                     $errors[] = [
  97.                         'message' => $this->translator->trans($error->getMessageTemplate(), $error->getParameters(), 'validators'),
  98.                         'property' => $error->getPropertyPath(),
  99.                     ];
  100.                 }
  101.                 return new JsonResponse([
  102.                     'message' => $this->translator->trans('form.errors.invalid', [], 'account'),
  103.                     'errors' => $errors,
  104.                 ], 400);
  105.             }
  106.             $isNew true;
  107.             if (!$request->getSession()->has(self::REG_USER_ID_SESSION_KEY)) {
  108.                 $user $this->registrationService->postRegistration($input);
  109.                 if ($user === null) {
  110.                     throw new Exception('Problème technique lors de la création de votre compte.');
  111.                 }
  112.                 $request->getSession()->set(self::REG_USER_ID_SESSION_KEY$user->id);
  113.                 $request->getSession()->set(self::REG_REQUEST_ID_SESSION_KEY$user->requestId);
  114.                 $request->getSession()->set(self::REG_TOKEN_SESSION_KEY$user->accessToken);
  115.             } else {
  116.                 $isNew false;
  117.             }
  118.             return new JsonResponse([
  119.                 'success' => true,
  120.                 'message' => $this->translator->trans('form.success.'.($isNew 'create':'update'), [], 'account'),
  121.             ]);
  122.         } catch (ValidationException $exception) {
  123.             return new JsonResponse([
  124.                 'message' => $exception->getMessage(),
  125.                 'errors' => $exception->getErrors(),
  126.             ], 400);
  127.         } catch (Exception $exception) {
  128.             return new JsonResponse([
  129.                 'message' => $exception->getMessage()
  130.             ], Response::HTTP_INTERNAL_SERVER_ERROR);
  131.         }
  132.     }
  133.     #[Route('/registration/proofs/save'name'app_registration_save_proofs'methods: ['POST'])]
  134.     public function saveProofs(Request $requestSerializerInterface $serializer): Response
  135.     {
  136.         try {
  137.             /** @var ProofForm $input */
  138.             $input $serializer->deserialize($request->getContent(), ProofForm::class, 'json');
  139.             if (empty($input->userId)) {
  140.                 $input->userId = (int)($request->getSession()->get(self::REG_USER_ID_SESSION_KEY0));
  141.             }
  142.             $validator Validation::createValidatorBuilder()
  143.                 ->enableAnnotationMapping()
  144.                 ->getValidator()
  145.             ;
  146.             $form_errors $validator->validate($inputnull$input->getGroupSequence());
  147.             if (count($form_errors) > 0) {
  148.                 $errors = [];
  149.                 foreach ($form_errors as $error) {
  150.                     $errors[] = [
  151.                         'message' => $this->translator->trans($error->getMessageTemplate(), $error->getParameters(), 'validators'),
  152.                         'property' => $error->getPropertyPath(),
  153.                     ];
  154.                 }
  155.                 return new JsonResponse([
  156.                     'message' => $this->translator->trans('form.errors.invalid', [], 'account'),
  157.                     'errors' => $errors,
  158.                 ], 400);
  159.             }
  160.             $this->registrationService->saveProof($input);
  161.             if (!empty($input->userId) && $this->tokenVerifier->isTokenValid()) {
  162.                 $this->authUserServive->getAllAboutMe(true);
  163.             }
  164.             return new JsonResponse([
  165.                 'success' => true,
  166.                 'message' => $this->translator->trans('form.success.proof', [], 'account'),
  167.             ]);
  168.         } catch (ValidationException $exception) {
  169.             return new JsonResponse([
  170.                 'message' => $exception->getMessage(),
  171.                 'errors' => $exception->getErrors(),
  172.             ], 400);
  173.         } catch (Exception $exception) {
  174.             return new JsonResponse([
  175.                 'message' => $exception->getMessage()
  176.             ], Response::HTTP_INTERNAL_SERVER_ERROR);
  177.         }
  178.     }
  179.     #[Route('/registration/generate/subscription'name'app_registration_generate_subscription'methods: ['POST'])]
  180.     public function generateSubscription(Request $request): Response
  181.     {
  182.         $content $this->registrationService->generateSubscription(json_decode($request->getContent(), true));
  183.         if ($content === null) {
  184.             return new JsonResponse([
  185.                 'success' => false,
  186.                 'message' => 'Suite à une erreur technique, nous ne sommes pas dans la mesure de générer votre bulletin de souscription. Contactez l\'assistance',
  187.             ]);
  188.         }
  189.         return new Response(base64_encode($content), 200, [
  190.             'Cache-Control' => 'private',
  191.         ]);
  192.     }
  193.     /**
  194.      * @param Request $request
  195.      * @param SerializerInterface $serializer
  196.      * @return Response
  197.      * @throws ExceptionInterface
  198.      * @throws ClientExceptionInterface
  199.      * @throws RedirectionExceptionInterface
  200.      * @throws ServerExceptionInterface
  201.      * @throws TransportExceptionInterface
  202.      */
  203.     #[Route('/registration/subscription/signature'name'app_registration_subscription_signature'methods: ['POST'])]
  204.     public function postSubscriptionSignature(Request $requestSerializerInterface $serializer): Response
  205.     {
  206.         try {
  207.             /** @var SubscriptionSignatureForm $input */
  208.             $input $serializer->deserialize($request->getContent(), SubscriptionSignatureForm::class, 'json');
  209.             if (empty($input->userId)) {
  210.                 $input->userId = (int) ($request->getSession()->get(self::REG_USER_ID_SESSION_KEY0));
  211.             }
  212.             $validator Validation::createValidatorBuilder()
  213.                 ->enableAnnotationMapping()
  214.                 ->getValidator()
  215.             ;
  216.             $form_errors $validator->validate($inputnull$input->getGroupSequence());
  217.             if (count($form_errors) > 0) {
  218.                 $errors = [];
  219.                 foreach ($form_errors as $error) {
  220.                     $errors[] = [
  221.                         'message' => $this->translator->trans($error->getMessageTemplate(), $error->getParameters(), 'validators'),
  222.                         'property' => $error->getPropertyPath(),
  223.                     ];
  224.                 }
  225.                 return new JsonResponse([
  226.                     'message' => $this->translator->trans('form.errors.invalid', [], 'account'),
  227.                     'errors' => $errors,
  228.                 ], 400);
  229.             }
  230.             $this->registrationService->saveSubscriptionSignature($input);
  231.             $request->getSession()->set(self::REG_REQUEST_COMPLETED_SESSION_KEYtrue);
  232.             if (!empty($input->userId) && $this->tokenVerifier->isTokenValid()) {
  233.                 $this->authUserServive->getAllAboutMe(true);
  234.             }
  235.             return new JsonResponse([
  236.                 'success' => true,
  237.                 'message' => $this->translator->trans('form.success.signature', [], 'account'),
  238.             ]);
  239.         } catch (ValidationException $exception) {
  240.             return new JsonResponse([
  241.                 'message' => $exception->getMessage(),
  242.                 'errors' => $exception->getErrors(),
  243.             ], 400);
  244.         } catch (Exception $exception) {
  245.             return new JsonResponse([
  246.                 'message' => $exception->getMessage()
  247.             ], Response::HTTP_INTERNAL_SERVER_ERROR);
  248.         }
  249.     }
  250.     #[Route('/subscription/success'name'app_registration_success'methods: ['GET'])]
  251.     public function subscriptionSuccess(Request $request)
  252.     {
  253.         $user_id $request->getSession()->get(self::REG_USER_ID_SESSION_KEY);
  254.         $request_id $request->getSession()->get(self::REG_REQUEST_ID_SESSION_KEY);
  255.         $access_token $request->getSession()->get(self::REG_TOKEN_SESSION_KEY);
  256.         $completed $request->getSession()->get(self::REG_REQUEST_COMPLETED_SESSION_KEYfalse);
  257.         if (!$completed || $user_id === null || $request_id === null) {
  258.             return $this->redirectToRoute('app_register');
  259.         }
  260.         $request->getSession()->remove(self::REG_TOKEN_SESSION_KEY);
  261.         $request->getSession()->remove(self::REG_USER_ID_SESSION_KEY);
  262.         $request->getSession()->remove(self::REG_REQUEST_ID_SESSION_KEY);
  263.         $request->getSession()->remove(self::REG_REQUEST_COMPLETED_SESSION_KEY);
  264.         return $this->render('security/registration/success.html.twig');
  265.     }
  266.     // region RESET PASSWORD
  267.     #[Route('/reset_request'name'app_reset_request')]
  268.     public function resetRequest(Request $request): Response
  269.     {
  270.         // Soumission du formulaire et validation
  271.         if ($request->isMethod('POST')) {
  272.             $email $request->request->get('email');
  273.             try {
  274.                 $response $this->registrationService->resetPassword($email);
  275.                 $statusCode $response->getStatusCode();
  276.                 if ($statusCode === 200 || $statusCode === 201) {
  277.                     $this->addFlash('success'"Le mail a été envoyé avec succès, vérifiez votre adresse électronique.");
  278.                     return  $this->redirectToRoute('app_reset_check_password');
  279.                 } else {
  280.                     $this->addFlash('danger'"une erreur a été générée, veuillez vérifier votre adresse e-mail");
  281.                     return  $this->redirectToRoute('app_reset_request');
  282.                 }
  283.             } catch (Exception $e) {
  284.                 // Si la connexion échoue, affiche un message d'erreur à l'utilisateur
  285.                 $responseBody json_decode($e->getMessage());
  286.                 $this->addFlash('danger'$responseBody);
  287.             }
  288.         }
  289.         //redirection et envoie de la vue
  290.         return $this->render('security/reset_password/request.html.twig', [
  291.         ]);
  292.     }
  293.     #[Route('/check_password_reset'name'app_reset_check_password')]
  294.     public function checkPassword(Request $request): Response
  295.     {
  296.         
  297.         // Soumission du formulaire et validation
  298.         if ($request->isMethod('POST')) {
  299.             $phone $request->request->get('phone');
  300.             $email $request->request->get('email');
  301.             $code $request->request->get('code');
  302.             try {
  303.                 $response $this->registrationService->checkResetPassword([
  304.                     'phone' => $phone,
  305.                     'email' => $email,
  306.                     'code' => $code
  307.                 ]);
  308.                 $content json_decode($response->getContent(), true);
  309.                 $statusCode $response->getStatusCode();
  310.                 if ($statusCode === 200 || $statusCode === 201) {
  311.                     $this->addFlash('success'"Le mail a été envoyé avec succès, vérifiez votre adresse électronique.");
  312.                     return  $this->redirectToRoute('app_reset_password_token',[
  313.                         'token' => $content['token']
  314.                     ]);
  315.                 } else {
  316.                     $this->addFlash('danger'"");
  317.                 }
  318.             } catch (Exception $e) {
  319.                 // Si la connexion échoue, affiche un message d'erreur à l'utilisateur
  320.                 $responseBody json_decode($e->getMessage());
  321.                 $this->addFlash('danger'$responseBody);
  322.             }
  323.         }
  324.         //redirection et envoie de la vue
  325.         return $this->render('security/reset_password/check_password.html.twig', [
  326.         ]);
  327.     }
  328.     #[Route('/reset_password/reset/{token}'name'app_reset_password_token')]
  329.     public function reset($tokenRequest $request): Response
  330.     {
  331.         
  332.         // Soumission du formulaire et validation
  333.         if ($request->isMethod('POST')) {
  334.             $password $request->request->get('password');
  335.             try {
  336.                 $response $this->registrationService->resetPost([
  337.                     'password' => $password,
  338.                     'token' => $token
  339.                 ]);
  340.                 $statusCode $response->getStatusCode();
  341.                 
  342.                 if ($statusCode === 200 || $statusCode === 201 || $statusCode === 202) {
  343.                     $this->addFlash('success'"Mot de passe réinitialisé avec succès.");
  344.                     return  $this->redirectToRoute('app_login');
  345.                 } else {
  346.                     $this->addFlash('danger'"Erreur de réinitialisation");
  347.                     return  $this->redirectToRoute('app_login');
  348.                 }
  349.             } catch (Exception $e) {
  350.                 // Si la connexion échoue, affiche un message d'erreur à l'utilisateur
  351.                 $responseBody json_decode($e->getMessage());
  352.                 $this->addFlash('danger'$responseBody);
  353.             }
  354.         }
  355.         //redirection et envoie de la vue
  356.         return $this->render('security/reset_password/reset.html.twig', [
  357.             'token' => $token
  358.         ]);
  359.     }
  360.     // endregion
  361. }