src/Controller/RegistrationController.php line 66

  1. <?php
  2. namespace App\Controller;
  3. use App\Entity\Association;
  4. use App\Entity\MemberRoleInsideAssociation;
  5. use App\Entity\RoleAssociationName;
  6. use App\Entity\User;
  7. use App\Entity\UserRoleAssociation;
  8. use App\Enums\RoleUrlEnum;
  9. use App\Form\UserAssociationRoleEmbeddedForm;
  10. use App\Handler\UdrugaPocetniInsertHandler;
  11. use App\Mailer\Email\RegistrationMailer;
  12. use App\Repository\AssociationRepository;
  13. use App\Repository\RoleRepository;
  14. use Doctrine\ORM\EntityManagerInterface;
  15. use Knp\Component\Pager\PaginatorInterface;
  16. use ReCaptcha\ReCaptcha;
  17. use Symfony\Component\DependencyInjection\ParameterBag\ParameterBagInterface;
  18. use Symfony\Component\HttpFoundation\Request;
  19. use Symfony\Component\HttpFoundation\Response;
  20. use Symfony\Component\PasswordHasher\Hasher\UserPasswordHasherInterface;
  21. use Symfony\Component\Routing\Annotation\Route;
  22. use Symfony\Component\Security\Core\Authentication\Token\Storage\TokenStorageInterface;
  23. use Symfony\Component\Security\Core\Authentication\Token\UsernamePasswordToken;
  24. use Twig\Environment;
  25. class RegistrationController extends AppController
  26. {
  27.     private ParameterBagInterface $params;
  28.     private RoleRepository $roleRepository;
  29.     private AssociationRepository $associationRepository;
  30.     private RegistrationMailer $registrationMailer;
  31.     public function __construct(
  32.         EntityManagerInterface $manager,
  33.         TokenStorageInterface $storage,
  34.         PaginatorInterface $paginator,
  35.         ParameterBagInterface $params,
  36.         RoleRepository $roleRepository,
  37.         AssociationRepository $associationRepository,
  38.         RegistrationMailer $registrationMailer
  39.     )
  40.     {
  41.         parent::__construct($manager$storage$paginator);
  42.         $this->params $params;
  43.         $this->roleRepository $roleRepository;
  44.         $this->associationRepository $associationRepository;
  45.         $this->registrationMailer $registrationMailer;
  46.     }
  47.     /**
  48.      * @Route("/registracija", name="user_registration")
  49.      * @param Request $request
  50.      * @param UdrugaPocetniInsertHandler $insertHandler
  51.      * @param UserPasswordHasherInterface $userPasswordHasher
  52.      * @param TokenStorageInterface $tokenStorage
  53.      * @return Response
  54.      */
  55.     public function registerAction(
  56.         Request $request,
  57.         UdrugaPocetniInsertHandler $insertHandler,
  58.         UserPasswordHasherInterface $userPasswordHasher,
  59.         TokenStorageInterface $tokenStorage
  60.     ): Response
  61.     {
  62.         if ($this->isGranted('ROLE_USER')) {
  63.             return $this->redirectToRoute('dashboard');
  64.         }
  65.         $userRoleAssociation = new UserRoleAssociation();
  66.         $userRoleAssociation->setCurrent(true);
  67.         $predsjednikRole $this->roleRepository
  68.             ->findOneBy([
  69.                 'slug' => RoleUrlEnum::PREDSJEDNIK_UDRUGE->value
  70.             ]);
  71.         $userRoleAssociation->addRoles($predsjednikRole);
  72.         return $this->formeRegistracije($request$insertHandler$userPasswordHasher$tokenStorage$userRoleAssociation);
  73.     }
  74.     /**
  75.      * @Route("/registracija-prijavitelj", name="user_registration_prijavitelj")
  76.      */
  77.     public function registerPrijaviteljAction(
  78.         Request $request,
  79.         UdrugaPocetniInsertHandler $insertHandler,
  80.         UserPasswordHasherInterface $userPasswordHasher,
  81.         TokenStorageInterface $tokenStorage
  82.     ): Response
  83.     {
  84.         if ($this->isGranted('ROLE_USER')) {
  85.             return $this->redirectToRoute('dashboard');
  86.         }
  87.         $userRoleAssociation = new UserRoleAssociation();
  88.         $userRoleAssociation->setCurrent(true);
  89.         $prijaviteljRole $this->roleRepository
  90.             ->findOneBy([
  91.                 'slug' => RoleUrlEnum::PRIJAVITELJ->value
  92.             ]);
  93.         $userRoleAssociation->addRoles($prijaviteljRole);
  94.         return $this->formeRegistracije($request$insertHandler$userPasswordHasher$tokenStorage$userRoleAssociation,/*$mailer*/);
  95.     }
  96.     private function formeRegistracije(
  97.         Request $request,
  98.         UdrugaPocetniInsertHandler $insertHandler,
  99.         UserPasswordHasherInterface $userPasswordHasher,
  100.         TokenStorageInterface $tokenStorage,
  101.         UserRoleAssociation $userRoleAssociation,
  102.     ): Response
  103.     {
  104.         $routeName $request->attributes->get('_route');
  105.         $view 'userSecurity/register.html.twig';
  106.         $statusUdruge Association::PROBNO;
  107.         $vrstaPlacanja Association::MJESECNO;
  108.         if ($routeName === 'user_registration_prijavitelj') {
  109.             $view 'userSecurity/register-prijavitelj.html.twig';
  110.             $statusUdruge Association::KORISTENJE;
  111.         }
  112.         $user = new User();
  113.         $user->setActive(true);
  114.         $association = new Association();
  115.         $association->setStatus($statusUdruge);
  116.         $association->setVrstaPlacanja($vrstaPlacanja);
  117.         $association->setDatumProbnogRada(new \DateTime());
  118.         $association->setLastSignedUser($user);
  119.         $association->setLastSignedDateTime(new \DateTime());
  120.         $association1 $this->associationRepository
  121.             ->findOneBy(['id'=>318]);
  122.         $userRoleAssociation->setAssociation($association);
  123.         $userRoleAssociation1 = new UserRoleAssociation();
  124.         $predsjednikRole1 $this->roleRepository
  125.             ->findOneBy([
  126.                 'slug' => RoleUrlEnum::PREDSJEDNIK_UDRUGE->value
  127.             ]);
  128.         $userRoleAssociation1->addRoles($predsjednikRole1);
  129.         $user->addUserRoleAssociation($userRoleAssociation1);
  130.         $user->addUserRoleAssociation($userRoleAssociation);
  131.         $form $this->createForm(UserAssociationRoleEmbeddedForm::class, $userRoleAssociation, [
  132.             'akcija' => 'associationRegister',
  133.             'validation_groups' => ['associationRegister']
  134.         ]);
  135.         $recaptchaPublicKey $this->params->get('google_recaptcha_site_key');
  136.         $form->handleRequest($request);
  137.         if ($form->isSubmitted() && $form->isValid()) {
  138.             /** @var UserRoleAssociation $userRoleAssociation */
  139.             $userRoleAssociation $form->getData();
  140.             $association $userRoleAssociation->getAssociation();
  141.             $recaptcha = new ReCaptcha($this->params->get('google_recaptcha_secret_key'));
  142.             $resp $recaptcha->verify($request->get('g-recaptcha-response'), $request->getClientIp());
  143.             if (!$resp->isSuccess()) {
  144.                 $this->addFlash('error'$this->getTranslator()->trans('recaptcha'));
  145.                 return $this->render(
  146.                     'userSecurity/register.html.twig',
  147.                     [
  148.                         'form' => $form->createView(),
  149.                         'recaptchaPublicKey' => $recaptchaPublicKey
  150.                     ]
  151.                 );
  152.             }
  153.             $user $userRoleAssociation->getUser();
  154.             $password $userPasswordHasher
  155.                 ->hashPassword($user$user->getPlainPassword());
  156.             $user->setPassword($password);
  157.             $this->registrationMailer->send($form->getData()->getUser(), $association);
  158.             $userRoleAssociation->setAssociation($association);
  159.             $userRoleAssociation1->setAssociation($association1);
  160.             $association $userRoleAssociation->getAssociation();
  161.             $association1 $userRoleAssociation1->getAssociation();
  162.             $insertHandler->pocetniInsert($association);
  163.             $insertHandler->pocetniInsert($association1);
  164.             if ($routeName === 'user_registration_prijavitelj') {
  165.                 $association->setPrijavitelj(true);
  166.                 $user->setPrijavitelj(true);
  167.             } else {
  168.                 $association->setPrijavitelj(false);
  169.                 $user->setPrijavitelj(false);
  170.             }
  171.             $this->getManager()->persist($userRoleAssociation);
  172.             $this->getManager()->persist($userRoleAssociation1);
  173.             $roles $this->roleRepository
  174.                 ->findAll();
  175.             foreach($roles as $role){
  176.                 $roleAssociationName = new RoleAssociationName();
  177.                 $roleAssociationName->setRole($role);
  178.                 $roleAssociationName->setAssociation($association);
  179.                 $roleAssociationName->setName($role->getName());
  180.                 $this->getManager()->persist($roleAssociationName);
  181.             }
  182.             $ulogaClanSkupstine = new MemberRoleInsideAssociation();
  183.             $ulogaClanSkupstine->setName('Član skupštine');
  184.             $ulogaClanSkupstine->setAssociation($association);
  185.             $this->getManager()->persist($ulogaClanSkupstine);
  186.             $ulogaPridruzeniClan = new MemberRoleInsideAssociation();
  187.             $ulogaPridruzeniClan->setName('Pridruženi član');
  188.             $ulogaPridruzeniClan->setAssociation($association);
  189.             $this->getManager()->persist($ulogaPridruzeniClan);
  190.             $ulogaNatjecatelj = new MemberRoleInsideAssociation();
  191.             $ulogaNatjecatelj->setName('Natjecatelj');
  192.             $ulogaNatjecatelj->setAssociation($association);
  193.             $this->getManager()->persist($ulogaNatjecatelj);
  194.             $ulogaPrednatjecatelj = new MemberRoleInsideAssociation();
  195.             $ulogaPrednatjecatelj->setName('Prednatjecatelj');
  196.             $ulogaPrednatjecatelj->setAssociation($association);
  197.             $this->getManager()->persist($ulogaPrednatjecatelj);
  198.             $ulogaRekreativac = new MemberRoleInsideAssociation();
  199.             $ulogaRekreativac->setName('Rekreativac');
  200.             $ulogaRekreativac->setAssociation($association);
  201.             $this->getManager()->persist($ulogaRekreativac);
  202.             $ulogaTrener = new MemberRoleInsideAssociation();
  203.             $ulogaTrener->setName('Trener');
  204.             $ulogaTrener->setAssociation($association);
  205.             $this->getManager()->persist($ulogaTrener);
  206.             $ulogaSudac = new MemberRoleInsideAssociation();
  207.             $ulogaSudac->setName('Sudac');
  208.             $ulogaSudac->setAssociation($association);
  209.             $this->getManager()->persist($ulogaSudac);
  210.             $ulogaUprava = new MemberRoleInsideAssociation();
  211.             $ulogaUprava->setName('Uprava');
  212.             $ulogaUprava->setAssociation($association);
  213.             $this->getManager()->persist($ulogaUprava);
  214.             $ulogaOstalo = new MemberRoleInsideAssociation();
  215.             $ulogaOstalo->setName('Ostalo');
  216.             $ulogaOstalo->setAssociation($association);
  217.             $this->getManager()->persist($ulogaOstalo);
  218.             $this->getManager()->flush();
  219.             $this->addFlash('success'$this->getTranslator()->trans("successfullyRegistered"));
  220.             $this->authenticateUser($user$tokenStorage);
  221.             return $this->redirectToRoute(
  222.                 'association_edit',
  223.                 ['slug' => $userRoleAssociation->getAssociation()->getSlug()]
  224.             );
  225.         }
  226.         return $this->render(
  227.             $view,
  228.             [
  229.                 'form' => $form->createView(),
  230.                 'recaptchaPublicKey' => $recaptchaPublicKey
  231.             ]
  232.         );
  233.     }
  234.     private function authenticateUser(User $userTokenStorageInterface $tokenStorage): void
  235.     {
  236.         $token = new UsernamePasswordToken($user'main'$user->getRoles());
  237.         $tokenStorage->setToken($token);
  238.     }
  239. }