<?php
namespace App\Controller;
use App\Entity\User;
use App\Factory\Security\SecurityFormFactory;
use App\Services\Back\GoogleService;
use App\Services\Common\UserService;
use App\Services\DTV\YamlConfig\YamlReader;
use Exception;
use Psr\Log\LoggerInterface;
use Symfony\Bundle\FrameworkBundle\Controller\AbstractController;
use Symfony\Component\DependencyInjection\ParameterBag\ParameterBagInterface;
use Symfony\Component\HttpFoundation\Request;
use Symfony\Component\HttpFoundation\Response;
use Symfony\Component\Routing\Annotation\Route;
use Symfony\Component\Translation\TranslatableMessage;
use Symfony\Contracts\HttpClient\Exception\TransportExceptionInterface;
use Symfony\Contracts\HttpClient\HttpClientInterface;
/**
* Controller pour la gestion de l'inscription
*/
class RegistrationController extends AbstractController
{
private SecurityFormFactory $formFactory;
private YamlReader $yamlReader;
private LoggerInterface $logger;
private string $env;
private HttpClientInterface $client;
private ParameterBagInterface $params;
private UserService $userService;
public function __construct(
SecurityFormFactory $formFactory,
YamlReader $yamlReader,
LoggerInterface $logger,
string $env,
HttpClientInterface $client,
UserService $userService,
ParameterBagInterface $params
) {
$this->formFactory = $formFactory;
$this->yamlReader = $yamlReader;
$this->logger = $logger;
$this->env = $env;
$this->client = $client;
$this->userService = $userService;
$this->params = $params;
}
/**
* Formulaire d'inscription
*
* @Route("/register", name="app_register")
*/
public function register( Request $request ): Response
{
$registerConfig = $this->yamlReader->getRegister();
$user = $this->userService->initUser();
try {
$formRegister = $this->formFactory->generateRegisterForm( $user );
}
catch ( Exception $e ) {
throw $this->createNotFoundException( $e->getMessage() );
}
$formRegister->handleRequest( $request );
if ( $formRegister->isSubmitted() )
{
if($formRegister->has('captcha')){
$token = $formRegister->get('captcha')->getData();
if(!$this->params->get('recaptcha_verify_url')||!$this->params->get('recaptcha_secret')){
throw new Exception('Incomplete recaptcha configuration: missing URL or secret in ENV');
}
$url = $this->params->get('recaptcha_verify_url');
$data = [
'secret' => $this->params->get('recaptcha_secret'),
'response' => $token,
];
$response = $this->client->request('POST', $url, [
'headers' => [
'Content-Type' => 'application/x-www-form-urlencoded',
],
'body' => $data,
]);
if(!$response->toArray()['success']){
return $this->redirectToRoute('app_register');
}
}
try {
$formRegister = $this->formFactory->postValidateRegisterForm( $formRegister );
}
catch ( Exception $e )
{
if($this->env === 'dev') throw $e;
$this->addFlash( 'danger', new TranslatableMessage( 'impossible d\'exécuter la post validation du formulaire', [] ) );
$referer = $request->headers->get( 'referer' );
if(!$referer) return $this->redirectToRoute('app_register');
return $this->redirect( $referer );
}
if ( $formRegister->isValid() )
{
// Post traitement du formulaire d'inscription
try {
$response = $this->formFactory->postProcessingRegisterForm( $formRegister, $user );
}
catch ( Exception|TransportExceptionInterface $e )
{
if($this->env === 'dev') throw $e;
$this->logger->critical( $e->getMessage() );
$this->addFlash( 'danger', 'impossible d\'exécuter le post traitement du formulaire :' . $e->getMessage() );
$referer = $request->headers->get( 'referer' );
if(!$referer) return $this->redirectToRoute('app_register');
return $this->redirect( $referer );
}
if ( $response[ 'message' ] !== NULL ) {
$this->addFlash( isset($response['type']) ? $response['type'] : 'success', $response[ 'message' ] );
}
return $this->redirectToRoute( $response[ 'route' ] );
}
}
$twigPath = 'registration/register.html.twig';
if (
isset( $registerConfig[ 'folder' ] )
&& !in_array( $registerConfig[ 'folder' ], [ NULL, FALSE, '' ], TRUE )
) {
$twigPath = 'registration/' . $registerConfig[ 'folder' ] . '/register.html.twig';
}
return $this->render( $twigPath, [
'registrationForm' => $formRegister->createView(),
] );
}
/**
* Page d'attente de validation de l'inscription
*
* @Route("/register/waiting_validation", name="app_register_waiting_validation")
*
* @return Response
*/
public function waitingRegisterValidation(): Response
{
return $this->render( 'registration/waiting_register_validation.html.twig' );
}
}