]> git.immae.eu Git - github/wallabag/wallabag.git/blame - src/Wallabag/CoreBundle/Controller/FeedController.php
CS
[github/wallabag/wallabag.git] / src / Wallabag / CoreBundle / Controller / FeedController.php
CommitLineData
0c83fd59
J
1<?php
2
3namespace Wallabag\CoreBundle\Controller;
4
18c38dff 5use Pagerfanta\Adapter\ArrayAdapter;
f808b016 6use Pagerfanta\Adapter\DoctrineORMAdapter;
8670250a 7use Pagerfanta\Exception\OutOfRangeCurrentPageException;
619cc453 8use Pagerfanta\Pagerfanta;
0c83fd59 9use Sensio\Bundle\FrameworkExtraBundle\Configuration\ParamConverter;
619cc453 10use Sensio\Bundle\FrameworkExtraBundle\Configuration\Route;
f808b016 11use Symfony\Bundle\FrameworkBundle\Controller\Controller;
8670250a 12use Symfony\Component\HttpFoundation\Request;
18c38dff 13use Symfony\Component\HttpFoundation\Response;
f808b016 14use Symfony\Component\Routing\Generator\UrlGeneratorInterface;
18c38dff 15use Wallabag\CoreBundle\Entity\Tag;
619cc453 16use Wallabag\UserBundle\Entity\User;
0c83fd59 17
1554eb0a 18class FeedController extends Controller
0c83fd59
J
19{
20 /**
4346a860 21 * Shows unread entries for current user.
0c83fd59 22 *
1554eb0a 23 * @Route("/feed/{username}/{token}/unread/{page}", name="unread_feed", defaults={"page": 1})
f04611c7 24 * @Route("/{username}/{token}/unread.xml", defaults={"page": 1})
1554eb0a 25 * @ParamConverter("user", class="WallabagUserBundle:User", converter="username_feed_token_converter")
0c83fd59 26 *
47e2d609
TC
27 * @param User $user
28 * @param $page
638ab25f 29 *
0c83fd59
J
30 * @return \Symfony\Component\HttpFoundation\Response
31 */
1554eb0a 32 public function showUnreadFeedAction(User $user, $page)
0c83fd59 33 {
47e2d609 34 return $this->showEntries('unread', $user, $page);
0c83fd59
J
35 }
36
37 /**
4346a860 38 * Shows read entries for current user.
0c83fd59 39 *
1554eb0a 40 * @Route("/feed/{username}/{token}/archive/{page}", name="archive_feed", defaults={"page": 1})
f04611c7 41 * @Route("/{username}/{token}/archive.xml", defaults={"page": 1})
1554eb0a 42 * @ParamConverter("user", class="WallabagUserBundle:User", converter="username_feed_token_converter")
0c83fd59 43 *
47e2d609
TC
44 * @param User $user
45 * @param $page
638ab25f 46 *
0c83fd59
J
47 * @return \Symfony\Component\HttpFoundation\Response
48 */
1554eb0a 49 public function showArchiveFeedAction(User $user, $page)
0c83fd59 50 {
47e2d609 51 return $this->showEntries('archive', $user, $page);
0c83fd59
J
52 }
53
54 /**
4346a860 55 * Shows starred entries for current user.
0c83fd59 56 *
1554eb0a 57 * @Route("/feed/{username}/{token}/starred/{page}", name="starred_feed", defaults={"page": 1})
f04611c7 58 * @Route("/{username}/{token}/starred.xml", defaults={"page": 1})
1554eb0a 59 * @ParamConverter("user", class="WallabagUserBundle:User", converter="username_feed_token_converter")
0c83fd59 60 *
47e2d609
TC
61 * @param User $user
62 * @param $page
638ab25f 63 *
0c83fd59
J
64 * @return \Symfony\Component\HttpFoundation\Response
65 */
1554eb0a 66 public function showStarredFeedAction(User $user, $page)
0c83fd59 67 {
47e2d609 68 return $this->showEntries('starred', $user, $page);
0ab7404f
JB
69 }
70
bd40f1af
TC
71 /**
72 * Shows all entries for current user.
73 *
1554eb0a
TC
74 * @Route("/{username}/{token}/all.xml", name="all_feed", defaults={"_format"="xml"})
75 * @ParamConverter("user", class="WallabagUserBundle:User", converter="username_feed_token_converter")
bd40f1af
TC
76 *
77 * @return \Symfony\Component\HttpFoundation\Response
78 */
1554eb0a 79 public function showAllFeedAction(Request $request, User $user)
bd40f1af
TC
80 {
81 return $this->showEntries('all', $user, $request->query->get('page', 1));
82 }
83
18c38dff
JB
84 /**
85 * Shows entries associated to a tag for current user.
86 *
1554eb0a
TC
87 * @Route("/{username}/{token}/tags/{slug}.xml", name="tag_feed", defaults={"_format"="xml"})
88 * @ParamConverter("user", class="WallabagUserBundle:User", converter="username_feed_token_converter")
18c38dff
JB
89 * @ParamConverter("tag", options={"mapping": {"slug": "slug"}})
90 *
91 * @return \Symfony\Component\HttpFoundation\Response
92 */
1554eb0a 93 public function showTagsFeedAction(Request $request, User $user, Tag $tag)
18c38dff
JB
94 {
95 $page = $request->query->get('page', 1);
96
97 $url = $this->generateUrl(
1554eb0a 98 'tag_feed',
18c38dff
JB
99 [
100 'username' => $user->getUsername(),
1554eb0a 101 'token' => $user->getConfig()->getFeedToken(),
18c38dff
JB
102 'slug' => $tag->getSlug(),
103 ],
104 UrlGeneratorInterface::ABSOLUTE_URL
105 );
106
107 $entriesByTag = $this->get('wallabag_core.entry_repository')->findAllByTagId(
108 $user->getId(),
109 $tag->getId()
110 );
111
112 $pagerAdapter = new ArrayAdapter($entriesByTag);
113
114 $entries = $this->get('wallabag_core.helper.prepare_pager_for_entries')->prepare(
115 $pagerAdapter,
116 $user
117 );
118
119 if (null === $entries) {
120 throw $this->createNotFoundException('No entries found?');
121 }
122
123 try {
124 $entries->setCurrentPage($page);
125 } catch (OutOfRangeCurrentPageException $e) {
126 if ($page > 1) {
f808b016 127 return $this->redirect($url . '?page=' . $entries->getNbPages(), 302);
18c38dff
JB
128 }
129 }
130
131 return $this->render(
132 '@WallabagCore/themes/common/Entry/entries.xml.twig',
133 [
1554eb0a 134 'type' => 'tag',
18c38dff
JB
135 'url' => $url,
136 'entries' => $entries,
1554eb0a
TC
137 'user' => $user->getUsername(),
138 'domainName' => $this->getParameter('domain_name'),
139 'version' => $this->getParameter('wallabag_core.version'),
140 'tag' => $tag->getSlug(),
18c38dff 141 ],
1554eb0a 142 new Response('', 200, ['Content-Type' => 'application/atom+xml'])
18c38dff
JB
143 );
144 }
145
0ab7404f
JB
146 /**
147 * Global method to retrieve entries depending on the given type
148 * It returns the response to be send.
149 *
150 * @param string $type Entries type: unread, starred or archive
151 * @param User $user
8670250a 152 * @param int $page
0ab7404f
JB
153 *
154 * @return \Symfony\Component\HttpFoundation\Response
155 */
8670250a 156 private function showEntries($type, User $user, $page = 1)
0ab7404f 157 {
25203e50 158 $repository = $this->get('wallabag_core.entry_repository');
0ab7404f
JB
159
160 switch ($type) {
161 case 'starred':
162 $qb = $repository->getBuilderForStarredByUser($user->getId());
163 break;
0ab7404f
JB
164 case 'archive':
165 $qb = $repository->getBuilderForArchiveByUser($user->getId());
166 break;
0ab7404f
JB
167 case 'unread':
168 $qb = $repository->getBuilderForUnreadByUser($user->getId());
169 break;
bd40f1af
TC
170 case 'all':
171 $qb = $repository->getBuilderForAllByUser($user->getId());
172 break;
0ab7404f
JB
173 default:
174 throw new \InvalidArgumentException(sprintf('Type "%s" is not implemented.', $type));
175 }
0c83fd59 176
5a5da369 177 $pagerAdapter = new DoctrineORMAdapter($qb->getQuery(), true, false);
26864574
NL
178 $entries = new Pagerfanta($pagerAdapter);
179
1554eb0a 180 $perPage = $user->getConfig()->getFeedLimit() ?: $this->getParameter('wallabag_core.Feed_limit');
9fb6ac83
FG
181 $entries->setMaxPerPage($perPage);
182
8670250a 183 $url = $this->generateUrl(
1554eb0a 184 $type . '_feed',
8670250a
JB
185 [
186 'username' => $user->getUsername(),
1554eb0a 187 'token' => $user->getConfig()->getFeedToken(),
8670250a
JB
188 ],
189 UrlGeneratorInterface::ABSOLUTE_URL
190 );
191
192 try {
193 $entries->setCurrentPage((int) $page);
194 } catch (OutOfRangeCurrentPageException $e) {
195 if ($page > 1) {
881c2576 196 return $this->redirect($url . '/' . $entries->getNbPages());
8670250a
JB
197 }
198 }
199
47e2d609
TC
200 return $this->render('@WallabagCore/themes/common/Entry/entries.xml.twig', [
201 'type' => $type,
202 'url' => $url,
203 'entries' => $entries,
204 'user' => $user->getUsername(),
205 'domainName' => $this->getParameter('domain_name'),
206 'version' => $this->getParameter('wallabag_core.version'),
1554eb0a
TC
207 ],
208 new Response('', 200, ['Content-Type' => 'application/atom+xml'])
209 );
0c83fd59
J
210 }
211}