src/Controller/RegistrationController.php line 74

Open in your IDE?
  1. <?php
  2. namespace App\Controller;
  3. use App\Entity\Organization;
  4. use App\Entity\UserReview;
  5. use App\Event\AppEvents;
  6. use App\Event\Review\UserEvent;
  7. use App\Helper\ReviewValidatorHelper;
  8. use App\Model\Builder\OrganizationBuilder;
  9. use App\Model\Builder\RegisterParty\UserBuilder;
  10. use App\ValueObject\SearchCriteria\OrganizationSearchCriteria;
  11. use App\ValueObject\SearchCriteria\ReviewSearchCriteria;
  12. use App\ValueObject\SearchCriteria\UserSearchCriteria;
  13. use App\ValueObject\UserTypes;
  14. use Ecommerce121\UtilBundle\Controller\ControllerBase;
  15. use Symfony\Component\Routing\Annotation\Route;
  16. use Sensio\Bundle\FrameworkExtraBundle\Configuration\Template;
  17. use App\Model\Builder\RegisterParty\UserBuilder as RegisterUserBuilder;
  18. use App\Model\Form\RegisterParty\UserForm as RegisterUserForm;
  19. use Symfony\Component\Form\FormError;
  20. use Symfony\Component\HttpFoundation\RedirectResponse;
  21. use Symfony\Component\HttpFoundation\Request;
  22. use Symfony\Component\Form\Form;
  23. use App\Entity\User;
  24. use Ecommerce121\UtilBundle\Controller\ControllerUtil;
  25. use Symfony\Component\HttpFoundation\Session\Session;
  26. use Symfony\Component\Security\Core\Encoder\EncoderFactoryInterface;
  27. use Ecommerce121\UtilBundle\Lib\ReflectionUtil;
  28. /**
  29.  * Class RegistrationController
  30.  *
  31.  * @Route("/registration")
  32.  */
  33. class RegistrationController extends ControllerBase
  34. {
  35.     /**
  36.      * @var EncoderFactoryInterface
  37.      */
  38.     protected $encoderFactory;
  39.     /**
  40.      * @var ReviewValidatorHelper
  41.      */
  42.     protected $reviewValidatorHelper;
  43.     /**
  44.      * RegistrationController constructor.
  45.      *
  46.      * @param ControllerUtil                  $controllerUtil
  47.      * @param EncoderFactoryInterface         $encoderFactory
  48.      * @param ReviewValidatorHelper           $reviewValidatorHelper
  49.      */
  50.     public function __construct(
  51.         ControllerUtil $controllerUtil,
  52.         EncoderFactoryInterface $encoderFactory,
  53.         ReviewValidatorHelper $reviewValidatorHelper
  54.     ) {
  55.         parent::__construct($controllerUtil);
  56.         $this->encoderFactory $encoderFactory;
  57.         $this->reviewValidatorHelper $reviewValidatorHelper;
  58.     }
  59.     /**
  60.      * @Route("", name="app_registration_index")
  61.      * @Template("Registration/index.html.twig")
  62.      *
  63.      * @param Request $request HTTP request.
  64.      *
  65.      * @return array|RedirectResponse
  66.      */
  67.     public function indexAction(Request $request)
  68.     {
  69.         $builder = new RegisterUserBuilder();
  70.         $builder->type UserTypes::REGISTER_PARTY;
  71.         $user $this->getUser();
  72.         $isNewUserOrSuperAdminUser $user instanceof User && $user->isSuperAdmin() || !$user instanceof User;
  73.         $otherRegParty $this->getEntityManager()->getRepository(Organization::class)->findOneBy(['name' => 'Other Registering Party (Organization)']);
  74.         $form $this->createForm(
  75.             RegisterUserForm::class,
  76.             $builder,
  77.             [
  78.                 'is_new' => true,
  79.                 'is_munireg' => false,
  80.                 'is_granted_admin' => false,
  81.                 'is_non_registered' => true,
  82.                 'is_captcha_for_register' => true,
  83.                 'only_super_admins' => $isNewUserOrSuperAdminUser,
  84.             ]
  85.         );
  86.         $form->handleRequest($request);
  87.         $isValidEmail $this->isValidEmail($form['email']->getData());
  88.         if ($form->isSubmitted() && !$isValidEmail) {
  89.             $form->get('email')->addError(new FormError('Email already in use.'));
  90.         }
  91.         if ($form->isSubmitted() && $form->isValid() && $isValidEmail) {
  92.             $registerAsIndividual = (bool) $request->request->get('registerAsIndividual');
  93.             $builder->registerAsIndividual $registerAsIndividual;
  94.             
  95.             $this->createUser($form$builder);
  96.             $detailUrl $this->generateUrl('app_login');
  97.             /** @var Session $session */
  98.             $session $request->getSession();
  99.             $session->getFlashBag()->add(
  100.                 'message_register',
  101.                 'Thank you for registering. Your account has been activated, and you can now have access to your registrations.'
  102.             );
  103.             return $this->redirect($detailUrl);
  104.         }
  105.         return ['builder' => $builder'form' => $form->createView(), 'otherRegParty' => $otherRegParty];
  106.     }
  107.     /**
  108.      * Creates user for both form's post Municipal and Register.
  109.      *
  110.      * @param Form $form
  111.      * @param UserBuilder $builder
  112.      * @return User
  113.      */
  114.     private function createUser(Form $form$builder)
  115.     {
  116.         $em $this->getEntityManager();
  117.         $user $builder->getEntity();
  118.         $encoder $this->encoderFactory->getEncoder(User::class);
  119.         $salt md5(uniqid(nulltrue));
  120.         $individualUserOrgId $_ENV['INDIVIDUAL_USER_ORGANIZATION_ID'];
  121.         $encodedPassword $encoder->encodePassword($form['password']->getData(), $salt);
  122.         $user->changePassword($encodedPassword);
  123.         ReflectionUtil::setInaccesibleProperty($user'salt'$salt);
  124.         if (!$user->getRegisterAsIndividual()) {
  125.             $user $this->associateOrganization($user);
  126.         }
  127.         $formData $form->getData();
  128.         if ($formData->registerAsIndividual) {
  129.             $user->setRegisterAsIndividual($formData->registerAsIndividual);
  130.         }
  131.         if ($builder->organization == null) {
  132.             if ($builder->registerAsIndividual === true) {
  133.                 $individualOwnerOrg  $this->getEntityManager()->getRepository(Organization::class)->findOneBy(['id' => $individualUserOrgId]);
  134.                 $user->setOrganization($individualOwnerOrg);
  135.             } else {
  136.                 $organization = new Organization(
  137.                     $user->getRequestedOrganization(),
  138.                     $user->getEmail(),
  139.                     $user->getAddressFirst(),
  140.                     $user->getZipCode(),
  141.                     $user->getCity(),
  142.                     $user->getState(),
  143.                     $user->getPhone(),
  144.                     Null,
  145.                     serialize(['www.munireg.com']),
  146.                 );
  147.                 $em->persist($organization);
  148.                 $user->setOrganization($organization);
  149.             }
  150.         }
  151.         $em->persist($user);
  152.         $em->flush();
  153.         $this->dispatchEvent(AppEvents::USER_REGISTRATION_APPROVED, new UserEvent($user));
  154.         return $user;
  155.     }
  156.     /**
  157.      * @param $email
  158.      *
  159.      * @return bool
  160.      */
  161.     private function isValidEmail($email)
  162.     {
  163.         $userCriteria = new UserSearchCriteria();
  164.         $userCriteria->email $email;
  165.         $users $this->getEntityManager()->getRepository(User::class)->countByCriteria($userCriteria);
  166.         $reviewCriteria = new ReviewSearchCriteria();
  167.         $reviewCriteria->email $email;
  168.         $reviewCriteria->userRegistration true;
  169.         $reviews $this
  170.             ->getEntityManager()
  171.             ->getRepository(UserReview::class)
  172.             ->countByCriteria($reviewCriteria);
  173.         $totalFound $users $reviews;
  174.         return ($totalFound == 0);
  175.     }
  176.     /**
  177.      * @param User $user
  178.      *
  179.      * @return User
  180.      */
  181.     private function associateOrganization(User $user)
  182.     {
  183.         $email $user->getEmail();
  184.         $arr explode('@'$email);
  185.         $domain $arr[1];
  186.         $criteria = new OrganizationSearchCriteria();
  187.         $criteria->domains $domain;
  188.         $name $user->getRequestedOrganization();
  189.         if ($name) {
  190.             $criteria->name $name;
  191.         }
  192.         $count $this->getEntityManager()->getRepository(Organization::class)->countByCriteria($criteria);
  193.         $organizations $this->getEntityManager()->getRepository(Organization::class)->search($criteria);
  194.         if ($count == 1) {
  195.             $organization $organizations[0];
  196.             $user->setOrganization($organization);
  197.         }
  198.         return $user;
  199.     }
  200. }