diff --git a/src/Controller/RegistrationController.php b/src/Controller/RegistrationController.php index d5df813b2214fedaca035855bf7ccf4a8717b038..faf3031cd5bba07f1c84c359574d3b02eadb83b8 100644 --- a/src/Controller/RegistrationController.php +++ b/src/Controller/RegistrationController.php @@ -2,8 +2,12 @@ namespace App\Controller; +use App\Entity\Capsule; +use App\Entity\PendingEditorInvitation; use App\Entity\User; use App\Form\RegistrationFormType; +use App\Repository\CapsuleRepository; +use App\Repository\PendingEditorInvitationRepository; use App\Repository\UserRepository; use App\Security\EmailVerifier; use Doctrine\ORM\EntityManagerInterface; @@ -12,7 +16,6 @@ use Symfony\Bundle\FrameworkBundle\Controller\AbstractController; use Symfony\Component\HttpFoundation\Request; use Symfony\Component\HttpFoundation\RequestStack; use Symfony\Component\HttpFoundation\Response; -use Symfony\Component\Mime\Address; use Symfony\Component\PasswordHasher\Hasher\UserPasswordHasherInterface; use Symfony\Component\Routing\Annotation\Route; use Symfony\Contracts\Translation\TranslatorInterface; @@ -22,13 +25,16 @@ class RegistrationController extends AbstractController { private EmailVerifier $emailVerifier; private RequestStack $requestStack; + private EntityManagerInterface $entity_manager; public function __construct( EmailVerifier $emailVerifier, - RequestStack $requestStack + RequestStack $requestStack, + EntityManagerInterface $entity_manager ) { $this->emailVerifier = $emailVerifier; $this->requestStack = $requestStack; + $this->entity_manager = $entity_manager; } /** @@ -36,8 +42,7 @@ class RegistrationController extends AbstractController */ public function register( Request $request, - UserPasswordHasherInterface $userPasswordHasher, - EntityManagerInterface $entityManager + UserPasswordHasherInterface $userPasswordHasher ): Response { if ($this->getUser()) { return $this->redirectToRoute('capsule_list'); @@ -58,8 +63,8 @@ class RegistrationController extends AbstractController ) ); - $entityManager->persist($user); - $entityManager->flush(); + $this->entity_manager->persist($user); + $this->entity_manager->flush(); // generate a signed url and email it to the user $this->emailVerifier->sendEmailConfirmation( @@ -72,8 +77,6 @@ class RegistrationController extends AbstractController ->htmlTemplate('registration/confirmation_email.html.twig') ); - // do anything else you need here, like send an email - // return $this->redirectToRoute('app_login'); $this->requestStack->getSession()->set('userid', $user->getId()); return $this->redirectToRoute('app_register_mail_sent'); } @@ -89,6 +92,8 @@ class RegistrationController extends AbstractController public function verifyUserEmail( Request $request, UserRepository $userRepository, + PendingEditorInvitationRepository $pending_editor_invitation_repository, + CapsuleRepository $capsule_repository, TranslatorInterface $translator ): Response { $id = $request->get('id'); @@ -112,6 +117,12 @@ class RegistrationController extends AbstractController return $this->redirectToRoute('app_register'); } + $this->addCapsuleToConfirmedPreviousPendingEditor( + $user, + $pending_editor_invitation_repository, + $capsule_repository + ); + $this->addFlash( 'email_verified_success', $translator->trans('registration.email_verified_success') @@ -133,4 +144,58 @@ class RegistrationController extends AbstractController ['user' => $user] ); } + + private function addCapsuleToConfirmedPreviousPendingEditor( + User $user, + PendingEditorInvitationRepository $pending_editor_invitation_repository, + CapsuleRepository $capsule_repository + ): void { + $pending_editor_invitations = $pending_editor_invitation_repository->findBy(['email' => $user->getEmail()]); + + if ($pending_editor_invitations == null) { + return; + } + + $capsules_ids = $this->removeInvitations($pending_editor_invitations); + $this->addEditorToCapsules($capsules_ids, $user, $capsule_repository); + } + + /** + * @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, + CapsuleRepository $capsule_repository + ): void { + $capsules = $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/Entity/PendingEditorInvitation.php b/src/Entity/PendingEditorInvitation.php new file mode 100644 index 0000000000000000000000000000000000000000..b0bb5da206b3214717712efe4baf401eb146e43d --- /dev/null +++ b/src/Entity/PendingEditorInvitation.php @@ -0,0 +1,61 @@ +<?php + +namespace App\Entity; + +use App\Repository\PendingEditorInvitationRepository; +use Doctrine\ORM\Mapping as ORM; + +/** + * @ORM\Table(name="invitation_editeur_capsule") + * @ORM\Entity(repositoryClass=PendingEditorInvitationRepository::class) + */ +class PendingEditorInvitation +{ + /** + * @ORM\Id + * @ORM\GeneratedValue + * @ORM\Column(type="integer") + */ + private int $id; + + /** + * @ORM\Column(name="capsule_id", type="integer", nullable=false) + * @ORM\ManyToOne(targetEntity="App\Entity\Capsule", inversedBy="id") + * @ORM\JoinColumn(name="capsule_id", referencedColumnName="id") + */ + private int $capsule_id; + + /** + * @ORM\Column(type="string", length=255) + */ + private string $email; + + public function getId(): int + { + return $this->id; + } + + public function getCapsuleId(): int + { + return $this->capsule_id; + } + + public function setCapsuleId(int $capsule_id): self + { + $this->capsule_id = $capsule_id; + + return $this; + } + + public function getEmail(): string + { + return $this->email; + } + + public function setEmail(string $email): self + { + $this->email = $email; + + return $this; + } +} diff --git a/src/Repository/PendingEditorInvitationRepository.php b/src/Repository/PendingEditorInvitationRepository.php new file mode 100644 index 0000000000000000000000000000000000000000..e891144dd03e5b31229c3707ea86c82f6bca48a8 --- /dev/null +++ b/src/Repository/PendingEditorInvitationRepository.php @@ -0,0 +1,62 @@ +<?php + +namespace App\Repository; + +use App\Entity\PendingEditorInvitation; +use Doctrine\Bundle\DoctrineBundle\Repository\ServiceEntityRepository; +use Doctrine\Persistence\ManagerRegistry; + +/** + * @method PendingEditorInvitation|null find($id, $lockMode = null, $lockVersion = null) + * @method PendingEditorInvitation|null findOneBy(array $criteria, array $orderBy = null) + * @method PendingEditorInvitation[] findAll() + * @method PendingEditorInvitation[] findBy(array $criteria, array $orderBy = null, $limit = null, $offset = null) + */ +class PendingEditorInvitationRepository extends ServiceEntityRepository +{ + public function __construct(ManagerRegistry $registry) + { + parent::__construct($registry, PendingEditorInvitation::class); + } + + /** + * @return array<PendingEditorInvitation> + */ + public function getInvitationByCapsule(int $capsule_id): array + { + $query = $this->createQueryBuilder('i') + ->where("i.capsuleId like :capId") + ->setParameter("capId", $capsule_id) + ->getQuery(); + return $query->getArrayResult(); + } + + // /** + // * @return PendingEditorInvitation[] Returns an array of PendingEditorInvitation objects + // */ + /* + public function findByExampleField($value) + { + return $this->createQueryBuilder('p') + ->andWhere('p.exampleField = :val') + ->setParameter('val', $value) + ->orderBy('p.id', 'ASC') + ->setMaxResults(10) + ->getQuery() + ->getResult() + ; + } + */ + + /* + public function findOneBySomeField($value): ?PendingEditorInvitation + { + return $this->createQueryBuilder('p') + ->andWhere('p.exampleField = :val') + ->setParameter('val', $value) + ->getQuery() + ->getOneOrNullResult() + ; + } + */ +}