src/Infra/Symfony/Controller/SecurityController.php line 135

  1. <?php
  2. declare(strict_types=1);
  3. namespace Infra\Symfony\Controller;
  4. use Doctrine\ORM\EntityManagerInterface;
  5. use Domain\Account\User\UseCase\Register\RegisterUserRequest;
  6. use Infra\Symfony\Form\Type\UserRegisterType;
  7. use Infra\Symfony\Persistance\Doctrine\Entity\Member;
  8. use Infra\Symfony\Persistance\Doctrine\Entity\MemberFamily;
  9. use Infra\Symfony\Persistance\Doctrine\Entity\User;
  10. use Infra\Symfony\Persistance\Doctrine\Repository\MemberFamilyRepository;
  11. use Infra\Symfony\Persistance\Doctrine\Repository\MemberRepository;
  12. use Infra\Symfony\Persistance\Doctrine\Repository\UserRepository;
  13. use Symfony\Component\Form\FormError;
  14. use Symfony\Component\HttpFoundation\Request;
  15. use Symfony\Component\HttpFoundation\RequestStack;
  16. use Symfony\Component\HttpFoundation\Response;
  17. use Symfony\Component\PasswordHasher\Hasher\UserPasswordHasherInterface;
  18. use Symfony\Component\Routing\Annotation\Route;
  19. use Symfony\Component\Security\Core\Security;
  20. use Symfony\Component\Security\Http\Authentication\AuthenticationUtils;
  21. use Symfony\Component\Security\Http\Authentication\UserAuthenticatorInterface;
  22. use Symfony\Component\Security\Http\Authenticator\FormLoginAuthenticator;
  23. use Symfony\Component\Security\Http\Util\TargetPathTrait;
  24. class SecurityController extends BaseController
  25. {
  26.     use TargetPathTrait;
  27.     public function __construct(
  28.         RequestStack $requestStack,
  29.         EntityManagerInterface $entityManager,
  30.         private readonly UserPasswordHasherInterface $hasher
  31.     ) {
  32.         parent::__construct($requestStack$entityManager);
  33.     }
  34.     #[Route('/register'name'security_register')]
  35.     public function register(
  36.         Request $request,
  37.         UserRepository $userRepository,
  38.         MemberRepository $membreRepository,
  39.         MemberFamilyRepository $familyRepository,
  40.         UserAuthenticatorInterface $userAuthenticator,
  41.         FormLoginAuthenticator $formLoginAuthenticator
  42.     ): Response {
  43.         $registerRequest = new RegisterUserRequest();
  44.         $form $this->createForm(UserRegisterType::class, $registerRequest);
  45.         $form->handleRequest($request);
  46.         if ($form->isSubmitted() && $form->isValid()) {
  47.             $user $userRepository->findOneByEmail($registerRequest->email);
  48.             if ($user) {
  49.                 return $this->redirectToRoute('security_login');
  50.             }
  51.             $member $membreRepository->findOneByEmail($registerRequest->email);
  52.             if ($member) {
  53.                 $user $this->createFromMember($member$registerRequest);
  54.                 $userAuthenticator->authenticateUser($user$formLoginAuthenticator$request);
  55.                 return $this->redirectToRoute('app_index');
  56.             }
  57.             $family $familyRepository->findOneByEmail($registerRequest->email);
  58.             if ($family) {
  59.                 $user $this->createFromFamily($family$registerRequest);
  60.                 $userAuthenticator->authenticateUser($user$formLoginAuthenticator$request);
  61.                 return $this->redirectToRoute('app_index');
  62.             }
  63.             $form->addError(new FormError("Nous ne trouvons pas cette adresse email dans notre liste de membre."));
  64.         }
  65.         return $this->render('security/register.html.twig', [
  66.             'form' => $form->createView(),
  67.         ]);
  68.     }
  69.     private function createFromMember(Member $memberRegisterUserRequest $registerRequest): User
  70.     {
  71.         $user = new User();
  72.         $user->setEmail($member->getEmail());
  73.         $user->setFirstName($member->getFirstname());
  74.         $user->setLastName($member->getLastname());
  75.         $user->setPassword($this->hasher->hashPassword($user$registerRequest->password));
  76.         $user->setRoles(['ROLE_USER']);
  77.         $this->getEntityManager()->persist($user);
  78.         $this->getEntityManager()->flush();
  79.         return $user;
  80.     }
  81.     private function createFromFamily(MemberFamily $familyRegisterUserRequest $registerRequest): User
  82.     {
  83.         $user = new User();
  84.         $user->setEmail($registerRequest->email);
  85.         $user->setLastName($family->getLastname());
  86.         $user->setPassword($this->hasher->hashPassword($user$registerRequest->password));
  87.         $user->setRoles(['ROLE_USER']);
  88.         $this->getEntityManager()->persist($user);
  89.         $this->getEntityManager()->flush();
  90.         return $user;
  91.     }
  92.     #[Route('/login'name'security_login')]
  93.     public function login(Request $requestSecurity $securityAuthenticationUtils $helper): Response
  94.     {
  95.         // if user is already logged in, don't display the login page again
  96.         if ($security->isGranted('ROLE_USER')) {
  97.             return $this->redirectToRoute('admin_dashboard');
  98.         }
  99.         return $this->render('security/login.html.twig', [
  100.             'error' => $helper->getLastAuthenticationError(),
  101.             'last_username' => $helper->getLastUsername(),
  102.             'page_title' => 'Clap\'Sabots',
  103.             'csrf_token_intention' => 'authenticate',
  104.         ]);
  105.     }
  106.     /**
  107.      * This is the route the user can use to logout.
  108.      *
  109.      * But, this will never be executed. Symfony will intercept this first
  110.      * and handle the logout automatically. See logout in config/packages/security.yaml
  111.      */
  112.     #[Route('/logout'name'security_logout')]
  113.     public function logout(): never
  114.     {
  115.         throw new \Exception('This should never be reached!');
  116.     }
  117. }