diff --git a/src/Controller/RegistrationController.php b/src/Controller/RegistrationController.php index abd35e4d0d10fe269f21252802f479de1ebfc02b..392f2fa5b691da67f6c21e62a57e953b77f52f78 100755 --- a/src/Controller/RegistrationController.php +++ b/src/Controller/RegistrationController.php @@ -3,17 +3,15 @@ namespace App\Controller; use App\Builder\UserBuilder; -use App\Entity\Capsule; -use App\Entity\PendingEditorInvitation; use App\Entity\User; +use App\Event\UserRegistrationEvent; use App\Form\RegistrationFormType; -use App\Repository\CapsuleRepository; -use App\Repository\PendingEditorInvitationRepository; use App\Repository\UserRepository; use App\Security\EmailVerifier; use Doctrine\ORM\EntityManagerInterface; use Symfony\Bridge\Twig\Mime\TemplatedEmail; use Symfony\Bundle\FrameworkBundle\Controller\AbstractController; +use Symfony\Component\EventDispatcher\EventDispatcherInterface; use Symfony\Component\HttpFoundation\Request; use Symfony\Component\HttpFoundation\RequestStack; use Symfony\Component\HttpFoundation\Response; @@ -28,16 +26,15 @@ class RegistrationController extends AbstractController private EmailVerifier $email_verifier, private RequestStack $request_stack, private EntityManagerInterface $entity_manager, - private CapsuleRepository $capsule_repository, - private UserRepository $user_repository, - private PendingEditorInvitationRepository $pending_editor_invitation_repository + private UserRepository $user_repository ) { } #[Route('/register', name:'app_register')] public function register( Request $request, - UserPasswordHasherInterface $user_password_hasher + UserPasswordHasherInterface $user_password_hasher, + EventDispatcherInterface $event_dispatcher ): Response { if ($this->getUser()) { return $this->redirectToRoute('capsule_list'); @@ -53,6 +50,9 @@ class RegistrationController extends AbstractController $this->entity_manager->persist($userBuilder->createUser()); $this->entity_manager->flush(); + $event = new UserRegistrationEvent($user); + $event_dispatcher->dispatch($event); + // generate a signed url and email it to the user $this->email_verifier->sendEmailConfirmation( 'app_verify_email', @@ -97,8 +97,6 @@ class RegistrationController extends AbstractController return $this->redirectToRoute('app_register'); } - $this->addCapsuleToConfirmedPreviousPendingEditor($user); - $this->addFlash( 'success', $translator->trans('registration.email_verified_success') @@ -118,54 +116,4 @@ class RegistrationController extends AbstractController ['user' => $user] ); } - - private function addCapsuleToConfirmedPreviousPendingEditor(User $user): void - { - $pending_editor_invitations = $this->pending_editor_invitation_repository->findBy( - ['email' => $user->getEmail()] - ); - - if (! is_array($pending_editor_invitations)) { - return; - } - - $capsules_ids = $this->removeInvitations($pending_editor_invitations); - $this->addEditorToCapsules($capsules_ids, $user); - } - - /** - * @param array<PendingEditorInvitation> $pending_editor_invitations - * @return array<int> - */ - private function removeInvitations(array $pending_editor_invitations): array - { - $capsules_ids = []; - - foreach ($pending_editor_invitations as $invitation) { - if (! $invitation instanceof PendingEditorInvitation) { - return $capsules_ids; - } - $capsules_ids[] = $invitation->getCapsuleId(); - $this->entity_manager->remove($invitation); - } - - return $capsules_ids; - } - - /** - * @param array<int> $capsules_ids - */ - private function addEditorToCapsules(array $capsules_ids, User $user): void - { - $capsules = $this->capsule_repository->findBy(['id' => $capsules_ids]); - - foreach ($capsules as $capsule) { - if (! $capsule instanceof Capsule) { - return; - } - $capsule->addEditor($user); - $this->entity_manager->persist($capsule); - } - $this->entity_manager->flush(); - } } diff --git a/src/Event/UserRegistrationEvent.php b/src/Event/UserRegistrationEvent.php new file mode 100644 index 0000000000000000000000000000000000000000..f9fa19d666e388a0148d204ef341942115eade32 --- /dev/null +++ b/src/Event/UserRegistrationEvent.php @@ -0,0 +1,18 @@ +<?php + +namespace App\Event; + +use App\Entity\User; +use Symfony\Contracts\EventDispatcher\Event; + +class UserRegistrationEvent extends Event +{ + public function __construct(private User $user) + { + } + + public function getUser(): User + { + return $this->user; + } +} diff --git a/src/EventSubscriber/UserRegistrationSubscriber.php b/src/EventSubscriber/UserRegistrationSubscriber.php new file mode 100644 index 0000000000000000000000000000000000000000..bbed128cfa3f17da974b7be5e079a2c50ee3e3f5 --- /dev/null +++ b/src/EventSubscriber/UserRegistrationSubscriber.php @@ -0,0 +1,95 @@ +<?php + +namespace App\EventSubscriber; + +use App\Entity\Capsule; +use App\Entity\PendingEditorInvitation; +use App\Entity\User; +use App\Event\UserRegistrationEvent; +use App\Repository\CapsuleRepository; +use App\Repository\PendingEditorInvitationRepository; +use Doctrine\ORM\EntityManagerInterface; +use Symfony\Component\EventDispatcher\EventSubscriberInterface; + +class UserRegistrationSubscriber implements EventSubscriberInterface +{ + public function __construct( + private PendingEditorInvitationRepository $pending_editor_invitation_repository, + private CapsuleRepository $capsule_repository, + private EntityManagerInterface $entity_manager + ) { + } + + public static function getSubscribedEvents(): array + { + return [ + UserRegistrationEvent::class => [ + 'onPendingEditorRegistration', 1 + ] + ]; + } + + public function onPendingEditorRegistration(UserRegistrationEvent $event): void + { + $user = $event->getUser(); + + $this->addCapsuleToConfirmedPreviousPendingEditor($user); + } + + public function addCapsuleToConfirmedPreviousPendingEditor(User $user): void + { + $pending_editor_invitations = $this->pending_editor_invitation_repository->findBy( + ['email' => $user->getEmail()] + ); + + if (! is_array($pending_editor_invitations)) { + return; + } + + $capsules_ids = $this->getCapsulesIds($pending_editor_invitations); + $this->removeInvitations($pending_editor_invitations); + $this->addEditorToCapsules($capsules_ids, $user); + } + + /** + * @param PendingEditorInvitation[] $pending_editor_invitations + * @return int[] + */ + private function getCapsulesIds(array $pending_editor_invitations): array + { + $capsules_ids = []; + + foreach ($pending_editor_invitations as $invitation) { + $capsules_ids[] = $invitation->getCapsuleId(); + } + + return $capsules_ids; + } + + /** + * @param PendingEditorInvitation[] $pending_editor_invitations + */ + private function removeInvitations(array $pending_editor_invitations): void + { + foreach ($pending_editor_invitations as $invitation) { + $this->entity_manager->remove($invitation); + } + } + + /** + * @param array<int> $capsules_ids + */ + private function addEditorToCapsules(array $capsules_ids, User $user): void + { + $capsules = $this->capsule_repository->findBy(['id' => $capsules_ids]); + + foreach ($capsules as $capsule) { + if (! $capsule instanceof Capsule) { + return; + } + $capsule->addEditor($user); + $this->entity_manager->persist($capsule); + } + $this->entity_manager->flush(); + } +}