<?php
namespace App\Controller;
use App\Entity\User;
use App\Form\RegistrationFormType;
use App\Security\EmailVerifier;
use App\Security\AppCustomAuthenticator;
use Symfony\Bundle\FrameworkBundle\Controller\AbstractController;
use Symfony\Component\HttpFoundation\Request;
use Symfony\Component\HttpFoundation\Response;
use Symfony\Component\Routing\Annotation\Route;
use Symfony\Component\Security\Core\Encoder\UserPasswordEncoderInterface;
use Symfony\Component\Security\Guard\GuardAuthenticatorHandler;
use SymfonyCasts\Bundle\VerifyEmail\Exception\VerifyEmailExceptionInterface;
use App\Utils\UserManageHelper;
use Symfony\Component\HttpFoundation\JsonResponse;
use App\Repository\UserRepository;
use App\Utils\MailSpool;
use Symfony\Contracts\Translation\TranslatorInterface;
use App\Utils\LtsUtils;
use App\Command\ExecuteCommand;
use App\Entity\AdminUser;
use Doctrine\ORM\EntityManagerInterface;
use App\Entity\TcUserType;
use App\Utils\ManageLog;
use App\Entity\CompanyUser;
use App\Repository\CompanyRepository;
use App\Repository\InviteUserRepository;
use Symfony\Component\Uid\Ulid;
use App\Entity\Company;
use App\Entity\CompanySettings;
use App\Entity\InviteUser;
class RegistrationController extends AbstractController
{
private $emailVerifier;
private $userRepository;
private $mailSpool;
private $ltsUtils;
private $executeCommand;
private $manageLog;
private $translator;
private $em;
private $contact;
private $CompanyRepository;
private $InviteUserRepository;
public function __construct(EntityManagerInterface $em,EmailVerifier $emailVerifier, UserRepository $userRepository,MailSpool $mailSpool,TranslatorInterface $trans,LtsUtils $ltsUtils,ExecuteCommand $executeCommand,ManageLog $manageLog, \Symfony\Component\DependencyInjection\ContainerInterface $container, CompanyRepository $CompanyRepository,InviteUserRepository $InviteUserRepository)
{
$this->emailVerifier = $emailVerifier;
$this->userRepository = $userRepository;
$this->mailSpool = $mailSpool;
$this->ltsUtils = $ltsUtils;
$this->translator = $trans;
$this->executeCommand = $executeCommand;
$this->em = $em;
$this->container = $container;
$this->manageLog = $manageLog;
$this->CompanyRepository = $CompanyRepository;
$this->InviteUserRepository = $InviteUserRepository;
}
/**
* @Route("/register", name="app_register")
*/
public function register(Request $request, UserPasswordEncoderInterface $passwordEncoder, GuardAuthenticatorHandler $guardHandler, AppCustomAuthenticator $authenticator, UserManageHelper $userManageHelper): Response
{
$role = '';
$user = new User();
$details = array();
$tmp_roles = array();
$form = $this->createForm(RegistrationFormType::class, $user);
$form->handleRequest($request);
if ($form->isSubmitted() && $form->isValid()){
$details['first_name'] = $request->get('first_name');
$details['surname'] = $request->get('surname');
$details['phone_number'] = $request->get('phone_number');
$details['company_name'] = $request->get('company_name');
$details['company_address_1'] = $request->get('company_address_1');
$details['company_address_2'] = $request->get('company_address_2');
$details['town'] = $request->get('town');
$details['country'] = $request->get('country');
$details['postcode'] = $request->get('postcode');
$details['company_phone'] = $request->get('company_phone');
$details['email'] = $form->get('email')->getData();
$details['password'] = $passwordEncoder->encodePassword(
$user,
$form->get('plainPassword')->getData()
);
if ($request->get('user_type') == '') {
$tmp_roles[] = 'ROLE_USER';
} else {
$tmp_roles[] = $request->get('user_type');
}
$details['roles'] = $tmp_roles;
$details['isVerified'] = '0';
$details['request'] = $request;
$userManageHelper->createUser($details);
}
if ($this->getUser()){
$roles = $this->getUser()->getRoles();
if ($roles[0] === 'ROLE_ADMIN') {
$role = $this->getUser()->getRoles();
}
}
return $this->render('registration/register.html.twig', [
'registrationForm' => $form->createView(),
'role' => $role,
]);
}
/**
* @Route("/verify/email", name="app_verify_email")
*/
public function verifyUserEmail(Request $request): Response {
try {
$this->emailVerifier->handleEmailConfirmation($request);
} catch (VerifyEmailExceptionInterface $exception) {
$this->addFlash('verify_email_error', $exception->getReason());
print_r($exception->getReason());
return $this->redirectToRoute('app_login');
}
$this->addFlash('success', 'Your email address has been verified.');
return $this->redirectToRoute('app_login');
}
/**
* @Route("/verify-api", name="app_api_verify_email")
*/
public function verifyApiUserEmail(Request $request): Response
{
try {
$this->emailVerifier->handleEmailConfirmation($request);
} catch (VerifyEmailExceptionInterface $exception) {
$this->addFlash('verify_email_error', $exception->getReason());
print_r($exception->getReason());
return $this->redirectToRoute('app_set_new_password',['id' => convert_uuencode($request->get('id'))]);
}
$this->addFlash('success', 'Your email address has been verified.');
return $this->redirectToRoute('app_set_new_password',['id' => convert_uuencode($request->get('id'))]);
}
/**
* @Route("/signup/{companyId}", name="app_registration_page")
* sign up page view
* @param $companyId
* @return
*/
public function signUp($companyId=null,$inviteId =null)
{
$params['company_id'] = $companyId;
$params['inviteId'] = $inviteId;
$companyDetails = $this->em->getRepository(Company::class)->getCompanyDetails($companyId);
$inviteUserDetails = $this->em->getRepository(InviteUser::class)->getInviteUserDetails($inviteId);
$data =[];
if($companyDetails) {
$data['companyId'] = $companyDetails['id'];
$data['companyName'] = $companyDetails['companyTitle'];
}
if($inviteUserDetails) {
// Restriction for user create according to plans
$noOfUsers = $this->em->getRepository(CompanySettings::class)->getDefaultUserByCompanyId($companyId);
$userCount = $this->em->getRepository(CompanyUser::class)->getUserCountByCompanyId($companyId);
$data['userLimit'] = ($noOfUsers <= $userCount) ? true : false;
$data['emailId'] = $inviteUserDetails['emailId'];
$data['inviteId'] = $inviteId;
$data['userTypeId'] = $inviteUserDetails['role'];
}
return $this->render('security/signup.html.twig', $data);
}
}