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

Pending Editor are added as editor when they register

parent fbff6815
No related branches found
No related tags found
1 merge request!45tuleap-81-allow-a-new-user-to-access-the-capsule-edition-mode
......@@ -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();
}
}
<?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;
}
}
<?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()
;
}
*/
}
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Please register or to comment