<?php
namespace App\Controller;
use App\Entity\User;
use App\Form\RegisterType;
use App\Services\UserSession;
use App\Form\UpdatePasswordType;
use App\Repository\UserRepository;
use Symfony\Component\Mime\Address;
use App\Form\ChangePasswordFormType;
use Doctrine\ORM\EntityManagerInterface;
use App\Form\ResetPasswordRequestFormType;
use App\Form\RequestVerifyUserEmailFormType;
use Symfony\Bridge\Twig\Mime\TemplatedEmail;
use Symfony\Component\HttpFoundation\Request;
use Symfony\Component\Mailer\MailerInterface;
use Symfony\Component\HttpFoundation\Response;
use Symfony\Component\Routing\Annotation\Route;
use Symfony\Component\Form\Extension\Core\Type\ChoiceType;
use SymfonyCasts\Bundle\VerifyEmail\VerifyEmailHelperInterface;
use Symfony\Bundle\FrameworkBundle\Controller\AbstractController;
use SymfonyCasts\Bundle\ResetPassword\ResetPasswordHelperInterface;
use Symfony\Component\Security\Http\Authentication\AuthenticationUtils;
use Symfony\Component\PasswordHasher\Hasher\UserPasswordHasherInterface;
use SymfonyCasts\Bundle\VerifyEmail\Exception\VerifyEmailExceptionInterface;
use SymfonyCasts\Bundle\ResetPassword\Controller\ResetPasswordControllerTrait;
use SymfonyCasts\Bundle\ResetPassword\Exception\ResetPasswordExceptionInterface;
use Sensio\Bundle\FrameworkExtraBundle\Configuration\Security;
use Symfony\Component\Security\Http\Attribute\IsGranted;
class AuthController extends AbstractController
{
use ResetPasswordControllerTrait;
private $verifyEmailHelper;
private $mailer;
private $manager;
private $userSession;
public function __construct(
private ResetPasswordHelperInterface $resetPasswordHelper,
private EntityManagerInterface $entityManager,
VerifyEmailHelperInterface $helper,
MailerInterface $mailer,
EntityManagerInterface $manager,
UserSession $userSession,
) {
$this->verifyEmailHelper = $helper;
$this->mailer = $mailer;
$this->manager = $manager;
$this->userSession = $userSession;
}
// /**
// * @Route("/connexion", name="security.login", methods={"GET","POST"})
// */
#[Route('/connexion', name:'security.login', methods: ['POST','GET'])]
public function login(AuthenticationUtils $authenticationUtils, Request $request): Response
{
$previousRoutePath = $request->headers->get('referer');
// dd($_COOKIE["__ga_ru__"]);
if (!empty($previousRoutePath)) {
if (!isset($_COOKIE["__ga_ru__"])) {
$this->userSession->setCookies($previousRoutePath);
}
}
if ($this->userSession->checkIfSessionAndConnected() == true) {
return $this->redirect($previousRoutePath,302);
}
// if ($this->getUser()) {
// return $this->redirect($previousRoutePath,302);
// }
// last username entered by the user
$lastUsername = $authenticationUtils->getLastUsername();
// dd($authenticationUtils->getLastAuthenticationError()->getMessage());
// get the login error if there is one
$error = $authenticationUtils->getLastAuthenticationError();
if ($error && $error->getMessage() != "An authentication exception occurred.") {
return $this->render('auth/login.html.twig', [
'last_username' => $lastUsername,
'error' => $error
]);
} else {
return $this->render('auth/login.html.twig', [
'last_username' => $lastUsername,
]);
}
}
// /**
// * Formulaire d'inscription utilisateur
// * @Route("/inscription", name="register", methods={"GET", "POST"})
// *
// * @param Request $request
// * @param EntityManagerInterface $manager
// * @return Response
// */
#[Route('/inscription', name:'register', methods: ["GET","POST"])]
public function register(Request $request): Response
{
$previousRoutePath = $request->headers->get('referer');
$parsedUrl = parse_url($previousRoutePath);
$previousDomain = isset($parsedUrl['host']) ? $parsedUrl['host'] : null;
$user = new User();
$user->setRoles(['ROLE_USER']);
$form = $this->createForm(RegisterType::class, $user);
if (in_array($previousDomain,['annonces.abidjan.net','ticket.abidjan.net'])) {
$form->add('typeCompte', ChoiceType::class, [
'choices' => [
'Organisation' => 'Organisation',
'Particulier' => 'Particulier',
],
'attr' => [
'class' => 'form-control form-select-styled',
],
'label' => 'Type de compte*',
'label_attr' => [
'class' => 'form-label'
],
]);
}else{
$user->setTypeCompte('Particulier');
}
$form->handleRequest($request);
if ($form->isSubmitted() && $form->isValid()) {
$user = $form->getData();
$dialCode = $request->request->get('dial_code');
if (empty($dialCode)) {
$this->addFlash(
'error',
'Veuillez sélectionner le code pays!'
);
return $this->redirectToRoute('register');
}
$nom_complet = $user->getNom() . ' ' . $user->getPrenoms();
$user->setNomComplet($nom_complet);
$user->setUsername($user->getEmail());
$user->setDialCode($dialCode);
$user->setIsAdmin(false);
$this->manager->persist($user);
$this->manager->flush();
$signatureComponents = $this->verifyEmailHelper->generateSignature(
'registration_confirmation_route',
$user->getId(),
$user->getEmail(),
['id' => $user->getId()]
);
$email = new TemplatedEmail();
$email->from('abidjan.net@weblogy.com');
$email->to($user->getEmail());
$email->subject('Vérification de compte');
$email->htmlTemplate('auth/confirmation_email.html.twig');
$email->context(['signedUrl' => $signatureComponents->getSignedUrl()]);
$this->mailer->send($email);
$this->addFlash(
'info',
'Un email de confirmation vous a été envoyé pour la vérification de votre compte. Si le mail n\'apparait pas dans la boite de réception, veuillez vérifier dans les spams!'
);
if (isset($_COOKIE['__ga_reu__'])) {
$url = $_COOKIE['__ga_reu__'];
return $this->redirect($url);
}
return $this->redirectToRoute('security.login');
}
return $this->render('auth/register.html.twig', ['form' => $form->createView()]);
}
// /**
// * @Route("/verify", name="registration_confirmation_route")
// */
#[Route('/verify', name:'registration_confirmation_route', methods: ["GET","POST"])]
public function verifyUserEmail(Request $request, UserRepository $userRepository): Response
{
// $this->denyAccessUnlessGranted('IS_AUTHENTICATED_FULLY');
// $user = $this->getUser();
$user = $userRepository->find($request->get('id'));
if (!$user) {
$this->addFlash(
'error',
'Utilisateur non trouvé!'
);
return $this->redirectToRoute('security.login');
}
// Do not get the User's Id or Email Address from the Request object
try {
$this->verifyEmailHelper->validateEmailConfirmation($request->getUri(), $user->getId(), $user->getEmail());
} catch (VerifyEmailExceptionInterface $e) {
$this->addFlash('error', $e->getReason());
return $this->redirectToRoute('register');
}
// Mark your user as verified. e.g. switch a User::verified property to true
$user->setEmailVerified(true);
$user->setActif(true);
$this->manager->persist($user);
$this->manager->flush();
$this->addFlash(
'success',
'Votre adresse email a été vérifiée avec succès!'
);
if (isset($_COOKIE['__ga_reu__'])) {
$url = $_COOKIE['__ga_reu__'];
return $this->redirect($url);
}
return $this->redirectToRoute('app_front_home');
}
// /**
// * @Route("/verify/resend", name="app_verify_resend_email")
// */
#[Route('/verify/resend', name:'app_verify_resend_email', methods: ["GET","POST"])]
public function resendVerifyEmail(Request $request, UserRepository $userRepository)
{
if ($this->getUser()) {
return $this->redirectToRoute('app_front_home');
}
$userEmail = $request->get('email');
// $this->addFlash(
// 'r_info',
// 'Un courriel de vérification d\'email vous a été envoyé par mail, veuillez cliquer le lien dans le mail pour activer votre compte avant connexion.!'
// );
$form = $this->createForm(RequestVerifyUserEmailFormType::class);
$form->handleRequest($request);
if ($form->isSubmitted() && $form->isValid()) {
// generate a signed url and email it to the user
$user = $userRepository->findOneByEmail($form->get('email')->getData());
if ($user) {
$signatureComponents = $this->verifyEmailHelper->generateSignature(
'registration_confirmation_route',
$user->getId(),
$user->getEmail(),
['id' => $user->getId()]
);
$email = new TemplatedEmail();
$email->from('abidjan.net@weblogy.com');
$email->to($user->getEmail());
$email->subject('Vérification de compte');
$email->htmlTemplate('auth/confirmation_email.html.twig');
$email->context(['signedUrl' => $signatureComponents->getSignedUrl()]);
$this->mailer->send($email);
$this->addFlash(
'info',
'Un email de confirmation vous a été envoyé pour la vérification de votre compte. Si le mail n\'apparait pas dans la boite de réception, veuillez vérifier dans les spams!'
);
return $this->redirectToRoute('app_verify_resend_email');
} else {
$this->addFlash('error', 'Email inconnu.');
}
}
return $this->render('auth/resend_verify_email.html.twig', ['form' => $form->createView(), 'userEmail' => $userEmail]);
}
// /**
// * @Route("/deconnexion", name="security.logout")
// * @IsGranted("ROLE_USER")
// */
#[Route('/deconnexion', name:'security.logout', methods: ["GET","POST"])]
#[IsGranted('ROLE_USER')]
public function logout()
{
}
// /**
// * @Route("/mon-compte/utilisateurs/{id}/modification-mot-de-passe", name="security.update.pwd")
// * @Security("is_granted('ROLE_USER')")
// */
#[Route('/mon-compte/utilisateurs/{id}/modification-mot-de-passe', name:'security.update.pwd')]
#[IsGranted('ROLE_USER')]
public function updatePassword(User $user, Request $request, UserPasswordHasherInterface $passwordEncoder)
{
$loggedUser = $this->getUser();
if ($loggedUser != $user) {
$this->addFlash(
'error',
'Vous n\'êtes pas autorisé à éffectuer cette action !'
);
return $this->redirectToRoute('my_account');
}
$form = $this->createForm(UpdatePasswordType::class, $user);
$form->handleRequest($request);
if ($form->isSubmitted() && $form->isValid()) {
// $password = $passwordEncoder->encodePassword($user, $form->getData()->getPlainPassword());
$password = $passwordEncoder->hashPassword($user, $form->getData()->getPlainPassword());
$user->setPassword($password);
$this->manager->persist($user);
$this->manager->flush();
$this->addFlash(
'success',
'Votre mot de passe a bien été mise à jour !'
);
return $this->redirectToRoute('my_account');
}
return $this->render('auth/update_password.html.twig', ['form' => $form->createView()]);
}
// /**
// * @Route("/go_to", name="go_to")
// */
#[Route('/go_to', name:'go_to')]
public function go_to()
{
if (isset($_COOKIE["__ga_ru__"])) {
$url = $_COOKIE["__ga_ru__"];
return $this->redirect($url);
} else {
return $this->redirectToRoute('app_front_home');
}
}
#[Route('/', name:'app_front_home', methods: ["GET","POST"])]
public function home()
{
// dd('HOME PAGE');
if (isset($_COOKIE["__ga_ru__"])) {
$url = $_COOKIE["__ga_ru__"];
return $this->redirect($url);
} else {
return $this->redirect('https://www.abidjan.net',302);
}
// return $this->render('base.html.twig',[
// ]);
}
}