<?php
namespace App\Controller;
use App\Entity\City;
use App\Entity\RealEstateAgent;
use App\Entity\Region;
use App\Entity\User;
use App\Form\RegistrationCompanyProfileType;
use App\Form\RegistrationFormType;
use App\Form\RegistrationProfessionalProfileType;
use App\Form\RegistrationProjectLeaderType;
use App\Form\RegistrationRealEstateProfileType;
use App\Form\RegistrationTerritoryType;
use App\Security\EmailVerifier;
use App\Service\CompanySender;
use App\Service\CompanyService;
use App\Service\MailManager;
use App\Service\TerritorySender;
use Doctrine\Persistence\ManagerRegistry;
use Symfony\Bridge\Twig\Mime\TemplatedEmail;
use Symfony\Bundle\FrameworkBundle\Controller\AbstractController;
use Symfony\Component\Form\FormFactoryInterface;
use Symfony\Component\HttpFoundation\Request;
use Symfony\Component\HttpFoundation\Response;
use Symfony\Component\Mime\Address;
use Symfony\Component\PasswordHasher\Hasher\UserPasswordHasherInterface;
use Symfony\Component\Routing\Annotation\Route;
use Symfony\Component\Security\Http\Authentication\UserAuthenticatorInterface;
use Symfony\Component\Security\Http\Authenticator\FormLoginAuthenticator;
use Symfony\Contracts\Translation\TranslatorInterface;
use SymfonyCasts\Bundle\VerifyEmail\Exception\VerifyEmailExceptionInterface;
use function Symfony\Component\String\u;
class RegistrationController extends AbstractController
{
/** @var EmailVerifier */
private $emailVerifier;
public function __construct(EmailVerifier $emailVerifier)
{
$this->emailVerifier = $emailVerifier;
}
/**
* @Route({
* "en": "/register",
* "fr": "/inscription"
* }, name="app_register")
* @param Request $request
* @param UserPasswordHasherInterface $userPasswordHasherInterface
* @param UserAuthenticatorInterface $userAuthenticator
* @param FormLoginAuthenticator $formLoginAuthenticator
* @return Response
*/
public function register(
Request $request,
UserPasswordHasherInterface $userPasswordHasherInterface,
UserAuthenticatorInterface $userAuthenticator,
FormLoginAuthenticator $formLoginAuthenticator,
ManagerRegistry $registry,
TranslatorInterface $translator
): Response
{
$user = new User();
$form = $this->createForm(RegistrationFormType::class, $user);
$form->handleRequest($request);
if ($form->isSubmitted() && $form->isValid()) {
$user->setRoles([User::ROLE_CANDIDATE]);
// encode the plain password
$user->setPassword(
$userPasswordHasherInterface->hashPassword(
$user,
$form->get('plainPassword')->getData()
)
);
$user->setRegisterPage(User::REGISTER_PAGE);
$entityManager = $registry->getManager();
$entityManager->persist($user->getPerson());
$entityManager->persist($user);
$entityManager->flush();
// generate a signed url and email it to the user
$this->emailVerifier->sendEmailConfirmation('app_verify_email', $user,
(new TemplatedEmail())
->from(new Address('notifications@paris-jetequitte.com', 'Paris Je Te Quitte'))
->to($user->getEmail())
->subject($translator->trans('template_email.register.subject'))
->htmlTemplate('email/security/register.html.twig')
);
$utms = ['utm_source', 'utm_medium', 'utm_campaign', 'utm_term', 'utm_content'];
$utmParams = [];
foreach ($utms as $utm) {
if ($request->query->get($utm)) {
$utmParams[$utm] = $request->query->get($utm);
}
}
return $this->redirectToRoute('app_register_candidate_success', $utmParams);
}
return $this->render('registration/register.html.twig', [
'registrationForm' => $form->createView(),
]);
}
/**
* @Route({
* "en": "/success",
* "fr": "/compte-crée"
* }, name="app_register_candidate_success")
*/
public function registerCandidateSuccess(): Response
{
return $this->renderForm(
'registration/register_candidate_success.html.twig',
[
]
);
}
/**
* @Route({
* "en": "/your-project/success",
* "fr": "/ton-projet/success"
* }, name="app_landing_candidate_success")
*/
public function landingCandidateSuccess(): Response
{
return $this->renderForm(
'registration/landing_candidate_success.html.twig'
);
}
/**
* @Route({
* "en": "/your-project",
* "fr": "/ton-projet"
* }, name="app_your_project")
* @param Request $request
* @param UserPasswordHasherInterface $userPasswordHasherInterface
* @param UserAuthenticatorInterface $userAuthenticator
* @param FormLoginAuthenticator $formLoginAuthenticator
* @return Response
*/
public function landing(
Request $request,
UserPasswordHasherInterface $userPasswordHasherInterface,
UserAuthenticatorInterface $userAuthenticator,
FormLoginAuthenticator $formLoginAuthenticator,
ManagerRegistry $registry,
TranslatorInterface $translator,
MailManager $mailManager
): Response
{
$user = new User();
$form = $this->createForm(RegistrationProfessionalProfileType::class, $user);
$form->handleRequest($request);
if ($form->isSubmitted() && $form->isValid()) {
$entityManager = $registry->getManager();
$user->setRoles([User::ROLE_CANDIDATE]);
$profile = $user->getProfessionalProfile();
$profile->initByProfileType();
if ($profile->getRegions()->isEmpty()) {
$regions = $entityManager->getRepository(Region::class)
->findAll();
foreach ($regions as $region) {
$profile->addRegion($region);
}
}
$cities = $request->request->get('cities', []);
foreach ($cities as $cityId) {
$city = $entityManager->getRepository(City::class)
->find($cityId);
if ($city) {
$profile->addCity($city);
}
}
$utms = ['utm_source', 'utm_medium', 'utm_campaign', 'utm_term', 'utm_content'];
foreach ($utms as $utm) {
if ($request->query->get($utm)) {
$profile->{'set' . u($utm)->camel()}($request->query->get($utm));
}
}
// encode the plain password
$user->setPassword(
$userPasswordHasherInterface->hashPassword(
$user,
$form->get('plainPassword')->getData()
)
);
$user->setRegisterPage(User::LANDING_PAGE);
$entityManager->persist($user->getPerson());
$entityManager->persist($user);
$entityManager->persist($profile);
$entityManager->flush();
// generate a signed url and email it to the user
$this->emailVerifier->sendEmailConfirmation('app_verify_email', $user,
(new TemplatedEmail())
->from(new Address('notifications@paris-jetequitte.com', 'Paris Je Te Quitte'))
->to($user->getEmail())
->subject($translator->trans('template_email.register.subject'))
->htmlTemplate('email/security/register.html.twig')
);
$profile->setUser($user);
$mailManager->notificationCreateProfessionalProfile($profile, 'Landing');
//$this->addFlash('success', "Bienvenue sur Paris Je Te Quitte, nous venons de t'envoyer un e-mail afin de valider ton compte");
return $this->redirectToRoute('app_landing_candidate_success');
}
return $this->render('registration/landing.html.twig', [
'registrationForm' => $form->createView(),
]);
}
/**
* @Route("/verify/email", name="app_verify_email")
*/
public function verifyUserEmail(Request $request, MailManager $mailManager): Response
{
$this->denyAccessUnlessGranted('IS_AUTHENTICATED_FULLY');
// validate email confirmation link, sets User::isVerified=true and persists
try {
$this->emailVerifier->handleEmailConfirmation($request, $this->getUser());
} catch (VerifyEmailExceptionInterface $exception) {
$this->addFlash('verify_email_error', $exception->getReason());
return $this->redirectToRoute('app_register');
}
/** @var User $user */
$user = $this->getUser();
$mailManager->welcomeCandidate($user);
$this->addFlash('success', 'Votre e-mail a bien été validé.');
switch ($user->getRegisterPage()) {
case User::LANDING_PAGE:
return $this->redirectToRoute('app_candidate_index');
default:
if ($user->getProfessionalProfile()) {
return $this->redirectToRoute('app_candidate_index');
}
return $this->redirectToRoute('app_candidate_onboarding_myprofile');
}
}
/**
* @Route("/inscription/territoire", name="app_register_territory")
* @param Request $request
* @param UserPasswordHasherInterface $userPasswordHasherInterface
* @param UserAuthenticatorInterface $userAuthenticator
* @param FormLoginAuthenticator $formLoginAuthenticator
* @return Response
*/
public function registerTerritory(
Request $request,
UserPasswordHasherInterface $userPasswordHasherInterface,
ManagerRegistry $registry,
TerritorySender $sender
): Response
{
$user = new User();
$form = $this->createForm(RegistrationTerritoryType::class, $user);
$form->handleRequest($request);
if ($form->isSubmitted() && $form->isValid()) {
$territory = $user->getTerritory();
$user->setTerritory(null);
$user->setRoles([User::ROLE_TERRITORY]);
// encode the plain password
$user->setPassword(
$userPasswordHasherInterface->hashPassword(
$user,
$form->get('plainPassword')->getData()
)
);
$entityManager = $registry->getManager();
$entityManager->persist($user->getPerson());
$entityManager->persist($user);
$entityManager->flush();
$sender->notifyAdminNewUser($user, $territory);
// generate a signed url and email it to the user
/*$this->emailVerifier->sendEmailConfirmation('app_verify_email', $user,
(new TemplatedEmail())
->from(new Address('notifications@paris-jetequitte.com', 'Paris Je Te Quitte'))
->to($user->getEmail())
->subject($translator->trans('template_email.register.subject'))
->htmlTemplate('email/security/register.html.twig')
);*/
return $this->redirectToRoute('app_register_territory_success');
}
return $this->render('registration/register_territory.html.twig', [
'registrationForm' => $form->createView(),
]);
}
/**
* @Route("/inscription/annonce", name="app_register_project_leader")
* @param Request $request
* @param UserPasswordHasherInterface $userPasswordHasherInterface
* @param UserAuthenticatorInterface $userAuthenticator
* @param FormLoginAuthenticator $formLoginAuthenticator
* @return Response
*/
public function registerProjectLeader(
Request $request,
UserPasswordHasherInterface $userPasswordHasherInterface,
ManagerRegistry $registry,
UserAuthenticatorInterface $userAuthenticator,
FormLoginAuthenticator $formLoginAuthenticator
): Response
{
$user = new User();
$form = $this->createForm(RegistrationProjectLeaderType::class, $user);
$form->handleRequest($request);
if ($form->isSubmitted() && $form->isValid()) {
// encode the plain password
$user->setPassword(
$userPasswordHasherInterface->hashPassword(
$user,
$form->get('plainPassword')->getData()
)
);
switch ($form->get('typeProject')->getData()) {
case 'estate':
$user->setRoles([User::ROLE_PROJECT_ESTATE]);
break;
case 'project':
$user->setRoles([User::ROLE_PROJECT_OPPORTUNITY]);
break;
default:
throw new \Exception();
}
$entityManager = $registry->getManager();
$entityManager->persist($user->getPerson());
$entityManager->persist($user);
$entityManager->flush();
// generate a signed url and email it to the user
/*$this->emailVerifier->sendEmailConfirmation('app_verify_email', $user,
(new TemplatedEmail())
->from(new Address('notifications@paris-jetequitte.com', 'Paris Je Te Quitte'))
->to($user->getEmail())
->subject($translator->trans('template_email.register.subject'))
->htmlTemplate('email/security/register.html.twig')
);*/
$userAuthenticator->authenticateUser(
$user,
$formLoginAuthenticator,
$request
);
return $this->redirectToRoute('app_project_leader_index');
}
return $this->render('registration/register_project_leader.html.twig', [
'registrationForm' => $form->createView(),
]);
}
/**
* @Route("/inscription/territoire/confirmation", name="app_register_territory_success")
* @return Response
*/
public function registerTerritorySuccess(): Response
{
return $this->render('registration/register_territory_success.html.twig', [
]);
}
/**
* @Route("/inscription/entreprise/confirmation", name="app_register_company_success")
* @return Response
*/
public function registerCompanySuccess(): Response
{
return $this->render('registration/register_company_success.html.twig', [
]);
}
/**
* @Route("/inscription/entreprise", name="app_register_company")
* @param Request $request
* @param UserPasswordHasherInterface $userPasswordHasherInterface
* @param UserAuthenticatorInterface $userAuthenticator
* @param FormLoginAuthenticator $formLoginAuthenticator
* @return Response
*/
public function registerCompanyProfile(
Request $request,
UserPasswordHasherInterface $userPasswordHasherInterface,
UserAuthenticatorInterface $userAuthenticator,
FormLoginAuthenticator $formLoginAuthenticator,
ManagerRegistry $registry,
TranslatorInterface $translator,
CompanyService $companyService,
CompanySender $sender
): Response
{
$user = new User();
$form = $this->createForm(RegistrationCompanyProfileType::class, $user);
$form->handleRequest($request);
if ($form->isSubmitted() && $form->isValid()) {
$user->setRoles([User::ROLE_COMPANY]);
$user->setPassword(
$userPasswordHasherInterface->hashPassword(
$user,
$form->get('plainPassword')->getData()
)
);
$company = $user->getCompanyProfile();
$companyService->init($company);
$entityManager = $registry->getManager();
$entityManager->persist($user->getPerson());
$entityManager->persist($user);
$entityManager->persist($user->getCompanyProfile());
$entityManager->flush();
$sender->notifyAdminNewUser($user, $company);
/*// generate a signed url and email it to the user
$this->emailVerifier->sendEmailConfirmation('app_verify_email', $user,
(new TemplatedEmail())
->from(new Address('notifications@paris-jetequitte.com', 'Paris Je Te Quitte'))
->to($user->getEmail())
->subject($translator->trans('template_email.register.subject'))
->htmlTemplate('email/security/register.html.twig')
);*/
// do anything else you need here, like send an email
$userAuthenticator->authenticateUser(
$user,
$formLoginAuthenticator,
$request
);
return $this->redirectToRoute('app_company_profile_onboarding_profile');
}
return $this->render('registration/register_company_profile.html.twig', [
'registrationForm' => $form->createView(),
]);
}
/**
* @Route("/inscription/agence-immobiliere", name="app_register_real_estate")
* @param Request $request
* @param UserPasswordHasherInterface $userPasswordHasherInterface
* @param UserAuthenticatorInterface $userAuthenticator
* @param FormLoginAuthenticator $formLoginAuthenticator
* @return Response
*/
public function registerRealEstate(
Request $request,
UserPasswordHasherInterface $userPasswordHasherInterface,
UserAuthenticatorInterface $userAuthenticator,
FormLoginAuthenticator $formLoginAuthenticator,
ManagerRegistry $registry,
TranslatorInterface $translator
): Response
{
$user = new User();
$form = $this->createForm(RegistrationRealEstateProfileType::class, $user);
$form->handleRequest($request);
if ($form->isSubmitted() && $form->isValid()) {
$user->setRoles([User::ROLE_ADMIN_REAL_ESTATE]);
$user->setPassword(
$userPasswordHasherInterface->hashPassword(
$user,
$form->get('plainPassword')->getData()
)
);
$realEstate = $user->getRealEstateProfile();
$agent = new RealEstateAgent();
$agent->setRealEstate($realEstate);
$agent->setPerson($user->getPerson());
$entityManager = $registry->getManager();
$entityManager->persist($user->getPerson());
$entityManager->persist($user);
$entityManager->persist($agent);
$entityManager->persist($realEstate);
$entityManager->flush();
// generate a signed url and email it to the user
/*$this->emailVerifier->sendEmailConfirmation('app_verify_email', $user,
(new TemplatedEmail())
->from(new Address('notifications@paris-jetequitte.com', 'Paris Je Te Quitte'))
->to($user->getEmail())
->subject($translator->trans('template_email.register.subject'))
->htmlTemplate('email/security/register.html.twig')
);*/
// do anything else you need here, like send an email
$userAuthenticator->authenticateUser(
$user,
$formLoginAuthenticator,
$request
);
return $this->redirectToRoute('app_real_estate_profile_index');
}
return $this->render('registration/register_real_estate_profile.html.twig', [
'registrationForm' => $form->createView(),
]);
}
}