Skip to content
Snippets Groups Projects
Select Git revision
  • 69af1048d940ae242f9191e212025a92b92efeaa
  • main default
  • 35-cgu
  • 34-peertube-support
  • 27-add-autoplay-to-iframe
  • 33-bug-on-youtube-embed-urls
  • RC-Rekall-v1.1-fix_lpo
  • tuleap-140-go-back-to-my-capsules-page-when-i-m-on-capsule-preview-page
  • RC-Rekall-v1.2-fix10
  • RC-Rekall-v1.2-fix9
  • RC-Rekall-v1.2-fix8
  • RC-Rekall-v1.2-fix7
  • RC-Rekall-v1.2-fix6
  • RC-Rekall-v1.2-fix5
  • RC-Rekall-v1.2-fix4
  • RC-Rekall-v1.2-fix3
  • RC-Rekall-v1.2-fix2
  • RC-Rekall-v1.2-fix1
  • RC-Rekall-v1.1-fix-3
  • RC-Rekall-v1.1-fix-2
  • RC-Rekall-v1.1-fix-1
  • RC-Rekall-v1.1-delivered
  • preprod20220209-1535
23 results

CapsuleEditorController.php

Blame
  • CapsuleEditorController.php 11.85 KiB
    <?php
    
    namespace App\Controller;
    
    use App\Entity\Capsule;
    use App\Entity\PendingEditorInvitation;
    use App\Entity\User;
    use App\Form\CapsuleEditorsFormType;
    use App\Form\RemoveEditorFormType;
    use App\Repository\CapsuleRepository;
    use App\Repository\PendingEditorInvitationRepository;
    use App\Repository\UserRepository;
    use Doctrine\ORM\EntityManagerInterface;
    use Symfony\Bridge\Twig\Mime\TemplatedEmail;
    use Symfony\Bundle\FrameworkBundle\Controller\AbstractController;
    use Symfony\Component\HttpFoundation\Request;
    use Symfony\Component\HttpFoundation\Response;
    use Symfony\Component\Mailer\Exception\TransportExceptionInterface;
    use Symfony\Component\Mailer\MailerInterface;
    use Symfony\Component\Routing\Annotation\Route;
    use Symfony\Component\Routing\Generator\UrlGeneratorInterface;
    use Symfony\Contracts\Translation\TranslatorInterface;
    
    class CapsuleEditorController extends AbstractController
    {
        public function __construct(
            private MailerInterface $mailer,
            private TranslatorInterface $translator,
            private PendingEditorInvitationRepository $capsule_pending_editor_invitation_repository,
            private EntityManagerInterface $entity_manager,
            private UrlGeneratorInterface $urlGenerator,
            private CapsuleRepository $capsule_repository,
            private UserRepository $user_repository
        ) {
        }
    
        #[Route('/{_locale<%app.supported_locales%>}/capsule/{capsule_id}/editors', name:'edit_capsule_editors')]
        public function editCapsuleEditors(
            Request $request,
            int $capsule_id
        ): Response {
            $current_user = $this->getUser();
            if (! $current_user instanceof User) {
                return $this->redirectToRoute('app_logout');
            }
    
            $capsule = $this->capsule_repository->find($capsule_id);
            if (! $capsule) {
                throw $this->createNotFoundException(
                    'No capsule found for id ' . $capsule_id
                );
            }
    
            $current_capsule_editors_users = $capsule->getEditors()->toArray();
            if (! $capsule->getEditors()->contains($current_user)) {
                $this->addFlash(
                    'warning',
                    $this->translator->trans(
                        'editors.user_not_editor_error',
                        [
                            'capsule_name' => $capsule->getName()
                        ]
                    )
                );
    
                return $this->redirectToRoute('capsule_list');
            }
    
            $form = $this->createForm(CapsuleEditorsFormType::class);
            $form->handleRequest($request);
    
            if ($form->isSubmitted() && $form->isValid()) {
                $editor_email = $form->get('email')->getData();
                $user_associated_with_email_address = $this->user_repository
                                                    ->findOneBy(['email' => $editor_email]);
    
                if (! $user_associated_with_email_address instanceof User) {
                    $this->addPendingEditor($editor_email, $capsule, $current_user);
                } else {
                    $this->addEditor(
                        $editor_email,
                        $capsule,
                        $current_user,
                        $user_associated_with_email_address,
                        $current_capsule_editors_users
                    );
                }
    
                return $this->redirectToRoute('edit_capsule_editors', [
                    'capsule_id' => $capsule_id
                ]);
            }
    
            $pending_editors = $this->capsule_pending_editor_invitation_repository->findBy(['capsule_id' => $capsule_id]);
    
            return $this->renderForm('capsule/editors/list_editors.html.twig', [
                'userPermissionsCapsuleForm' => $form,
                'capsule' => $capsule,
                'editors' => $current_capsule_editors_users,
                'pending_editors' => $pending_editors,
                'current_user' => $current_user
            ]);
        }
    
        #[Route(
            '/{_locale<%app.supported_locales%>}/capsule/{capsule_id}/editors/{editor_id}/remove',
            name:'remove_editor'
        )]
        public function removeEditor(
            int $capsule_id,
            int $editor_id,
            Request $request
        ): Response {
            $form = $this->createForm(RemoveEditorFormType::class);
            $form->handleRequest($request);
    
            $capsule = $this->capsule_repository->findOneBy(['id' => $capsule_id]);
            if (! $capsule instanceof Capsule) {
                throw new \Exception('The retrieved capsule is not an instance of Capsule.');
            }
    
            $editor = $this->user_repository->findOneBy(['id' => $editor_id]);
            if (! $editor instanceof User) {
                throw new \Exception('The retrieved user is not an instance of User.');
            }
    
            $current_user = $this->getUser();
            if (! $current_user instanceof User) {
                return $this->redirectToRoute('app_logout');
            }
    
            if ($editor_id === $capsule->getCreationAuthor()->getId()) {
                $this->addFlash(
                    'warning',
                    $this->translator->trans(
                        'editors.remove.editor.error',
                        [
                            'editor_email' => $editor->getEmail(),
                            'capsule_name' => $capsule->getName()
                        ]
                    )
                );
    
                return $this->redirectToRoute('edit_capsule_editors', [
                    'capsule_id' => $capsule->getId()
                ]);
            }
    
            if ($form->isSubmitted() && $form->isValid()) {
                $capsule->removeEditor($editor);
                $this->entity_manager->flush();
    
                $this->addFlash(
                    'success',
                    $this->translator->trans(
                        'editors.remove.editor.success',
                        [
                            'editor_email' => $editor->getEmail(),
                            'capsule_name' => $capsule->getName()
                        ]
                    )
                );
    
                return $this->redirectToRoute('edit_capsule_editors', [
                    'capsule_id' => $capsule->getId()
                ]);
            }
    
            return $this->renderForm('capsule/editors/remove_editor.html.twig', [
                'removeEditorForm' => $form,
                'editor_email' => $editor->getEmail(),
                'capsule_id' => $capsule_id
            ]);
        }
    
        #[Route(
            '/{_locale<%app.supported_locales%>}/capsule/{capsule_id}/pending_editor/{pending_editor_invitation_id}/remove',
            name:'remove_pending_editor'
        )]
        public function removePendingEditor(
            int $pending_editor_invitation_id,
            int $capsule_id,
            Request $request
        ): Response {
            $capsule = $this->capsule_repository->findOneBy(['id' => $capsule_id]);
            if (! $capsule instanceof Capsule) {
                throw new \Exception('The retrieved capsule is not an instance of Capsule.');
            }
    
            $pending_editor_invitation = $this->capsule_pending_editor_invitation_repository
                                                ->findOneBy(['id' => $pending_editor_invitation_id]);
    
            $form = $this->createForm(RemoveEditorFormType::class);
            $form->handleRequest($request);
    
            if (! $pending_editor_invitation instanceof PendingEditorInvitation) {
                $this->addFlash(
                    'warning',
                    $this->translator->trans(
                        'editors.remove.pending_editor.error',
                        [
                            'capsule_name' => $capsule->getName()
                        ]
                    )
                );
    
                return $this->redirectToRoute('edit_capsule_editors', [
                    'capsule_id' => $capsule_id
                ]);
            }
    
            if ($form->isSubmitted() && $form->isValid()) {
                $this->entity_manager->remove($pending_editor_invitation);
                $this->entity_manager->flush();
    
                $this->addFlash(
                    'success',
                    $this->translator->trans(
                        'editors.remove.pending_editor.success',
                        [
                            'pending_editor_email' => $pending_editor_invitation->getEmail(),
                            'capsule_name' => $capsule->getName()
                        ]
                    )
                );
    
                return $this->redirectToRoute('edit_capsule_editors', [
                    'capsule_id' => $capsule_id
                ]);
            }
    
            return $this->renderForm('capsule/editors/remove_pending_editor.html.twig', [
                'removeEditorForm' => $form,
                'editor_email' => $pending_editor_invitation->getEmail(),
                'capsule_id' => $capsule_id
            ]);
        }
    
        private function addPendingEditor(string $editor_email, Capsule $capsule, User $current_user): void
        {
            $pending_editors_emails = $this->capsule_pending_editor_invitation_repository
                ->getPendingEditorsEmails($capsule->getId());
    
            if (in_array($editor_email, $pending_editors_emails)) {
                $this->addFlash(
                    'warning',
                    $this->translator->trans(
                        'editors.add.pending_editor.already_added',
                        [
                            'user_email' => $editor_email
                        ]
                    )
                );
                return;
            }
    
            $pending_editor_invitation = new PendingEditorInvitation();
            $pending_editor_invitation->setCapsuleId($capsule->getId());
            $pending_editor_invitation->setEmail($editor_email);
            $this->entity_manager->persist($pending_editor_invitation);
            $this->entity_manager->flush();
    
            $email = (new TemplatedEmail())
                ->to($editor_email)
                ->subject($this->translator->trans('editors.add.pending_editor.email.title'))
                ->htmlTemplate('capsule/editors/email_pending_editor.html.twig')
                ->context([
                    'user' => $current_user,
                    'capsule' => $capsule
                ]);
    
            $this->mailer->send($email);
    
            $this->addFlash(
                'success',
                $this->translator->trans(
                    'editors.add.pending_editor.success',
                    [
                        'user_email' => $editor_email
                    ]
                )
            );
        }
    
        /**
         * @param array<User> $current_capsule_editors_users
         * @throws TransportExceptionInterface
         */
        private function addEditor(
            string $editor_email,
            Capsule $capsule,
            User $current_user,
            User $user_associated_with_email_address,
            array $current_capsule_editors_users
        ): void {
            if (in_array($user_associated_with_email_address, $current_capsule_editors_users)) {
                $this->addFlash(
                    'warning',
                    $this->translator->trans(
                        'editors.add.user.already_added',
                        [
                            'user_email' => $editor_email
                        ]
                    )
                );
                $link = null;
            } else {
                $link = $this->urlGenerator->generate(
                    'edit_capsule',
                    [ 'path' => $capsule->getLinkPath() ],
                    UrlGeneratorInterface::ABSOLUTE_URL
                );
    
                $capsule->addEditor($user_associated_with_email_address);
                $this->entity_manager->persist($capsule);
                $this->entity_manager->flush();
    
                $this->addFlash(
                    'success',
                    $this->translator->trans(
                        'editors.add.user.success',
                        [
                            'capsule_name' => $capsule->getName(),
                            'user_email' => $editor_email
                        ]
                    )
                );
            }
    
            $email = (new TemplatedEmail())
                ->to($editor_email)
                ->subject($this->translator->trans('editors.add.user.email.title'))
                ->htmlTemplate('capsule/editors/email_editor.html.twig')
                ->context([
                    'user' => $current_user,
                    'capsule' => $capsule,
                    'capsule_edit_link' => $link
                ]);
    
            $this->mailer->send($email);
        }
    }