Skip to content
Snippets Groups Projects
Commit 49107829 authored by Sebastien's avatar Sebastien
Browse files

Merge branch...

Merge branch 'tuleap-153-be-associated-to-editors-of-a-capsule-if-i-register-after-being-added-to-the-capsule-editors-refactoring' into 'main'

tuleap-153-be-associated-to-editors-of-a-capsule-if-i-register-after-being-added-to-the-capsule-editors-refactoring

See merge request !83
parents 0652231e 58b796d4
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 #987 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