<?php
namespace App\Controller\Security;
use App\Entity\BusinessSubscription;
use App\Entity\CustomerPhysical;
use App\Entity\User;
use App\Form\B2cSubscriptionType;
use App\Form\BusinessSubscriptionType;
use App\Form\UserType;
use App\Repository\CustomerRepository;
use App\Repository\MarketRepository;
use App\Repository\UserRepository;
use App\Service\EmailService;
use App\Service\FrontService;
use App\Service\ParameterService;
use App\Service\SignUpService;
use DateTime;
use Doctrine\ORM\EntityManagerInterface;
use Sherlockode\ConfigurationBundle\Manager\ParameterManagerInterface;
use Symfony\Bundle\FrameworkBundle\Controller\AbstractController;
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 Symfony\Contracts\Translation\TranslatorInterface;
class SignUpController extends AbstractController
{
public function __construct(private readonly EmailService $emailService,
private readonly ParameterManagerInterface $parameterManager,
private readonly TranslatorInterface $translator,
private readonly FrontService $frontService,
private readonly ParameterService $parameterService,
private readonly SignUpService $signUpService,
)
{
}
#[Route('/signUp', name: 'app_signUp', methods: ['GET', 'POST'])]
public function signUp(Request $request,
UserPasswordHasherInterface $userPasswordHasher,
EntityManagerInterface $entityManager,
MarketRepository $marketRepository,
CustomerRepository $customerRepository
): Response
{
$user = new User();
$user->setRoles(['ROLE_B2C']);
$user->setIsVerified(false);
$user->setActive(false);
$form = $this->createForm(B2cSubscriptionType::class, $user);
$form->handleRequest($request);
if ($form->isSubmitted() && $form->isValid()) {
$user->setPassword(
$userPasswordHasher->hashPassword(
$user,
$form->get('password')->getData()
)
);
$user->setUsername($user->getEmail());
$customer = new CustomerPhysical();
$customer->setEmail($user->getEmail());
$customer->setCivility("");
$customer->setFirstName($request->get('firstName'));
$customer->setLastName($request->get('lastName'));
$customer->setName($request->get('firstName'). ' '.$request->get('lastName'));
$customer->setShowAllHotelXml(true);
$customer->setMarket($marketRepository->find(1));
$customer->setCreatedAt(new DateTime());
$customer->setUpdatedAt(new DateTime());
$customer->setActive(false);
$customer->setCurrency($customerRepository->findOneBy(['isDefault' => 1])->getCurrency());
$email = $this->signUpService->prepareWelcomeEmailForCustomerB2C($customer);
$user->setCustomer($customer);
//$user->setPersonal(null);
//$entityManager->persist($customer);
$entityManager->persist($user);
$entityManager->persist($email);
$entityManager->flush();
//dd($user);
$message = "Veuillez consulter votre email ". $customer->getEmail(). " pour valider votre compte";
$this->addFlash('success', $message);
return $this->redirectToRoute("front_info_message");
}
return $this->renderForm('security/btoc/sign_up_btoc.html.twig', [
'form' => $form,
'society' => $this->parameterService->getSocietyParameters(),
'social_networks' => $this->frontService->getSocialNetworks(),
'currencies' => $this->frontService->getCurrencies(),
'agencies' => $this->frontService->getAgencies()
]);
}
#[Route('/verify/{token}', name: 'app_signup_verify_email')]
public function verifyUser(string $token,
EntityManagerInterface $entityManager,
UserRepository $userRepository,
TokenStorageInterface $tokenStorage,
): Response
{
// Find the user by the verification token
$user = $userRepository->findOneBy(['email' => base64_decode($token)]);
// error token
if(!$user){
$this->addFlash('error', "Une erreur est survenue. Merci de vérifier le lien d'activation");
return $this->redirectToRoute('front_info_message');
}
// error already verified
if($user->isVerified()){
$message = "Votre compte ".$user->getEmail()." est déjà activé";
$this->addFlash('error', $message);
return $this->redirectToRoute('front_info_message');
}
// verify account (B2C)
$customer = $user->getCustomer();
if (!$user->isVerified() && $customer && $customer instanceof CustomerPhysical) {
$user->setIsVerified(true);
$user->setActive(true);
$customer->setActive(true);
$entityManager->persist($customer);
$entityManager->persist($user);
$entityManager->flush();
// // these two lines are commented to impose signIn using LoginController
// $token = new UsernamePasswordToken($user, "main", $user->getRoles());
// $tokenStorage->setToken($token);
$message = "Félicitation, votre compte ".$user->getEmail()." est maintenant activé ! ";
$this->addFlash('success', $message);
return $this->redirectToRoute('front_info_message');
}
$this->addFlash('error', "Une erreur est survenue. Merci de vérifier le lien d'activation");
return $this->redirectToRoute('app_main');
}
#[Route('/signUpBtob', name: 'app_signUp_btob', methods: ['GET', 'POST'])]
function signUpBtob(
Request $request,
ParameterService $parameterService,
EntityManagerInterface $entityManager,
): Response
{
$subscription = new BusinessSubscription();
$subscription->setCreatedAt(new DateTime());
$subscription->setUpdatedAt(new DateTime());
$subscription->setApproved(null);
$form = $this->createForm(BusinessSubscriptionType::class, $subscription);
$form->handleRequest($request);
if ($form->isSubmitted() && $form->isValid()) {
$emailForCustomer = $this->signUpService->prepareB2BSubscriptionEmailToCustomer($subscription);
$emailForSociety = $this->signUpService->prepareB2BSubscriptionEmailToSociety($subscription);
$entityManager->persist($subscription);
$entityManager->persist($emailForCustomer);
$entityManager->persist($emailForSociety);
$entityManager->flush();
$message = "Votre demande d'inscription B2B a bien été reçue. Nous vous contacterons prochainement.";
$this->addFlash('success', $message);
return $this->redirectToRoute("front_info_message");
}
return $this->renderForm('security/btob/_sign_up_btob.html.twig', [
'agency' => $parameterService->getSocietyParameters(),
'form' => $form,
'society' => $this->parameterService->getSocietyParameters(),
'social_networks' => $this->frontService->getSocialNetworks(),
'currencies' => $this->frontService->getCurrencies(),
'agencies' => $this->frontService->getAgencies(),
'btn_login' => 'btn-primary btn-login px-5'
]);
}
#[Route('/define-password/{email}/{token}', name: 'app_account_define_password', methods: ['GET', 'POST'])]
public function defineUserPassword(
$email,
$token,
Request $request,
UserRepository $userRepository,
TokenStorageInterface $tokenStorage,
UserPasswordHasherInterface $userPasswordHasher
): Response
{
$user = $userRepository->findOneBy(['email' => $email]);
//$validToken = hash('md5', $user->getEmail());
$validToken = base64_encode($email);
if($validToken != $token){
$this->addFlash('error' , 'An error has occured !');
return $this->redirectToRoute('front_info_message');
}
$form = $this->createForm(UserType::class, $user, [
'disable_username' => true,
'disable_email' => true
]);
$form->handleRequest($request);
if ($form->isSubmitted() && $form->isValid()) {
$user->setPassword(
$userPasswordHasher->hashPassword(
$user,
$form->get('password')->get('first')->getData()
)
);
$userRepository->add($user, true);
//login
$token = new UsernamePasswordToken($user, "main", $user->getRoles());
$tokenStorage->setToken($token);
return $this->redirectToRoute('app_main');
}
return $this->renderForm('user/new.html.twig', [
'form' => $form,
'society' => $this->parameterService->getSocietyParameters(),
'social_networks' => $this->frontService->getSocialNetworks(),
'currencies' => $this->frontService->getCurrencies(),
'agencies' => $this->frontService->getAgencies()
]);
}
}