<?php
namespace App\Controller;
use App\Entity\User;
use Doctrine\ORM\EntityManagerInterface;
use Symfony\Bundle\FrameworkBundle\Controller\AbstractController;
use Symfony\Component\HttpFoundation\Request;
use Symfony\Component\HttpFoundation\Response;
use Symfony\Component\PasswordHasher\Hasher\UserPasswordHasherInterface;
use Symfony\Component\Routing\Annotation\Route;
use Symfony\Component\Security\Http\Authentication\AuthenticationUtils;
class SecurityController extends AbstractController
{
#[Route(path: '/login', name: 'app_login')]
public function login(AuthenticationUtils $authenticationUtils): Response
{
$error = $authenticationUtils->getLastAuthenticationError();
$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(path: '/register', name: 'app_register')]
public function register(Request $request, UserPasswordHasherInterface $userPasswordHasher, EntityManagerInterface $entityManager, \App\Service\TurnstileService $turnstileService): Response
{
$error = null;
if ($request->isMethod('POST')) {
$firstName = $request->request->get('firstName');
$lastName = $request->request->get('lastName');
$email = $request->request->get('email');
$password = $request->request->get('password');
$passwordConfirm = $request->request->get('passwordConfirm');
$turnstileToken = $request->request->get('cf-turnstile-response', '');
if (!$turnstileService->verify($turnstileToken, $request->getClientIp())) {
$error = 'Security check failed. Please try again.';
} elseif ($password !== $passwordConfirm) {
$error = 'Passwords do not match.';
} else {
$existingUser = $entityManager->getRepository(User::class)->findOneBy(['email' => $email]);
if ($existingUser) {
$error = 'An account with this email already exists.';
} else {
$user = new User();
$user->setFirstName($firstName);
$user->setLastName($lastName);
$user->setEmail($email);
$user->setPassword(
$userPasswordHasher->hashPassword(
$user,
$password
)
);
$entityManager->persist($user);
$entityManager->flush();
// Optional: automatically log them in or redirect to login.
return $this->redirectToRoute('app_login');
}
}
}
return $this->render('security/register.html.twig', [
'error' => $error,
]);
}
#[Route(path: '/settings', name: 'app_user_settings')]
public function settings(Request $request, EntityManagerInterface $entityManager, UserPasswordHasherInterface $userPasswordHasher): Response
{
/** @var \App\Entity\User|null $user */
$user = $this->getUser();
if (!$user) {
return $this->redirectToRoute('app_login');
}
$success = null;
$error = null;
if ($request->isMethod('POST')) {
$firstName = $request->request->get('firstName');
$lastName = $request->request->get('lastName');
$newPassword = $request->request->get('newPassword');
if ($firstName) $user->setFirstName($firstName);
if ($lastName) $user->setLastName($lastName);
if ($newPassword) {
$user->setPassword(
$userPasswordHasher->hashPassword(
$user,
$newPassword
)
);
}
$entityManager->persist($user);
$entityManager->flush();
$success = 'Settings updated successfully.';
}
return $this->render('security/settings.html.twig', [
'user' => $user,
'success' => $success,
'error' => $error
]);
}
}