src/Controller/RegistrationController.php line 63
<?phpnamespace App\Controller;use App\Exceptions\RecaptchaException;use App\Exceptions\ValidationException;use App\Model\Registration\ProofForm;use App\Model\Registration\RegistrationForm;use App\Model\Registration\SubscriptionSignatureForm;use App\Services\Bank\BeneficiaryService;use App\Services\RecaptchaService;use App\Services\RegistrationService;use App\Services\TokenVerifier;use App\Services\User\AuthUserService;use Exception;use Symfony\Component\HttpFoundation\JsonResponse;use Symfony\Component\HttpFoundation\Request;use Symfony\Component\HttpFoundation\Response;use Symfony\Component\Routing\Annotation\Route;use Symfony\Component\Serializer\Exception\ExceptionInterface;use Symfony\Component\Serializer\SerializerInterface;use Symfony\Component\Validator\Validation;use Symfony\Contracts\HttpClient\Exception\ClientExceptionInterface;use Symfony\Contracts\HttpClient\Exception\RedirectionExceptionInterface;use Symfony\Contracts\HttpClient\Exception\ServerExceptionInterface;use Symfony\Contracts\HttpClient\Exception\TransportExceptionInterface;use Symfony\Contracts\HttpClient\HttpClientInterface;use Symfony\Contracts\Translation\TranslatorInterface;use Symfony\Bundle\FrameworkBundle\Controller\AbstractController;use Karser\Recaptcha3Bundle\Validator\Constraints\Recaptcha3Validator;class RegistrationController extends AbstractController{const REG_TOKEN_SESSION_KEY = 'REGISTRATION_TOKEN';const REG_USER_ID_SESSION_KEY = 'REGISTRATION_USER_ID';const REG_REQUEST_ID_SESSION_KEY = 'REGISTRATION_REQUEST_ID';const REG_REQUEST_COMPLETED_SESSION_KEY = 'REGISTRATION_REQUEST_COMPLETED';protected RegistrationService $registrationService;protected BeneficiaryService $beneficiaryService;private AuthUserService $authUserServive;private TokenVerifier $tokenVerifier;protected $recaptcha3Validator;protected $httpClient;protected $translator;public function __construct(RegistrationService $registrationService, Recaptcha3Validator $recaptcha3Validator, AuthUserService $authUserServive,HttpClientInterface $httpClient, TranslatorInterface $translator, BeneficiaryService $beneficiaryService,TokenVerifier $tokenVerifier){$this->translator = $translator;$this->registrationService = $registrationService;$this->recaptcha3Validator = $recaptcha3Validator;$this->httpClient = $httpClient;$this->beneficiaryService = $beneficiaryService;$this->authUserServive = $authUserServive;$this->tokenVerifier = $tokenVerifier;}#[Route('/register', name: 'app_register')]public function register(Request $request): Response{$user_id = $request->getSession()->get(self::REG_USER_ID_SESSION_KEY);$request_id = $request->getSession()->get(self::REG_REQUEST_COMPLETED_SESSION_KEY);$completed = $request->getSession()->get(self::REG_REQUEST_COMPLETED_SESSION_KEY, false);$beneficiary_token = $request->get('token');$beneficiary = null;if (!empty($beneficiary_token)) {$beneficiary = $this->beneficiaryService->getBeneficiaryByToken($beneficiary_token);if ($beneficiary->client !== null) {$this->addFlash('danger', 'Vous disposez déjà d\'un compte. Connectez-vous pour gérer votre invitation.');return $this->redirectToRoute('app_login');}}if ($completed && $user_id !== null && $request_id !== null) {return $this->redirectToRoute('app_registration_success');}return $this->render('security/registration/index.html.twig', ['beneficiary' => $beneficiary,]);}#[Route('/registration/save', name: 'app_registration_save', methods: ['GET', 'POST'])]public function save(Request $request, SerializerInterface $serializer, RecaptchaService $recaptchaService): Response{try {$input = $serializer->deserialize($request->getContent(), RegistrationForm::class, 'json');try {$recaptchaService->verify($input->captchaToken, 'registration');} catch (RecaptchaException $exception) {return new JsonResponse(['message' => $exception->getFormattedMessages(),], 500);}$validator = Validation::createValidatorBuilder()->enableAnnotationMapping()->getValidator();$form_errors = $validator->validate($input, null, $input->getGroupSequence());if (count($form_errors) > 0) {$errors = [];foreach ($form_errors as $error) {$errors[] = ['message' => $this->translator->trans($error->getMessageTemplate(), $error->getParameters(), 'validators'),'property' => $error->getPropertyPath(),];}return new JsonResponse(['message' => $this->translator->trans('form.errors.invalid', [], 'account'),'errors' => $errors,], 400);}$isNew = true;if (!$request->getSession()->has(self::REG_USER_ID_SESSION_KEY)) {$user = $this->registrationService->postRegistration($input);if ($user === null) {throw new Exception('Problème technique lors de la création de votre compte.');}$request->getSession()->set(self::REG_USER_ID_SESSION_KEY, $user->id);$request->getSession()->set(self::REG_REQUEST_ID_SESSION_KEY, $user->requestId);$request->getSession()->set(self::REG_TOKEN_SESSION_KEY, $user->accessToken);} else {$isNew = false;}return new JsonResponse(['success' => true,'message' => $this->translator->trans('form.success.'.($isNew ? 'create':'update'), [], 'account'),]);} catch (ValidationException $exception) {return new JsonResponse(['message' => $exception->getMessage(),'errors' => $exception->getErrors(),], 400);} catch (Exception $exception) {return new JsonResponse(['message' => $exception->getMessage()], Response::HTTP_INTERNAL_SERVER_ERROR);}}#[Route('/registration/proofs/save', name: 'app_registration_save_proofs', methods: ['POST'])]public function saveProofs(Request $request, SerializerInterface $serializer): Response{try {/** @var ProofForm $input */$input = $serializer->deserialize($request->getContent(), ProofForm::class, 'json');if (empty($input->userId)) {$input->userId = (int)($request->getSession()->get(self::REG_USER_ID_SESSION_KEY, 0));}$validator = Validation::createValidatorBuilder()->enableAnnotationMapping()->getValidator();$form_errors = $validator->validate($input, null, $input->getGroupSequence());if (count($form_errors) > 0) {$errors = [];foreach ($form_errors as $error) {$errors[] = ['message' => $this->translator->trans($error->getMessageTemplate(), $error->getParameters(), 'validators'),'property' => $error->getPropertyPath(),];}return new JsonResponse(['message' => $this->translator->trans('form.errors.invalid', [], 'account'),'errors' => $errors,], 400);}$this->registrationService->saveProof($input);if (!empty($input->userId) && $this->tokenVerifier->isTokenValid()) {$this->authUserServive->getAllAboutMe(true);}return new JsonResponse(['success' => true,'message' => $this->translator->trans('form.success.proof', [], 'account'),]);} catch (ValidationException $exception) {return new JsonResponse(['message' => $exception->getMessage(),'errors' => $exception->getErrors(),], 400);} catch (Exception $exception) {return new JsonResponse(['message' => $exception->getMessage()], Response::HTTP_INTERNAL_SERVER_ERROR);}}#[Route('/registration/generate/subscription', name: 'app_registration_generate_subscription', methods: ['POST'])]public function generateSubscription(Request $request): Response{$content = $this->registrationService->generateSubscription(json_decode($request->getContent(), true));if ($content === null) {return new JsonResponse(['success' => false,'message' => 'Suite à une erreur technique, nous ne sommes pas dans la mesure de générer votre bulletin de souscription. Contactez l\'assistance',]);}return new Response(base64_encode($content), 200, ['Cache-Control' => 'private',]);}/*** @param Request $request* @param SerializerInterface $serializer* @return Response* @throws ExceptionInterface* @throws ClientExceptionInterface* @throws RedirectionExceptionInterface* @throws ServerExceptionInterface* @throws TransportExceptionInterface*/#[Route('/registration/subscription/signature', name: 'app_registration_subscription_signature', methods: ['POST'])]public function postSubscriptionSignature(Request $request, SerializerInterface $serializer): Response{try {/** @var SubscriptionSignatureForm $input */$input = $serializer->deserialize($request->getContent(), SubscriptionSignatureForm::class, 'json');if (empty($input->userId)) {$input->userId = (int) ($request->getSession()->get(self::REG_USER_ID_SESSION_KEY, 0));}$validator = Validation::createValidatorBuilder()->enableAnnotationMapping()->getValidator();$form_errors = $validator->validate($input, null, $input->getGroupSequence());if (count($form_errors) > 0) {$errors = [];foreach ($form_errors as $error) {$errors[] = ['message' => $this->translator->trans($error->getMessageTemplate(), $error->getParameters(), 'validators'),'property' => $error->getPropertyPath(),];}return new JsonResponse(['message' => $this->translator->trans('form.errors.invalid', [], 'account'),'errors' => $errors,], 400);}$this->registrationService->saveSubscriptionSignature($input);$request->getSession()->set(self::REG_REQUEST_COMPLETED_SESSION_KEY, true);if (!empty($input->userId) && $this->tokenVerifier->isTokenValid()) {$this->authUserServive->getAllAboutMe(true);}return new JsonResponse(['success' => true,'message' => $this->translator->trans('form.success.signature', [], 'account'),]);} catch (ValidationException $exception) {return new JsonResponse(['message' => $exception->getMessage(),'errors' => $exception->getErrors(),], 400);} catch (Exception $exception) {return new JsonResponse(['message' => $exception->getMessage()], Response::HTTP_INTERNAL_SERVER_ERROR);}}#[Route('/subscription/success', name: 'app_registration_success', methods: ['GET'])]public function subscriptionSuccess(Request $request){$user_id = $request->getSession()->get(self::REG_USER_ID_SESSION_KEY);$request_id = $request->getSession()->get(self::REG_REQUEST_ID_SESSION_KEY);$access_token = $request->getSession()->get(self::REG_TOKEN_SESSION_KEY);$completed = $request->getSession()->get(self::REG_REQUEST_COMPLETED_SESSION_KEY, false);if (!$completed || $user_id === null || $request_id === null) {return $this->redirectToRoute('app_register');}$request->getSession()->remove(self::REG_TOKEN_SESSION_KEY);$request->getSession()->remove(self::REG_USER_ID_SESSION_KEY);$request->getSession()->remove(self::REG_REQUEST_ID_SESSION_KEY);$request->getSession()->remove(self::REG_REQUEST_COMPLETED_SESSION_KEY);return $this->render('security/registration/success.html.twig');}// region RESET PASSWORD#[Route('/reset_request', name: 'app_reset_request')]public function resetRequest(Request $request): Response{// Soumission du formulaire et validationif ($request->isMethod('POST')) {$email = $request->request->get('email');try {$response = $this->registrationService->resetPassword($email);$statusCode = $response->getStatusCode();if ($statusCode === 200 || $statusCode === 201) {$this->addFlash('success', "Le mail a été envoyé avec succès, vérifiez votre adresse électronique.");return $this->redirectToRoute('app_reset_check_password');} else {$this->addFlash('danger', "une erreur a été générée, veuillez vérifier votre adresse e-mail");return $this->redirectToRoute('app_reset_request');}} catch (Exception $e) {// Si la connexion échoue, affiche un message d'erreur à l'utilisateur$responseBody = json_decode($e->getMessage());$this->addFlash('danger', $responseBody);}}//redirection et envoie de la vuereturn $this->render('security/reset_password/request.html.twig', []);}#[Route('/check_password_reset', name: 'app_reset_check_password')]public function checkPassword(Request $request): Response{// Soumission du formulaire et validationif ($request->isMethod('POST')) {$phone = $request->request->get('phone');$email = $request->request->get('email');$code = $request->request->get('code');try {$response = $this->registrationService->checkResetPassword(['phone' => $phone,'email' => $email,'code' => $code]);$content = json_decode($response->getContent(), true);$statusCode = $response->getStatusCode();if ($statusCode === 200 || $statusCode === 201) {$this->addFlash('success', "Le mail a été envoyé avec succès, vérifiez votre adresse électronique.");return $this->redirectToRoute('app_reset_password_token',['token' => $content['token']]);} else {$this->addFlash('danger', "");}} catch (Exception $e) {// Si la connexion échoue, affiche un message d'erreur à l'utilisateur$responseBody = json_decode($e->getMessage());$this->addFlash('danger', $responseBody);}}//redirection et envoie de la vuereturn $this->render('security/reset_password/check_password.html.twig', []);}#[Route('/reset_password/reset/{token}', name: 'app_reset_password_token')]public function reset($token, Request $request): Response{// Soumission du formulaire et validationif ($request->isMethod('POST')) {$password = $request->request->get('password');try {$response = $this->registrationService->resetPost(['password' => $password,'token' => $token]);$statusCode = $response->getStatusCode();if ($statusCode === 200 || $statusCode === 201 || $statusCode === 202) {$this->addFlash('success', "Mot de passe réinitialisé avec succès.");return $this->redirectToRoute('app_login');} else {$this->addFlash('danger', "Erreur de réinitialisation");return $this->redirectToRoute('app_login');}} catch (Exception $e) {// Si la connexion échoue, affiche un message d'erreur à l'utilisateur$responseBody = json_decode($e->getMessage());$this->addFlash('danger', $responseBody);}}//redirection et envoie de la vuereturn $this->render('security/reset_password/reset.html.twig', ['token' => $token]);}// endregion}