Skip to content
Snippets Groups Projects
Commit 58b796d4 authored by Camille Simiand's avatar Camille Simiand
Browse files

Refacto add capsules to pending editor new user

parent 98c2702b
Branches
Tags
1 merge request!83tuleap-153-be-associated-to-editors-of-a-capsule-if-i-register-after-being-added-to-the-capsule-editors-refactoring
Pipeline #984 passed
...@@ -3,17 +3,15 @@ ...@@ -3,17 +3,15 @@
namespace App\Controller; namespace App\Controller;
use App\Builder\UserBuilder; use App\Builder\UserBuilder;
use App\Entity\Capsule;
use App\Entity\PendingEditorInvitation;
use App\Entity\User; use App\Entity\User;
use App\Event\UserRegistrationEvent;
use App\Form\RegistrationFormType; use App\Form\RegistrationFormType;
use App\Repository\CapsuleRepository;
use App\Repository\PendingEditorInvitationRepository;
use App\Repository\UserRepository; use App\Repository\UserRepository;
use App\Security\EmailVerifier; use App\Security\EmailVerifier;
use Doctrine\ORM\EntityManagerInterface; use Doctrine\ORM\EntityManagerInterface;
use Symfony\Bridge\Twig\Mime\TemplatedEmail; use Symfony\Bridge\Twig\Mime\TemplatedEmail;
use Symfony\Bundle\FrameworkBundle\Controller\AbstractController; use Symfony\Bundle\FrameworkBundle\Controller\AbstractController;
use Symfony\Component\EventDispatcher\EventDispatcherInterface;
use Symfony\Component\HttpFoundation\Request; use Symfony\Component\HttpFoundation\Request;
use Symfony\Component\HttpFoundation\RequestStack; use Symfony\Component\HttpFoundation\RequestStack;
use Symfony\Component\HttpFoundation\Response; use Symfony\Component\HttpFoundation\Response;
...@@ -28,16 +26,15 @@ class RegistrationController extends AbstractController ...@@ -28,16 +26,15 @@ class RegistrationController extends AbstractController
private EmailVerifier $email_verifier, private EmailVerifier $email_verifier,
private RequestStack $request_stack, private RequestStack $request_stack,
private EntityManagerInterface $entity_manager, private EntityManagerInterface $entity_manager,
private CapsuleRepository $capsule_repository, private UserRepository $user_repository
private UserRepository $user_repository,
private PendingEditorInvitationRepository $pending_editor_invitation_repository
) { ) {
} }
#[Route('/register', name:'app_register')] #[Route('/register', name:'app_register')]
public function register( public function register(
Request $request, Request $request,
UserPasswordHasherInterface $user_password_hasher UserPasswordHasherInterface $user_password_hasher,
EventDispatcherInterface $event_dispatcher
): Response { ): Response {
if ($this->getUser()) { if ($this->getUser()) {
return $this->redirectToRoute('capsule_list'); return $this->redirectToRoute('capsule_list');
...@@ -53,6 +50,9 @@ class RegistrationController extends AbstractController ...@@ -53,6 +50,9 @@ class RegistrationController extends AbstractController
$this->entity_manager->persist($userBuilder->createUser()); $this->entity_manager->persist($userBuilder->createUser());
$this->entity_manager->flush(); $this->entity_manager->flush();
$event = new UserRegistrationEvent($user);
$event_dispatcher->dispatch($event);
// generate a signed url and email it to the user // generate a signed url and email it to the user
$this->email_verifier->sendEmailConfirmation( $this->email_verifier->sendEmailConfirmation(
'app_verify_email', 'app_verify_email',
...@@ -97,8 +97,6 @@ class RegistrationController extends AbstractController ...@@ -97,8 +97,6 @@ class RegistrationController extends AbstractController
return $this->redirectToRoute('app_register'); return $this->redirectToRoute('app_register');
} }
$this->addCapsuleToConfirmedPreviousPendingEditor($user);
$this->addFlash( $this->addFlash(
'success', 'success',
$translator->trans('registration.email_verified_success') $translator->trans('registration.email_verified_success')
...@@ -118,54 +116,4 @@ class RegistrationController extends AbstractController ...@@ -118,54 +116,4 @@ class RegistrationController extends AbstractController
['user' => $user] ['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();
}
} }
<?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;
}
}
<?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();
}
}
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Please register or to comment