From 5a269902eae2230b2a6effff7230f8fbace59bfc Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Ma=C3=ABl=20Gangloff?= Date: Thu, 11 Dec 2025 10:16:55 +0100 Subject: [PATCH] refactor: move registration logic to Processor --- src/Controller/HomeController.php | 30 +++++++ src/Entity/User.php | 4 +- .../RegisterUserProcessor.php} | 79 ++++++------------- 3 files changed, 55 insertions(+), 58 deletions(-) rename src/{Controller/RegistrationController.php => State/RegisterUserProcessor.php} (56%) diff --git a/src/Controller/HomeController.php b/src/Controller/HomeController.php index ac77a62..b814da7 100644 --- a/src/Controller/HomeController.php +++ b/src/Controller/HomeController.php @@ -2,11 +2,15 @@ namespace App\Controller; +use App\Repository\UserRepository; +use App\Security\EmailVerifier; use KnpU\OAuth2ClientBundle\Client\ClientRegistry; +use Psr\Log\LoggerInterface; use Symfony\Bundle\FrameworkBundle\Controller\AbstractController; use Symfony\Bundle\SecurityBundle\Security; use Symfony\Component\DependencyInjection\ParameterBag\ParameterBagInterface; use Symfony\Component\HttpFoundation\RedirectResponse; +use Symfony\Component\HttpFoundation\Request; use Symfony\Component\HttpFoundation\Response; use Symfony\Component\HttpKernel\Exception\NotFoundHttpException; use Symfony\Component\Routing\Attribute\Route; @@ -17,6 +21,8 @@ class HomeController extends AbstractController public function __construct( private readonly RouterInterface $router, private readonly ParameterBagInterface $parameterBag, + private readonly EmailVerifier $emailVerifier, + private readonly LoggerInterface $logger, ) { } @@ -46,4 +52,28 @@ class HomeController extends AbstractController return $response; } + + #[Route('/verify/email', name: 'app_verify_email')] + public function verifyUserEmail(Request $request, UserRepository $userRepository): Response + { + $id = $request->query->get('id'); + + if (null === $id) { + return $this->redirectToRoute('index'); + } + + $user = $userRepository->find($id); + + if (null === $user) { + return $this->redirectToRoute('index'); + } + + $this->emailVerifier->handleEmailConfirmation($request, $user); + + $this->logger->info('User has validated his email address', [ + 'username' => $user->getUserIdentifier(), + ]); + + return $this->redirectToRoute('index'); + } } diff --git a/src/Entity/User.php b/src/Entity/User.php index eb1c4ff..8c555a2 100644 --- a/src/Entity/User.php +++ b/src/Entity/User.php @@ -6,8 +6,8 @@ use ApiPlatform\Metadata\ApiResource; use ApiPlatform\Metadata\Get; use ApiPlatform\Metadata\Post; use App\Controller\MeController; -use App\Controller\RegistrationController; use App\Repository\UserRepository; +use App\State\RegisterUserProcessor; use Doctrine\Common\Collections\ArrayCollection; use Doctrine\Common\Collections\Collection; use Doctrine\ORM\Mapping as ORM; @@ -37,13 +37,13 @@ use Symfony\Component\Validator\Constraints as Assert; new Post( uriTemplate: '/register', routeName: 'user_register', - controller: RegistrationController::class, openapiContext: [ 'summary' => 'Register a new user', 'description' => 'If the server configuration allows it, this endpoint enables the registration of a new user. Depending on the server configuration, a confirmation email may be sent to the provided email address so that the user can verify their email address.', ], denormalizationContext: ['groups' => ['user:register']], read: false, + processor: RegisterUserProcessor::class, ), ] )] diff --git a/src/Controller/RegistrationController.php b/src/State/RegisterUserProcessor.php similarity index 56% rename from src/Controller/RegistrationController.php rename to src/State/RegisterUserProcessor.php index 790cede..85a20ad 100644 --- a/src/Controller/RegistrationController.php +++ b/src/State/RegisterUserProcessor.php @@ -1,58 +1,49 @@ User::class, - '_api_operation_name' => 'user_register', - ], - methods: ['POST'] - )] - public function register(Request $request, UserPasswordHasherInterface $userPasswordHasher): Response + public function process(mixed $data, Operation $operation, array $uriVariables = [], array $context = []): mixed { - if (false === $this->getParameter('registration_enabled')) { + $request = $this->requestStack->getCurrentRequest(); + if (false === $this->parameterBag->get('registration_enabled')) { throw new UnauthorizedHttpException('', 'Registration is disabled on this instance'); } @@ -73,13 +64,13 @@ class RegistrationController extends AbstractController } $user->setPassword( - $userPasswordHasher->hashPassword( + $this->userPasswordHasher->hashPassword( $user, $user->getPlainPassword() ) )->setCreatedAt(new \DateTimeImmutable()); - if (false === (bool) $this->getParameter('registration_verify_email')) { + if (false === (bool) $this->parameterBag->get('registration_verify_email')) { $user->setVerifiedAt($user->getCreatedAt()); } else { $email = $this->emailVerifier->sendEmailConfirmation('app_verify_email', $user, @@ -107,28 +98,4 @@ class RegistrationController extends AbstractController return new Response(null, 201); } - - #[Route('/verify/email', name: 'app_verify_email')] - public function verifyUserEmail(Request $request, UserRepository $userRepository): Response - { - $id = $request->query->get('id'); - - if (null === $id) { - return $this->redirectToRoute('index'); - } - - $user = $userRepository->find($id); - - if (null === $user) { - return $this->redirectToRoute('index'); - } - - $this->emailVerifier->handleEmailConfirmation($request, $user); - - $this->logger->info('User has validated his email address', [ - 'username' => $user->getUserIdentifier(), - ]); - - return $this->redirectToRoute('index'); - } }