<?php
namespace App\Controller;
use App\Entity\User;
use App\Form\RegisterType;
use App\Repository\UserRepository;
use App\Service\TokenGenerator;
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\HttpKernel\Exception\NotFoundHttpException;
use Symfony\Component\Mailer\Exception\TransportExceptionInterface;
use Symfony\Component\Mailer\MailerInterface;
use Symfony\Component\Mime\Address;
use Symfony\Component\PasswordHasher\Hasher\UserPasswordHasherInterface;
use Symfony\Component\Routing\Annotation\Route;
use Symfony\Component\Security\Http\Authentication\AuthenticationUtils;
use TheSeer\Tokenizer\Exception;
class SecurityController extends AbstractController
{
#[Route(path: '/login', name: 'app_login')]
public function login(AuthenticationUtils $authenticationUtils): Response
{
// if ($this->getUser()) {
// return $this->redirectToRoute('target_path');
// }
// 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(path: '/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('/register', name: 'app_user_register', methods: ['GET', 'POST'])]
public function register(Request $request,
UserRepository $userRepository,
UserPasswordHasherInterface $passwordHasher,
MailerInterface $mailer,
TokenGenerator $tokenGenerator
): Response
{
$user = new User();
$form = $this->createForm(RegisterType::class, $user);
$form->handleRequest($request);
if ($form->isSubmitted() && $form->isValid()) {
$token = $tokenGenerator->getToken();
$user->setToken($token);
$user->setPassword($passwordHasher->hashPassword($user,$user->getPassword()));
$userRepository->save($user, true);
try {
$email = (new TemplatedEmail())
->from(new Address("replay@tawsill.com")/**/)
->to(new Address($user->getEmail()))
->subject(' تفعيل حساب توصيل ')
->htmlTemplate('email/verify-account.html.twig')
->context([
"token" => $token
]);
$mailer->send($email);
}catch (TransportExceptionInterface $e){
return $this->json(['message' => "sending email is fail "],500);
}
return $this->redirectToRoute('app_login', [], Response::HTTP_SEE_OTHER);
}
return $this->renderForm('security/register.html.twig', [
'form' => $form,
]);
}
#[Route('/verify/{token}/{email}', name: 'app_user_verify', methods: ['GET', 'POST'])]
public function verify(Request $request, string $token, string $email, UserRepository $userRepository): Response
{
$user = $userRepository->findOneBy([
"email"=> base64_decode($email),
]);
if ($user && $user->getToken() === "activated"){
return $this->render('security/verify-account.html.twig', ["activated" => true]);
}
if(!$user || $user->getToken() !== $token){
// log this
return throw new NotFoundHttpException(" !😊 هناك مشكلة في تفعيل الحساب أعد المحاولة منفضلك ");
}
else {
$user->setToken("activated");
$userRepository->save($user, true);
return $this->render('security/verify-account.html.twig', ["activated" => false] );
}
}
}