<?php
namespace App\Controller;
use Symfony\Bundle\FrameworkBundle\Controller\AbstractController;
use Symfony\Component\HttpFoundation\Response;
use Symfony\Component\HttpFoundation\Request;
use Doctrine\ORM\EntityManagerInterface;
use Symfony\Component\Routing\Annotation\Route;
use Symfony\Component\Security\Http\Authentication\AuthenticationUtils;
class SecurityController extends AbstractController
{
/**
* @Route("/admin/login", name="app_admin_login")
*/
public function login(AuthenticationUtils $authenticationUtils): Response
{
if ($this->getUser()) {
return $this->redirectToRoute('admin');
}
// get the login error if there is one
$error = $authenticationUtils->getLastAuthenticationError();
// last username entered by the user
$lastUsername = $authenticationUtils->getLastUsername();
return $this->render('security/login.html.twig', ['last_username' => $lastUsername, 'error' => $error]);
}
/**
* @Route("/logout", name="app_logout")
*/
public function logout(): void
{
throw new \LogicException('This method can be blank - it will be intercepted by the logout key on your firewall.');
}
/**
* @Route("/login", name="app_login")
*/
public function memberLogin(Request $request, EntityManagerInterface $em): Response
{
if ($request->getSession()->get('member_id')) {
return $this->redirectToRoute('app_espace_membre');
}
$error = null;
if ($request->isMethod('POST')) {
$email = $request->request->get('email');
$otp = $request->request->get('otp');
$member = $em->getRepository(\App\Entity\Member::class)->findOneBy(['email' => $email, 'otp' => $otp]);
if ($member) {
$request->getSession()->set('member_id', $member->getId());
return $this->redirectToRoute('app_espace_membre');
}
$error = "Email ou code secret incorrect.";
}
return $this->render('user/login.html.twig', [
'error' => $error
]);
}
/**
* @Route("/member/request-otp", name="app_request_login_otp", methods={"POST"})
*/
public function requestLoginOtp(Request $request, EntityManagerInterface $em, \Symfony\Component\Mailer\MailerInterface $mailer): Response
{
$email = $request->request->get('email');
$member = $em->getRepository(\App\Entity\Member::class)->findOneBy(['email' => $email]);
if (!$member) {
return $this->json(['success' => false, 'error' => 'Membre non trouvé avec cet email.']);
}
// Generate new OTP
$otp = strtoupper(substr(bin2hex(random_bytes(4)), 0, 8));
$member->setOtp($otp);
$em->flush();
// Send Email
try {
$emailObj = (new \Symfony\Bridge\Twig\Mime\TemplatedEmail())
->from(new \Symfony\Component\Mime\Address('wabenin@azilink.com', 'WA BENIN'))
->to($member->getEmail())
->subject('Votre code d\'accès WA BENIN')
->htmlTemplate('emails/adhesion_otp.html.twig')
->context([
'member' => $member,
'otp' => $otp
]);
$mailer->send($emailObj);
return $this->json(['success' => true]);
} catch (\Exception $e) {
return $this->json(['success' => false, 'error' => 'Erreur lors de l\'envoi de l\'email.']);
}
}
/**
* @Route("/member/logout", name="app_member_logout")
*/
public function memberLogout(Request $request): Response
{
$request->getSession()->remove('member_id');
return $this->redirectToRoute('app_home');
}
}