<?php
namespace App\Controller\BaseSite\Auth;
use App\Entity\Generic\Customer\Customer;
use App\Entity\Generic\User;
use App\Form\Website\NewPasswordType;
use App\Form\Website\ResetPasswordSmsRequestFormType;
use App\Form\Website\VerifySmsCodeType;
use App\Repository\Website\Website\WebsiteRepository;
use App\Service\SmsHandler;
use Doctrine\ORM\EntityManagerInterface;
use LogicException;
use Symfony\Bundle\FrameworkBundle\Controller\AbstractController;
use Symfony\Component\HttpFoundation\RedirectResponse;
use Symfony\Component\HttpFoundation\Request;
use Symfony\Component\HttpFoundation\Response;
use Symfony\Component\HttpFoundation\Session\SessionInterface;
use Symfony\Component\PasswordHasher\Hasher\UserPasswordHasherInterface;
use Symfony\Component\Routing\Annotation\Route;
use Symfony\Component\Routing\Generator\UrlGeneratorInterface;
use Symfony\Component\Security\Core\Security;
use Symfony\Component\Security\Csrf\TokenGenerator\TokenGeneratorInterface;
use Symfony\Component\Security\Http\Authentication\AuthenticationUtils;
class SecurityController extends AbstractController
{
#[Route(path: '/website-owner/login', name: 'shop_owner_login' )]
public function login(AuthenticationUtils $authenticationUtils): Response
{
if ($this->getUser()) {
return $this->redirectToRoute('app_user_handler');
}
// get the login error if there is one
$error = $authenticationUtils->getLastAuthenticationError();
// last username entered by the user
$lastUsername = $authenticationUtils->getLastUsername();
return $this->render('@baseAuth/security/login.html.twig', ['last_username' => $lastUsername, 'error' => $error]);
}
#[Route(path: '/website-owner/user-handler', name: 'app_user_handler')]
public function userHandler(Security $security , WebsiteRepository $shopRepository): RedirectResponse
{
$user = $security->getUser();
if ($user->hasRole('ROLE_ADMIN')){
return $this->redirectToRoute('app_admin_dashboard');
}
if (count($shopRepository->findBy(['owner' => $user])) < 1){
return $this->redirectToRoute('app_base_site_user_setup_setup');
}
return $this->redirectToRoute('app_user_dashboard');
}
#[Route(path: '/website-owner/logout', name: 'shop_owner_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('/website-owner/forgot-password/sms', name: 'shop_owner_forgot_password_sms')]
public function requestSmsReset(
Request $request,
EntityManagerInterface $em,
SmsHandler $smsSender,
TokenGeneratorInterface $tokenGenerator,
): Response
{
$form = $this->createForm(ResetPasswordSmsRequestFormType::class);
$form->handleRequest($request);
if ($form->isSubmitted() && $form->isValid()) {
$phone = $form->get('phoneNumber')->getData();
/**
* @var User $user
*/
$user = $em->getRepository(User::class)->findOneBy(['identifier' => $phone]);
if ($user) {
$code = random_int(100000, 999999);
$user->setVerifyCode($code);
// $user->setPasswordResetAt(new \DateTime());
$em->flush();
$smsSender->sendCode($phone, $code);
}
$this->addFlash('success', 'در صورت ثبت شماره صحیح، کدی برای شما ارسال خواهد شد');
return $this->redirectToRoute('shop_owner_verify_sms_code');
}
return $this->render('@baseAuth/request_sms_reset.html.twig', [
'form' => $form->createView(),
]);
}
#[Route('/website-owner/forgot-password/sms/verify', name: 'shop_owner_verify_sms_code')]
public function verifyCode(
Request $request,
EntityManagerInterface $em,
UrlGeneratorInterface $urlGenerator,
SessionInterface $session
): Response
{
$form = $this->createForm(VerifySmsCodeType::class);
$form->handleRequest($request);
if ($form->isSubmitted() && $form->isValid()) {
$phone = $form->get('phoneNumber')->getData();
$code = $form->get('code')->getData();
$user = $em->getRepository(User::class)->findOneBy(['identifier' => $phone, 'verifyCode' => $code]);
// if ($user && $user->getPasswordResetAt() > (new \DateTime('-10 minutes'))) {
if (true) {
// ذخیره موقتی کاربر برای مرحله بعدی
$session->set('reset_user_id', $user->getId());
return $this->redirectToRoute('shop_owner_reset_password_form');
}
$this->addFlash('danger', 'کد وارد شده صحیح نیست یا منقضی شده');
}
return $this->render('@baseAuth/verify_sms_code.html.twig', [
'form' => $form->createView(),
]);
}
#[Route('/website-owner/forgot-password/sms/reset', name: 'shop_owner_reset_password_form')]
public function resetPassword(
Request $request,
EntityManagerInterface $em,
UserPasswordHasherInterface $hasher,
SessionInterface $session
): Response
{
$userId = $session->get('reset_user_id');
if (!$userId) {
return $this->redirectToRoute('shop_owner_forgot_password_sms');
}
$user = $em->getRepository(User::class)->find($userId);
if (!$user) {
return $this->redirectToRoute('shop_owner_forgot_password_sms');
}
$form = $this->createForm(NewPasswordType::class);
$form->handleRequest($request);
if ($form->isSubmitted() && $form->isValid()) {
$password = $form->get('newPassword')->getData();
$user->setPassword($hasher->hashPassword($user, $password));
$user->setVerifyCode(null);
// $user->setPasswordResetAt(null);
$em->flush();
$session->remove('reset_user_id');
$this->addFlash('success', 'رمز عبور با موفقیت تغییر کرد');
return $this->redirectToRoute('shop_owner_login');
}
return $this->render('@baseAuth/reset_password.html.twig', [
'form' => $form->createView(),
]);
}
}