<?php
namespace App\Controller\Security;
use App\Entity\User;
use App\Form\RegistrationType;
use App\Repository\UserRepository;
use App\Service\EmailService;
use App\Service\TenantService;
use Doctrine\ORM\EntityManagerInterface;
use Symfony\Bundle\FrameworkBundle\Controller\AbstractController;
use Symfony\Component\Form\Extension\Core\Type\SubmitType;
use Symfony\Component\Form\Extension\Core\Type\TextType;
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\Uid\Uuid;
#[Route('/kundenkonto')]
class RegistrationController extends AbstractController {
/** @var EntityManagerInterface */
private EntityManagerInterface $entityManager;
/**
* @var EmailService
*/
private $emailService;
public function __construct(EntityManagerInterface $entityManager, EmailService $emailService) {
$this->entityManager = $entityManager;
$this->emailService = $emailService;
}
#[Route('/registrierung', name: 'app_register')]
public function register(Request $request, UserPasswordHasherInterface $userPasswordHasher, TenantService $tenantService): Response {
$user = new User();
$form = $this->createForm(RegistrationType::class, $user);
$form->handleRequest($request);
if ($form->isSubmitted() && $form->isValid()) {
$user->setPassword(
$userPasswordHasher->hashPassword(
$user,
$form->get('plainPassword')->getData()
)
);
if ($user instanceof User) {
$user->setUsername($user->getEmail());
$user->setVerifyEmailToken(Uuid::v6());
$user->setVerifyEmailTokenValidity(new \DateTime('+1 hour'));
$user->setTenant($tenantService->getTenant());
$user->setDateCreated(new \DateTime());
$this->entityManager->persist($user);
$this->entityManager->flush();
if ($user->getId()) {
$this->emailService->sendDoubleOptInEmail($user->getId());
}
}
return $this->redirectToRoute('app_verify_registration');
}
return $this->render('security/registration/register.html.twig', [
'registrationForm' => $form->createView(),
]);
}
#[Route('/verifizierung/email/{token}', name: 'app_verify_email')]
public function verifyUserEmail(string $token, UserRepository $userRepository): Response {
/** @var User */
$user = $userRepository->findOneBy([
'verifyEmailToken' => $token,
]);
if (!$user instanceof User) {
return $this->redirectToRoute('app_register');
}
if (new \DateTime('now') > $user->getVerifyEmailTokenValidity()) {
return $this->redirectToRoute('app_verification_link_expired');
}
$user->setIsVerified(true);
$user->setVerifyEmailToken(null);
$user->setVerifyEmailTokenValidity(null);
$this->entityManager->persist($user);
$this->entityManager->flush();
return $this->redirectToRoute('storefront_login');
}
#[Route('/registrierung/verifizieren', name: 'app_verify_registration')]
public function requestEmailVerification(): Response {
return $this->render('security/registration/verify.html.twig');
}
#[Route('/registrierung/erfolgreich', name: 'app_register_success')]
public function registrationSuccessful(): Response {
return $this->render('security/registration/success.html.twig');
}
#[Route('/verifizierung/link-abgelaufen', name: 'app_verification_link_expired')]
public function verificationLinkExpired(Request $request, UserRepository $userRepository): Response {
$form = $this->createFormBuilder()
->add('email', TextType::class, [
'label' => 'E-Mail Adresse',
'attr' => [
'class' => 'border-accent form-control',
'placeholder' => 'Deine E-Mail Adresse',
],
])
->add('submit', SubmitType::class, [
'label' => 'Neuen Verifizierungslink anfragen',
'attr' => [
'class' => 'button accent',
],
])
->getForm();
$form->handleRequest($request);
if ($form->isSubmitted() && $form->isValid()) {
/** @var array<string> */
$data = $form->getData();
/** @var User */
$user = $userRepository->findOneBy([
'email' => $data['email'],
]);
if ($user instanceof User) {
if ($user->isVerified()) {
return $this->redirectToRoute('storefront_login');
}
$user->setVerifyEmailToken(Uuid::v6());
$user->setVerifyEmailTokenValidity(new \DateTime('+1 hour'));
$this->entityManager->persist($user);
$this->entityManager->flush();
if ($user->getId()) {
$this->emailService->sendDoubleOptInEmail($user->getId());
}
return $this->redirectToRoute('app_verify_registration');
}
}
return $this->render('security/registration/expired.html.twig', [
'form' => $form->createView(),
]);
}
}