src/Controller/RegistrationController.php line 66
<?php
namespace App\Controller;
use App\Entity\Association;
use App\Entity\MemberRoleInsideAssociation;
use App\Entity\RoleAssociationName;
use App\Entity\User;
use App\Entity\UserRoleAssociation;
use App\Enums\RoleUrlEnum;
use App\Form\UserAssociationRoleEmbeddedForm;
use App\Handler\UdrugaPocetniInsertHandler;
use App\Mailer\Email\RegistrationMailer;
use App\Repository\AssociationRepository;
use App\Repository\RoleRepository;
use Doctrine\ORM\EntityManagerInterface;
use Knp\Component\Pager\PaginatorInterface;
use ReCaptcha\ReCaptcha;
use Symfony\Component\DependencyInjection\ParameterBag\ParameterBagInterface;
use Symfony\Component\HttpFoundation\Request;
use Symfony\Component\HttpFoundation\Response;
use Symfony\Component\PasswordHasher\Hasher\UserPasswordHasherInterface;
use Symfony\Component\Routing\Annotation\Route;
use Symfony\Component\Security\Core\Authentication\Token\Storage\TokenStorageInterface;
use Symfony\Component\Security\Core\Authentication\Token\UsernamePasswordToken;
use Twig\Environment;
class RegistrationController extends AppController
{
private ParameterBagInterface $params;
private RoleRepository $roleRepository;
private AssociationRepository $associationRepository;
private RegistrationMailer $registrationMailer;
public function __construct(
EntityManagerInterface $manager,
TokenStorageInterface $storage,
PaginatorInterface $paginator,
ParameterBagInterface $params,
RoleRepository $roleRepository,
AssociationRepository $associationRepository,
RegistrationMailer $registrationMailer
)
{
parent::__construct($manager, $storage, $paginator);
$this->params = $params;
$this->roleRepository = $roleRepository;
$this->associationRepository = $associationRepository;
$this->registrationMailer = $registrationMailer;
}
/**
* @Route("/registracija", name="user_registration")
* @param Request $request
* @param UdrugaPocetniInsertHandler $insertHandler
* @param UserPasswordHasherInterface $userPasswordHasher
* @param TokenStorageInterface $tokenStorage
* @return Response
*/
public function registerAction(
Request $request,
UdrugaPocetniInsertHandler $insertHandler,
UserPasswordHasherInterface $userPasswordHasher,
TokenStorageInterface $tokenStorage
): Response
{
if ($this->isGranted('ROLE_USER')) {
return $this->redirectToRoute('dashboard');
}
$userRoleAssociation = new UserRoleAssociation();
$userRoleAssociation->setCurrent(true);
$predsjednikRole = $this->roleRepository
->findOneBy([
'slug' => RoleUrlEnum::PREDSJEDNIK_UDRUGE->value
]);
$userRoleAssociation->addRoles($predsjednikRole);
return $this->formeRegistracije($request, $insertHandler, $userPasswordHasher, $tokenStorage, $userRoleAssociation);
}
/**
* @Route("/registracija-prijavitelj", name="user_registration_prijavitelj")
*/
public function registerPrijaviteljAction(
Request $request,
UdrugaPocetniInsertHandler $insertHandler,
UserPasswordHasherInterface $userPasswordHasher,
TokenStorageInterface $tokenStorage
): Response
{
if ($this->isGranted('ROLE_USER')) {
return $this->redirectToRoute('dashboard');
}
$userRoleAssociation = new UserRoleAssociation();
$userRoleAssociation->setCurrent(true);
$prijaviteljRole = $this->roleRepository
->findOneBy([
'slug' => RoleUrlEnum::PRIJAVITELJ->value
]);
$userRoleAssociation->addRoles($prijaviteljRole);
return $this->formeRegistracije($request, $insertHandler, $userPasswordHasher, $tokenStorage, $userRoleAssociation,/*$mailer*/);
}
private function formeRegistracije(
Request $request,
UdrugaPocetniInsertHandler $insertHandler,
UserPasswordHasherInterface $userPasswordHasher,
TokenStorageInterface $tokenStorage,
UserRoleAssociation $userRoleAssociation,
): Response
{
$routeName = $request->attributes->get('_route');
$view = 'userSecurity/register.html.twig';
$statusUdruge = Association::PROBNO;
$vrstaPlacanja = Association::MJESECNO;
if ($routeName === 'user_registration_prijavitelj') {
$view = 'userSecurity/register-prijavitelj.html.twig';
$statusUdruge = Association::KORISTENJE;
}
$user = new User();
$user->setActive(true);
$association = new Association();
$association->setStatus($statusUdruge);
$association->setVrstaPlacanja($vrstaPlacanja);
$association->setDatumProbnogRada(new \DateTime());
$association->setLastSignedUser($user);
$association->setLastSignedDateTime(new \DateTime());
$association1 = $this->associationRepository
->findOneBy(['id'=>318]);
$userRoleAssociation->setAssociation($association);
$userRoleAssociation1 = new UserRoleAssociation();
$predsjednikRole1 = $this->roleRepository
->findOneBy([
'slug' => RoleUrlEnum::PREDSJEDNIK_UDRUGE->value
]);
$userRoleAssociation1->addRoles($predsjednikRole1);
$user->addUserRoleAssociation($userRoleAssociation1);
$user->addUserRoleAssociation($userRoleAssociation);
$form = $this->createForm(UserAssociationRoleEmbeddedForm::class, $userRoleAssociation, [
'akcija' => 'associationRegister',
'validation_groups' => ['associationRegister']
]);
$recaptchaPublicKey = $this->params->get('google_recaptcha_site_key');
$form->handleRequest($request);
if ($form->isSubmitted() && $form->isValid()) {
/** @var UserRoleAssociation $userRoleAssociation */
$userRoleAssociation = $form->getData();
$association = $userRoleAssociation->getAssociation();
$recaptcha = new ReCaptcha($this->params->get('google_recaptcha_secret_key'));
$resp = $recaptcha->verify($request->get('g-recaptcha-response'), $request->getClientIp());
if (!$resp->isSuccess()) {
$this->addFlash('error', $this->getTranslator()->trans('recaptcha'));
return $this->render(
'userSecurity/register.html.twig',
[
'form' => $form->createView(),
'recaptchaPublicKey' => $recaptchaPublicKey
]
);
}
$user = $userRoleAssociation->getUser();
$password = $userPasswordHasher
->hashPassword($user, $user->getPlainPassword());
$user->setPassword($password);
$this->registrationMailer->send($form->getData()->getUser(), $association);
$userRoleAssociation->setAssociation($association);
$userRoleAssociation1->setAssociation($association1);
$association = $userRoleAssociation->getAssociation();
$association1 = $userRoleAssociation1->getAssociation();
$insertHandler->pocetniInsert($association);
$insertHandler->pocetniInsert($association1);
if ($routeName === 'user_registration_prijavitelj') {
$association->setPrijavitelj(true);
$user->setPrijavitelj(true);
} else {
$association->setPrijavitelj(false);
$user->setPrijavitelj(false);
}
$this->getManager()->persist($userRoleAssociation);
$this->getManager()->persist($userRoleAssociation1);
$roles = $this->roleRepository
->findAll();
foreach($roles as $role){
$roleAssociationName = new RoleAssociationName();
$roleAssociationName->setRole($role);
$roleAssociationName->setAssociation($association);
$roleAssociationName->setName($role->getName());
$this->getManager()->persist($roleAssociationName);
}
$ulogaClanSkupstine = new MemberRoleInsideAssociation();
$ulogaClanSkupstine->setName('Član skupštine');
$ulogaClanSkupstine->setAssociation($association);
$this->getManager()->persist($ulogaClanSkupstine);
$ulogaPridruzeniClan = new MemberRoleInsideAssociation();
$ulogaPridruzeniClan->setName('Pridruženi član');
$ulogaPridruzeniClan->setAssociation($association);
$this->getManager()->persist($ulogaPridruzeniClan);
$ulogaNatjecatelj = new MemberRoleInsideAssociation();
$ulogaNatjecatelj->setName('Natjecatelj');
$ulogaNatjecatelj->setAssociation($association);
$this->getManager()->persist($ulogaNatjecatelj);
$ulogaPrednatjecatelj = new MemberRoleInsideAssociation();
$ulogaPrednatjecatelj->setName('Prednatjecatelj');
$ulogaPrednatjecatelj->setAssociation($association);
$this->getManager()->persist($ulogaPrednatjecatelj);
$ulogaRekreativac = new MemberRoleInsideAssociation();
$ulogaRekreativac->setName('Rekreativac');
$ulogaRekreativac->setAssociation($association);
$this->getManager()->persist($ulogaRekreativac);
$ulogaTrener = new MemberRoleInsideAssociation();
$ulogaTrener->setName('Trener');
$ulogaTrener->setAssociation($association);
$this->getManager()->persist($ulogaTrener);
$ulogaSudac = new MemberRoleInsideAssociation();
$ulogaSudac->setName('Sudac');
$ulogaSudac->setAssociation($association);
$this->getManager()->persist($ulogaSudac);
$ulogaUprava = new MemberRoleInsideAssociation();
$ulogaUprava->setName('Uprava');
$ulogaUprava->setAssociation($association);
$this->getManager()->persist($ulogaUprava);
$ulogaOstalo = new MemberRoleInsideAssociation();
$ulogaOstalo->setName('Ostalo');
$ulogaOstalo->setAssociation($association);
$this->getManager()->persist($ulogaOstalo);
$this->getManager()->flush();
$this->addFlash('success', $this->getTranslator()->trans("successfullyRegistered"));
$this->authenticateUser($user, $tokenStorage);
return $this->redirectToRoute(
'association_edit',
['slug' => $userRoleAssociation->getAssociation()->getSlug()]
);
}
return $this->render(
$view,
[
'form' => $form->createView(),
'recaptchaPublicKey' => $recaptchaPublicKey
]
);
}
private function authenticateUser(User $user, TokenStorageInterface $tokenStorage): void
{
$token = new UsernamePasswordToken($user, 'main', $user->getRoles());
$tokenStorage->setToken($token);
}
}