wallabag/src/Wallabag/CoreBundle/Controller/TagController.php
Jeremy Benoist 0a6e6abdc4
Add RabbitMQConsumerTotalProxy to lazy RabbitMQ services for messages
This is just a simple proxy because we can't lazy load RabbitMQ service just to count number of messages in the queue.
As they are automatically injected in the controller now, we can't lazy load them.

Also forgot to use `AbstractController` in previous PR about _controller as a service_.
2022-12-19 13:23:56 +01:00

264 lines
8.5 KiB
PHP

<?php
namespace Wallabag\CoreBundle\Controller;
use Doctrine\ORM\EntityManagerInterface;
use Doctrine\ORM\QueryBuilder;
use Pagerfanta\Adapter\ArrayAdapter;
use Pagerfanta\Exception\OutOfRangeCurrentPageException;
use Sensio\Bundle\FrameworkExtraBundle\Configuration\ParamConverter;
use Symfony\Bundle\FrameworkBundle\Controller\AbstractController;
use Symfony\Component\HttpFoundation\Request;
use Symfony\Component\HttpFoundation\Response;
use Symfony\Component\Routing\Annotation\Route;
use Wallabag\CoreBundle\Entity\Entry;
use Wallabag\CoreBundle\Entity\Tag;
use Wallabag\CoreBundle\Form\Type\NewTagType;
use Wallabag\CoreBundle\Form\Type\RenameTagType;
use Wallabag\CoreBundle\Helper\PreparePagerForEntries;
use Wallabag\CoreBundle\Helper\Redirect;
use Wallabag\CoreBundle\Helper\TagsAssigner;
use Wallabag\CoreBundle\Repository\EntryRepository;
use Wallabag\CoreBundle\Repository\TagRepository;
class TagController extends AbstractController
{
private EntityManagerInterface $entityManager;
private TagsAssigner $tagsAssigner;
private Redirect $redirectHelper;
public function __construct(EntityManagerInterface $entityManager, TagsAssigner $tagsAssigner, Redirect $redirectHelper)
{
$this->entityManager = $entityManager;
$this->tagsAssigner = $tagsAssigner;
$this->redirectHelper = $redirectHelper;
}
/**
* @Route("/new-tag/{entry}", requirements={"entry" = "\d+"}, name="new_tag")
*
* @return Response
*/
public function addTagFormAction(Request $request, Entry $entry)
{
$form = $this->createForm(NewTagType::class, new Tag());
$form->handleRequest($request);
if ($form->isSubmitted() && $form->isValid()) {
$this->tagsAssigner->assignTagsToEntry(
$entry,
$form->get('label')->getData()
);
$this->entityManager->persist($entry);
$this->entityManager->flush();
$this->addFlash(
'notice',
'flashes.tag.notice.tag_added'
);
return $this->redirect($this->generateUrl('view', ['id' => $entry->getId()]));
}
return $this->render('@WallabagCore/Tag/new_form.html.twig', [
'form' => $form->createView(),
'entry' => $entry,
]);
}
/**
* Removes tag from entry.
*
* @Route("/remove-tag/{entry}/{tag}", requirements={"entry" = "\d+", "tag" = "\d+"}, name="remove_tag")
*
* @return Response
*/
public function removeTagFromEntry(Request $request, Entry $entry, Tag $tag)
{
$entry->removeTag($tag);
$this->entityManager->flush();
// remove orphan tag in case no entries are associated to it
if (0 === \count($tag->getEntries())) {
$this->entityManager->remove($tag);
$this->entityManager->flush();
}
$redirectUrl = $this->redirectHelper->to($request->headers->get('referer'), '', true);
return $this->redirect($redirectUrl);
}
/**
* Shows tags for current user.
*
* @Route("/tag/list", name="tag")
*
* @return Response
*/
public function showTagAction(TagRepository $tagRepository, EntryRepository $entryRepository)
{
$tags = $tagRepository->findAllFlatTagsWithNbEntries($this->getUser()->getId());
$nbEntriesUntagged = $entryRepository->countUntaggedEntriesByUser($this->getUser()->getId());
$renameForms = [];
foreach ($tags as $tag) {
$renameForms[$tag['id']] = $this->createForm(RenameTagType::class, new Tag())->createView();
}
return $this->render('@WallabagCore/Tag/tags.html.twig', [
'tags' => $tags,
'renameForms' => $renameForms,
'nbEntriesUntagged' => $nbEntriesUntagged,
]);
}
/**
* @param int $page
*
* @Route("/tag/list/{slug}/{page}", name="tag_entries", defaults={"page" = "1"})
* @ParamConverter("tag", options={"mapping": {"slug": "slug"}})
*
* @return Response
*/
public function showEntriesForTagAction(Tag $tag, EntryRepository $entryRepository, PreparePagerForEntries $preparePagerForEntries, $page, Request $request)
{
$entriesByTag = $entryRepository->findAllByTagId(
$this->getUser()->getId(),
$tag->getId()
);
$pagerAdapter = new ArrayAdapter($entriesByTag);
$entries = $preparePagerForEntries->prepare($pagerAdapter);
try {
$entries->setCurrentPage($page);
} catch (OutOfRangeCurrentPageException $e) {
if ($page > 1) {
return $this->redirect($this->generateUrl($request->get('_route'), [
'slug' => $tag->getSlug(),
'page' => $entries->getNbPages(),
]), 302);
}
}
return $this->render('@WallabagCore/Entry/entries.html.twig', [
'form' => null,
'entries' => $entries,
'currentPage' => $page,
'tag' => $tag,
]);
}
/**
* Rename a given tag with a new label
* Create a new tag with the new name and drop the old one.
*
* @Route("/tag/rename/{slug}", name="tag_rename")
* @ParamConverter("tag", options={"mapping": {"slug": "slug"}})
*
* @return Response
*/
public function renameTagAction(Tag $tag, Request $request, TagRepository $tagRepository, EntryRepository $entryRepository)
{
$form = $this->createForm(RenameTagType::class, new Tag());
$form->handleRequest($request);
$redirectUrl = $this->redirectHelper->to($request->headers->get('referer'), '', true);
if ($form->isSubmitted() && $form->isValid()) {
$newTag = new Tag();
$newTag->setLabel($form->get('label')->getData());
if ($newTag->getLabel() === $tag->getLabel()) {
return $this->redirect($redirectUrl);
}
$tagFromRepo = $tagRepository->findOneByLabel($newTag->getLabel());
if (null !== $tagFromRepo) {
$newTag = $tagFromRepo;
}
$entries = $entryRepository->findAllByTagId(
$this->getUser()->getId(),
$tag->getId()
);
foreach ($entries as $entry) {
$this->tagsAssigner->assignTagsToEntry(
$entry,
$newTag->getLabel(),
[$newTag]
);
$entry->removeTag($tag);
}
$this->entityManager->flush();
$this->addFlash(
'notice',
'flashes.tag.notice.tag_renamed'
);
}
return $this->redirect($redirectUrl);
}
/**
* Tag search results with the current search term.
*
* @Route("/tag/search/{filter}", name="tag_this_search")
*
* @return Response
*/
public function tagThisSearchAction($filter, Request $request, EntryRepository $entryRepository)
{
$currentRoute = $request->query->has('currentRoute') ? $request->query->get('currentRoute') : '';
/** @var QueryBuilder $qb */
$qb = $entryRepository->getBuilderForSearchByUser($this->getUser()->getId(), $filter, $currentRoute);
$entries = $qb->getQuery()->getResult();
foreach ($entries as $entry) {
$this->tagsAssigner->assignTagsToEntry(
$entry,
$filter
);
$this->entityManager->persist($entry);
}
$this->entityManager->flush();
return $this->redirect($this->redirectHelper->to($request->headers->get('referer'), '', true));
}
/**
* Delete a given tag for the current user.
*
* @Route("/tag/delete/{slug}", name="tag_delete")
* @ParamConverter("tag", options={"mapping": {"slug": "slug"}})
*
* @return Response
*/
public function removeTagAction(Tag $tag, Request $request, EntryRepository $entryRepository)
{
foreach ($tag->getEntriesByUserId($this->getUser()->getId()) as $entry) {
$entryRepository->removeTag($this->getUser()->getId(), $tag);
}
// remove orphan tag in case no entries are associated to it
if (0 === \count($tag->getEntries())) {
$this->entityManager->remove($tag);
$this->entityManager->flush();
}
$redirectUrl = $this->redirectHelper->to($request->headers->get('referer'), '', true);
return $this->redirect($redirectUrl);
}
}