<?php
namespace App\Controller;
use App\Entity\Applicants;
use App\Features\Core\IRoleManager;
use App\Form\RegistrationFormType;
use App\Repository\ApplicantsRepository;
use App\Security\EmailVerifier;
use Doctrine\DBAL\Exception\UniqueConstraintViolationException;
use Doctrine\ORM\EntityManagerInterface;
use Symfony\Bridge\Twig\Mime\TemplatedEmail;
use Symfony\Bundle\FrameworkBundle\Controller\AbstractController;
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\Contracts\Translation\TranslatorInterface;
use SymfonyCasts\Bundle\VerifyEmail\Exception\VerifyEmailExceptionInterface;
class RegistrationController extends AbstractController
{
private EmailVerifier $emailVerifier;
public function __construct(EmailVerifier $emailVerifier, private IRoleManager $roleManager, private string $mailFrom)
{
$this->emailVerifier = $emailVerifier;
}
#[Route('/inscription', name: 'applicant_register')]
public function register(Request $request, UserPasswordHasherInterface $userPasswordHasher,
EntityManagerInterface $entityManager, TranslatorInterface $translator): Response
{
if($this->roleManager->isApplicant()) {
return $this->redirectToRoute('applicant-profile');
}
$user = new Applicants();
$form = $this->createForm(RegistrationFormType::class, $user);
$form->handleRequest($request);
if ($form->isSubmitted() && $form->isValid()) {
if($form->get(RegistrationFormType::PASSWORD)->getData()
!==$form->get(RegistrationFormType::CONFIRMED_PASSWORD)->getData()){
$this->addFlash("error", $translator->trans("repeat_password.differ"));
}else{
$user->setHashPassword($userPasswordHasher->hashPassword($user, $form->get(RegistrationFormType::PASSWORD)->getData()));
try{
$entityManager->persist($user);
$entityManager->flush();
// generate a signed url and email it to the user
$this->sendEmailConfirmation($user);
$this->addFlash('notice', $translator->trans("registration.confirmation_email_send"));
return $this->redirectToRoute('applicant_register_confirm_email');
}catch (\Exception $e){
if($e instanceof UniqueConstraintViolationException){
$this->addFlash("error", $translator->trans("registration.user_already_exist", ['{{ email }}'=>$user->getEmail()]));
}else{
$this->addFlash("error", $translator->trans("something went wrong"));
}
}
}
}
return $this->render('registration/register.html.twig', [
'form' => $form->createView(),
'title'=>"Inscription"
]);
}
#[Route('/confirmer-mon-email', name: 'applicant_register_confirm_email')]
public function registrationSuccess(Request $request): Response
{
$email= $request->get("email");
return $this->render($email ? 'registration/confirm_account.html.twig' : 'registration/registration_success.html.twig', [
"email" => $email,
"title"=>"Confirmation de l'email"
]);
}
#[Route('/renvoyer-mail-confirmation/{email}/', name: 'applicant_resend_confirmation_mail')]
public function resentEmail(Applicants $applicant): Response
{
$this->sendEmailConfirmation($applicant);
$this->addFlash('notice', 'Un email de confirmation vous a été envoyé');
return $this->redirectToRoute("applicant_register_confirm_email");
}
#[Route('/verifier-mon-email', name: 'applicant_verify_email')]
public function verifyUserEmail(Request $request, TranslatorInterface $translator, ApplicantsRepository $applicantsRepository): Response
{
$id = $request->get('id');
if (null === $id) {
return $this->redirectToRoute('applicant_register');
}
$user = $applicantsRepository->find($id);
if (null === $user) {
return $this->redirectToRoute('applicant_register');
}
try {
$this->emailVerifier->handleEmailConfirmation($request, $user);
} catch (VerifyEmailExceptionInterface $exception) {
$this->addFlash('notice', $translator->trans($exception->getReason(), [], 'VerifyEmailBundle'));
return $this->redirectToRoute('applicant_register');
}
$this->addFlash('notice', "Compte confirmé avec succès. Vous pouvez à présent vous connecter");
return $this->redirectToRoute('applicant-profile');
}
/**
* @param Applicants $applicant
* @return void
*/
public function sendEmailConfirmation(Applicants $applicant): void
{
$this->emailVerifier->sendEmailConfirmation('applicant_verify_email', $applicant,
(new TemplatedEmail())
->from(new Address($this->mailFrom, 'NSIA BANQUE Bénin'))
->to($applicant->getEmail())
->subject('Confirmer votre adresse email')
->htmlTemplate('registration/confirmation_email.html.twig')
);
}
}