diff --git a/src/Wallabag/CoreBundle/Controller/FeedController.php b/src/Wallabag/CoreBundle/Controller/FeedController.php index 3a9634f9a..5e33839eb 100644 --- a/src/Wallabag/CoreBundle/Controller/FeedController.php +++ b/src/Wallabag/CoreBundle/Controller/FeedController.php @@ -8,7 +8,9 @@ use Pagerfanta\Exception\OutOfRangeCurrentPageException; use Pagerfanta\Pagerfanta; use Sensio\Bundle\FrameworkExtraBundle\Configuration\ParamConverter; use Symfony\Bundle\FrameworkBundle\Controller\Controller; +use Symfony\Component\HttpFoundation\Request; use Symfony\Component\HttpFoundation\Response; +use Symfony\Component\HttpKernel\Exception\BadRequestHttpException; use Symfony\Component\Routing\Annotation\Route; use Symfony\Component\Routing\Generator\UrlGeneratorInterface; use Wallabag\CoreBundle\Entity\Tag; @@ -88,8 +90,19 @@ class FeedController extends Controller * * @return \Symfony\Component\HttpFoundation\Response */ - public function showTagsFeedAction(User $user, Tag $tag, $page) + public function showTagsFeedAction(Request $request, User $user, Tag $tag, $page) { + $sort = $request->query->get('sort', 'created'); + + $sorts = [ + 'created' => 'createdAt', + 'updated' => 'updatedAt', + ]; + + if (!isset($sorts[$sort])) { + throw new BadRequestHttpException(sprintf('Sort "%s" is not available.', $sort)); + } + $url = $this->generateUrl( 'tag_feed', [ @@ -102,7 +115,8 @@ class FeedController extends Controller $entriesByTag = $this->get('wallabag_core.entry_repository')->findAllByTagId( $user->getId(), - $tag->getId() + $tag->getId(), + $sorts[$sort] ); $pagerAdapter = new ArrayAdapter($entriesByTag); @@ -137,11 +151,28 @@ class FeedController extends Controller 'domainName' => $this->getParameter('domain_name'), 'version' => $this->getParameter('wallabag_core.version'), 'tag' => $tag->getSlug(), + 'updated' => $this->prepareFeedUpdatedDate($entries, $sort), ], new Response('', 200, ['Content-Type' => 'application/atom+xml']) ); } + private function prepareFeedUpdatedDate(Pagerfanta $entries, $sort = 'created') + { + $currentPageResults = $entries->getCurrentPageResults(); + + if (isset($currentPageResults[0])) { + $firstEntry = $currentPageResults[0]; + if ('created' === $sort) { + return $firstEntry->getCreatedAt(); + } + + return $firstEntry->getUpdatedAt(); + } + + return null; + } + /** * Global method to retrieve entries depending on the given type * It returns the response to be send. @@ -202,6 +233,7 @@ class FeedController extends Controller 'user' => $user->getUsername(), 'domainName' => $this->getParameter('domain_name'), 'version' => $this->getParameter('wallabag_core.version'), + 'updated' => $this->prepareFeedUpdatedDate($entries), ], new Response('', 200, ['Content-Type' => 'application/atom+xml']) ); diff --git a/src/Wallabag/CoreBundle/Repository/EntryRepository.php b/src/Wallabag/CoreBundle/Repository/EntryRepository.php index 36eedf205..14a38d329 100644 --- a/src/Wallabag/CoreBundle/Repository/EntryRepository.php +++ b/src/Wallabag/CoreBundle/Repository/EntryRepository.php @@ -343,9 +343,9 @@ class EntryRepository extends EntityRepository * * @return array */ - public function findAllByTagId($userId, $tagId) + public function findAllByTagId($userId, $tagId, $sort = 'createdAt') { - return $this->getSortedQueryBuilderByUser($userId) + return $this->getSortedQueryBuilderByUser($userId, $sort) ->innerJoin('e.tags', 't') ->andWhere('t.id = :tagId')->setParameter('tagId', $tagId) ->getQuery() diff --git a/src/Wallabag/CoreBundle/Resources/views/themes/common/Entry/entries.xml.twig b/src/Wallabag/CoreBundle/Resources/views/themes/common/Entry/entries.xml.twig index ee6ff6397..4e87942fd 100644 --- a/src/Wallabag/CoreBundle/Resources/views/themes/common/Entry/entries.xml.twig +++ b/src/Wallabag/CoreBundle/Resources/views/themes/common/Entry/entries.xml.twig @@ -11,8 +11,8 @@