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
No related branches found
No related tags found
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 @@
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();
}
}
<?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