diff options
Diffstat (limited to 'src/Wallabag/CoreBundle/Controller')
6 files changed, 353 insertions, 60 deletions
diff --git a/src/Wallabag/CoreBundle/Controller/ConfigController.php b/src/Wallabag/CoreBundle/Controller/ConfigController.php index 907bf78e..d4170d39 100644 --- a/src/Wallabag/CoreBundle/Controller/ConfigController.php +++ b/src/Wallabag/CoreBundle/Controller/ConfigController.php | |||
@@ -151,9 +151,8 @@ class ConfigController extends Controller | |||
151 | 'token' => $config->getRssToken(), | 151 | 'token' => $config->getRssToken(), |
152 | ], | 152 | ], |
153 | 'twofactor_auth' => $this->getParameter('twofactor_auth'), | 153 | 'twofactor_auth' => $this->getParameter('twofactor_auth'), |
154 | 'wallabag_url' => $this->get('craue_config')->get('wallabag_url'), | 154 | 'wallabag_url' => $this->getParameter('domain_name'), |
155 | 'enabled_users' => $this->getDoctrine() | 155 | 'enabled_users' => $this->get('wallabag_user.user_repository') |
156 | ->getRepository('WallabagUserBundle:User') | ||
157 | ->getSumEnabledUsers(), | 156 | ->getSumEnabledUsers(), |
158 | ]); | 157 | ]); |
159 | } | 158 | } |
@@ -248,18 +247,27 @@ class ConfigController extends Controller | |||
248 | break; | 247 | break; |
249 | 248 | ||
250 | case 'entries': | 249 | case 'entries': |
251 | // SQLite doesn't care about cascading remove, so we need to manually remove associated stuf | 250 | // SQLite doesn't care about cascading remove, so we need to manually remove associated stuff |
252 | // otherwise they won't be removed ... | 251 | // otherwise they won't be removed ... |
253 | if ($this->get('doctrine')->getConnection()->getDriver() instanceof \Doctrine\DBAL\Driver\PDOSqlite\Driver) { | 252 | if ($this->get('doctrine')->getConnection()->getDatabasePlatform() instanceof \Doctrine\DBAL\Platforms\SqlitePlatform) { |
254 | $this->getDoctrine()->getRepository('WallabagAnnotationBundle:Annotation')->removeAllByUserId($this->getUser()->getId()); | 253 | $this->getDoctrine()->getRepository('WallabagAnnotationBundle:Annotation')->removeAllByUserId($this->getUser()->getId()); |
255 | } | 254 | } |
256 | 255 | ||
257 | // manually remove tags to avoid orphan tag | 256 | // manually remove tags to avoid orphan tag |
258 | $this->removeAllTagsByUserId($this->getUser()->getId()); | 257 | $this->removeAllTagsByUserId($this->getUser()->getId()); |
259 | 258 | ||
260 | $this->getDoctrine() | 259 | $this->get('wallabag_core.entry_repository')->removeAllByUserId($this->getUser()->getId()); |
261 | ->getRepository('WallabagCoreBundle:Entry') | 260 | break; |
262 | ->removeAllByUserId($this->getUser()->getId()); | 261 | case 'archived': |
262 | if ($this->get('doctrine')->getConnection()->getDatabasePlatform() instanceof \Doctrine\DBAL\Platforms\SqlitePlatform) { | ||
263 | $this->removeAnnotationsForArchivedByUserId($this->getUser()->getId()); | ||
264 | } | ||
265 | |||
266 | // manually remove tags to avoid orphan tag | ||
267 | $this->removeTagsForArchivedByUserId($this->getUser()->getId()); | ||
268 | |||
269 | $this->get('wallabag_core.entry_repository')->removeArchivedByUserId($this->getUser()->getId()); | ||
270 | break; | ||
263 | } | 271 | } |
264 | 272 | ||
265 | $this->get('session')->getFlashBag()->add( | 273 | $this->get('session')->getFlashBag()->add( |
@@ -271,20 +279,18 @@ class ConfigController extends Controller | |||
271 | } | 279 | } |
272 | 280 | ||
273 | /** | 281 | /** |
274 | * Remove all tags for a given user and cleanup orphan tags. | 282 | * Remove all tags for given tags and a given user and cleanup orphan tags. |
275 | * | 283 | * |
276 | * @param int $userId | 284 | * @param array $tags |
285 | * @param int $userId | ||
277 | */ | 286 | */ |
278 | private function removeAllTagsByUserId($userId) | 287 | private function removeAllTagsByStatusAndUserId($tags, $userId) |
279 | { | 288 | { |
280 | $tags = $this->getDoctrine()->getRepository('WallabagCoreBundle:Tag')->findAllTags($userId); | ||
281 | |||
282 | if (empty($tags)) { | 289 | if (empty($tags)) { |
283 | return; | 290 | return; |
284 | } | 291 | } |
285 | 292 | ||
286 | $this->getDoctrine() | 293 | $this->get('wallabag_core.entry_repository') |
287 | ->getRepository('WallabagCoreBundle:Entry') | ||
288 | ->removeTags($userId, $tags); | 294 | ->removeTags($userId, $tags); |
289 | 295 | ||
290 | // cleanup orphan tags | 296 | // cleanup orphan tags |
@@ -300,6 +306,43 @@ class ConfigController extends Controller | |||
300 | } | 306 | } |
301 | 307 | ||
302 | /** | 308 | /** |
309 | * Remove all tags for a given user and cleanup orphan tags. | ||
310 | * | ||
311 | * @param int $userId | ||
312 | */ | ||
313 | private function removeAllTagsByUserId($userId) | ||
314 | { | ||
315 | $tags = $this->get('wallabag_core.tag_repository')->findAllTags($userId); | ||
316 | $this->removeAllTagsByStatusAndUserId($tags, $userId); | ||
317 | } | ||
318 | |||
319 | /** | ||
320 | * Remove all tags for a given user and cleanup orphan tags. | ||
321 | * | ||
322 | * @param int $userId | ||
323 | */ | ||
324 | private function removeTagsForArchivedByUserId($userId) | ||
325 | { | ||
326 | $tags = $this->get('wallabag_core.tag_repository')->findForArchivedArticlesByUser($userId); | ||
327 | $this->removeAllTagsByStatusAndUserId($tags, $userId); | ||
328 | } | ||
329 | |||
330 | private function removeAnnotationsForArchivedByUserId($userId) | ||
331 | { | ||
332 | $em = $this->getDoctrine()->getManager(); | ||
333 | |||
334 | $archivedEntriesAnnotations = $this->getDoctrine() | ||
335 | ->getRepository('WallabagAnnotationBundle:Annotation') | ||
336 | ->findAllArchivedEntriesByUser($userId); | ||
337 | |||
338 | foreach ($archivedEntriesAnnotations as $archivedEntriesAnnotation) { | ||
339 | $em->remove($archivedEntriesAnnotation); | ||
340 | } | ||
341 | |||
342 | $em->flush(); | ||
343 | } | ||
344 | |||
345 | /** | ||
303 | * Validate that a rule can be edited/deleted by the current user. | 346 | * Validate that a rule can be edited/deleted by the current user. |
304 | * | 347 | * |
305 | * @param TaggingRule $rule | 348 | * @param TaggingRule $rule |
@@ -344,8 +387,7 @@ class ConfigController extends Controller | |||
344 | */ | 387 | */ |
345 | public function deleteAccountAction(Request $request) | 388 | public function deleteAccountAction(Request $request) |
346 | { | 389 | { |
347 | $enabledUsers = $this->getDoctrine() | 390 | $enabledUsers = $this->get('wallabag_user.user_repository') |
348 | ->getRepository('WallabagUserBundle:User') | ||
349 | ->getSumEnabledUsers(); | 391 | ->getSumEnabledUsers(); |
350 | 392 | ||
351 | if ($enabledUsers <= 1) { | 393 | if ($enabledUsers <= 1) { |
diff --git a/src/Wallabag/CoreBundle/Controller/EntryController.php b/src/Wallabag/CoreBundle/Controller/EntryController.php index f7398e69..fafa49f1 100644 --- a/src/Wallabag/CoreBundle/Controller/EntryController.php +++ b/src/Wallabag/CoreBundle/Controller/EntryController.php | |||
@@ -53,22 +53,17 @@ class EntryController extends Controller | |||
53 | 53 | ||
54 | /** | 54 | /** |
55 | * Fetch content and update entry. | 55 | * Fetch content and update entry. |
56 | * In case it fails, entry will return to avod loosing the data. | 56 | * In case it fails, $entry->getContent will return an error message. |
57 | * | 57 | * |
58 | * @param Entry $entry | 58 | * @param Entry $entry |
59 | * @param string $prefixMessage Should be the translation key: entry_saved or entry_reloaded | 59 | * @param string $prefixMessage Should be the translation key: entry_saved or entry_reloaded |
60 | * | ||
61 | * @return Entry | ||
62 | */ | 60 | */ |
63 | private function updateEntry(Entry $entry, $prefixMessage = 'entry_saved') | 61 | private function updateEntry(Entry $entry, $prefixMessage = 'entry_saved') |
64 | { | 62 | { |
65 | // put default title in case of fetching content failed | ||
66 | $entry->setTitle('No title found'); | ||
67 | |||
68 | $message = 'flashes.entry.notice.'.$prefixMessage; | 63 | $message = 'flashes.entry.notice.'.$prefixMessage; |
69 | 64 | ||
70 | try { | 65 | try { |
71 | $entry = $this->get('wallabag_core.content_proxy')->updateEntry($entry, $entry->getUrl()); | 66 | $this->get('wallabag_core.content_proxy')->updateEntry($entry, $entry->getUrl()); |
72 | } catch (\Exception $e) { | 67 | } catch (\Exception $e) { |
73 | $this->get('logger')->error('Error while saving an entry', [ | 68 | $this->get('logger')->error('Error while saving an entry', [ |
74 | 'exception' => $e, | 69 | 'exception' => $e, |
@@ -79,8 +74,6 @@ class EntryController extends Controller | |||
79 | } | 74 | } |
80 | 75 | ||
81 | $this->get('session')->getFlashBag()->add('notice', $message); | 76 | $this->get('session')->getFlashBag()->add('notice', $message); |
82 | |||
83 | return $entry; | ||
84 | } | 77 | } |
85 | 78 | ||
86 | /** | 79 | /** |
@@ -227,7 +220,7 @@ class EntryController extends Controller | |||
227 | public function showUnreadAction(Request $request, $page) | 220 | public function showUnreadAction(Request $request, $page) |
228 | { | 221 | { |
229 | // load the quickstart if no entry in database | 222 | // load the quickstart if no entry in database |
230 | if ($page == 1 && $this->get('wallabag_core.entry_repository')->countAllEntriesByUsername($this->getUser()->getId()) == 0) { | 223 | if ($page == 1 && $this->get('wallabag_core.entry_repository')->countAllEntriesByUser($this->getUser()->getId()) == 0) { |
231 | return $this->redirect($this->generateUrl('quickstart')); | 224 | return $this->redirect($this->generateUrl('quickstart')); |
232 | } | 225 | } |
233 | 226 | ||
@@ -321,8 +314,7 @@ class EntryController extends Controller | |||
321 | 314 | ||
322 | $pagerAdapter = new DoctrineORMAdapter($qb->getQuery(), true, false); | 315 | $pagerAdapter = new DoctrineORMAdapter($qb->getQuery(), true, false); |
323 | 316 | ||
324 | $entries = $this->get('wallabag_core.helper.prepare_pager_for_entries') | 317 | $entries = $this->get('wallabag_core.helper.prepare_pager_for_entries')->prepare($pagerAdapter); |
325 | ->prepare($pagerAdapter, $page); | ||
326 | 318 | ||
327 | try { | 319 | try { |
328 | $entries->setCurrentPage($page); | 320 | $entries->setCurrentPage($page); |
diff --git a/src/Wallabag/CoreBundle/Controller/ExportController.php b/src/Wallabag/CoreBundle/Controller/ExportController.php index abc3336a..fda04cfb 100644 --- a/src/Wallabag/CoreBundle/Controller/ExportController.php +++ b/src/Wallabag/CoreBundle/Controller/ExportController.php | |||
@@ -7,7 +7,6 @@ use Symfony\Bundle\FrameworkBundle\Controller\Controller; | |||
7 | use Symfony\Component\HttpFoundation\Request; | 7 | use Symfony\Component\HttpFoundation\Request; |
8 | use Symfony\Component\HttpKernel\Exception\NotFoundHttpException; | 8 | use Symfony\Component\HttpKernel\Exception\NotFoundHttpException; |
9 | use Wallabag\CoreBundle\Entity\Entry; | 9 | use Wallabag\CoreBundle\Entity\Entry; |
10 | use Wallabag\CoreBundle\Entity\Tag; | ||
11 | 10 | ||
12 | /** | 11 | /** |
13 | * The try/catch can be removed once all formats will be implemented. | 12 | * The try/catch can be removed once all formats will be implemented. |
@@ -57,16 +56,17 @@ class ExportController extends Controller | |||
57 | { | 56 | { |
58 | $method = ucfirst($category); | 57 | $method = ucfirst($category); |
59 | $methodBuilder = 'getBuilderFor'.$method.'ByUser'; | 58 | $methodBuilder = 'getBuilderFor'.$method.'ByUser'; |
59 | $repository = $this->get('wallabag_core.entry_repository'); | ||
60 | 60 | ||
61 | if ($category == 'tag_entries') { | 61 | if ($category == 'tag_entries') { |
62 | $tag = $this->getDoctrine()->getRepository('WallabagCoreBundle:Tag')->findOneBySlug($request->query->get('tag')); | 62 | $tag = $this->get('wallabag_core.tag_repository')->findOneBySlug($request->query->get('tag')); |
63 | 63 | ||
64 | $entries = $this->getDoctrine() | 64 | $entries = $repository->findAllByTagId( |
65 | ->getRepository('WallabagCoreBundle:Entry') | 65 | $this->getUser()->getId(), |
66 | ->findAllByTagId($this->getUser()->getId(), $tag->getId()); | 66 | $tag->getId() |
67 | ); | ||
67 | } else { | 68 | } else { |
68 | $entries = $this->getDoctrine() | 69 | $entries = $repository |
69 | ->getRepository('WallabagCoreBundle:Entry') | ||
70 | ->$methodBuilder($this->getUser()->getId()) | 70 | ->$methodBuilder($this->getUser()->getId()) |
71 | ->getQuery() | 71 | ->getQuery() |
72 | ->getResult(); | 72 | ->getResult(); |
diff --git a/src/Wallabag/CoreBundle/Controller/RssController.php b/src/Wallabag/CoreBundle/Controller/RssController.php index 92f18707..e87dd9a1 100644 --- a/src/Wallabag/CoreBundle/Controller/RssController.php +++ b/src/Wallabag/CoreBundle/Controller/RssController.php | |||
@@ -3,13 +3,16 @@ | |||
3 | namespace Wallabag\CoreBundle\Controller; | 3 | namespace Wallabag\CoreBundle\Controller; |
4 | 4 | ||
5 | use Pagerfanta\Adapter\DoctrineORMAdapter; | 5 | use Pagerfanta\Adapter\DoctrineORMAdapter; |
6 | use Pagerfanta\Adapter\ArrayAdapter; | ||
6 | use Pagerfanta\Exception\OutOfRangeCurrentPageException; | 7 | use Pagerfanta\Exception\OutOfRangeCurrentPageException; |
7 | use Pagerfanta\Pagerfanta; | 8 | use Pagerfanta\Pagerfanta; |
8 | use Sensio\Bundle\FrameworkExtraBundle\Configuration\ParamConverter; | 9 | use Sensio\Bundle\FrameworkExtraBundle\Configuration\ParamConverter; |
9 | use Sensio\Bundle\FrameworkExtraBundle\Configuration\Route; | 10 | use Sensio\Bundle\FrameworkExtraBundle\Configuration\Route; |
10 | use Symfony\Component\HttpFoundation\Request; | 11 | use Symfony\Component\HttpFoundation\Request; |
12 | use Symfony\Component\HttpFoundation\Response; | ||
11 | use Symfony\Bundle\FrameworkBundle\Controller\Controller; | 13 | use Symfony\Bundle\FrameworkBundle\Controller\Controller; |
12 | use Wallabag\CoreBundle\Entity\Entry; | 14 | use Wallabag\CoreBundle\Entity\Entry; |
15 | use Wallabag\CoreBundle\Entity\Tag; | ||
13 | use Wallabag\UserBundle\Entity\User; | 16 | use Wallabag\UserBundle\Entity\User; |
14 | use Symfony\Component\Routing\Generator\UrlGeneratorInterface; | 17 | use Symfony\Component\Routing\Generator\UrlGeneratorInterface; |
15 | 18 | ||
@@ -23,7 +26,7 @@ class RssController extends Controller | |||
23 | * | 26 | * |
24 | * @return \Symfony\Component\HttpFoundation\Response | 27 | * @return \Symfony\Component\HttpFoundation\Response |
25 | */ | 28 | */ |
26 | public function showUnreadAction(Request $request, User $user) | 29 | public function showUnreadRSSAction(Request $request, User $user) |
27 | { | 30 | { |
28 | return $this->showEntries('unread', $user, $request->query->get('page', 1)); | 31 | return $this->showEntries('unread', $user, $request->query->get('page', 1)); |
29 | } | 32 | } |
@@ -31,12 +34,12 @@ class RssController extends Controller | |||
31 | /** | 34 | /** |
32 | * Shows read entries for current user. | 35 | * Shows read entries for current user. |
33 | * | 36 | * |
34 | * @Route("/{username}/{token}/archive.xml", name="archive_rss") | 37 | * @Route("/{username}/{token}/archive.xml", name="archive_rss", defaults={"_format"="xml"}) |
35 | * @ParamConverter("user", class="WallabagUserBundle:User", converter="username_rsstoken_converter") | 38 | * @ParamConverter("user", class="WallabagUserBundle:User", converter="username_rsstoken_converter") |
36 | * | 39 | * |
37 | * @return \Symfony\Component\HttpFoundation\Response | 40 | * @return \Symfony\Component\HttpFoundation\Response |
38 | */ | 41 | */ |
39 | public function showArchiveAction(Request $request, User $user) | 42 | public function showArchiveRSSAction(Request $request, User $user) |
40 | { | 43 | { |
41 | return $this->showEntries('archive', $user, $request->query->get('page', 1)); | 44 | return $this->showEntries('archive', $user, $request->query->get('page', 1)); |
42 | } | 45 | } |
@@ -44,17 +47,89 @@ class RssController extends Controller | |||
44 | /** | 47 | /** |
45 | * Shows starred entries for current user. | 48 | * Shows starred entries for current user. |
46 | * | 49 | * |
47 | * @Route("/{username}/{token}/starred.xml", name="starred_rss") | 50 | * @Route("/{username}/{token}/starred.xml", name="starred_rss", defaults={"_format"="xml"}) |
48 | * @ParamConverter("user", class="WallabagUserBundle:User", converter="username_rsstoken_converter") | 51 | * @ParamConverter("user", class="WallabagUserBundle:User", converter="username_rsstoken_converter") |
49 | * | 52 | * |
50 | * @return \Symfony\Component\HttpFoundation\Response | 53 | * @return \Symfony\Component\HttpFoundation\Response |
51 | */ | 54 | */ |
52 | public function showStarredAction(Request $request, User $user) | 55 | public function showStarredRSSAction(Request $request, User $user) |
53 | { | 56 | { |
54 | return $this->showEntries('starred', $user, $request->query->get('page', 1)); | 57 | return $this->showEntries('starred', $user, $request->query->get('page', 1)); |
55 | } | 58 | } |
56 | 59 | ||
57 | /** | 60 | /** |
61 | * Shows all entries for current user. | ||
62 | * | ||
63 | * @Route("/{username}/{token}/all.xml", name="all_rss", defaults={"_format"="xml"}) | ||
64 | * @ParamConverter("user", class="WallabagUserBundle:User", converter="username_rsstoken_converter") | ||
65 | * | ||
66 | * @return \Symfony\Component\HttpFoundation\Response | ||
67 | */ | ||
68 | public function showAllRSSAction(Request $request, User $user) | ||
69 | { | ||
70 | return $this->showEntries('all', $user, $request->query->get('page', 1)); | ||
71 | } | ||
72 | |||
73 | /** | ||
74 | * Shows entries associated to a tag for current user. | ||
75 | * | ||
76 | * @Route("/{username}/{token}/tags/{slug}.xml", name="tag_rss", defaults={"_format"="xml"}) | ||
77 | * @ParamConverter("user", class="WallabagUserBundle:User", converter="username_rsstoken_converter") | ||
78 | * @ParamConverter("tag", options={"mapping": {"slug": "slug"}}) | ||
79 | * | ||
80 | * @return \Symfony\Component\HttpFoundation\Response | ||
81 | */ | ||
82 | public function showTagsAction(Request $request, User $user, Tag $tag) | ||
83 | { | ||
84 | $page = $request->query->get('page', 1); | ||
85 | |||
86 | $url = $this->generateUrl( | ||
87 | 'tag_rss', | ||
88 | [ | ||
89 | 'username' => $user->getUsername(), | ||
90 | 'token' => $user->getConfig()->getRssToken(), | ||
91 | 'slug' => $tag->getSlug(), | ||
92 | ], | ||
93 | UrlGeneratorInterface::ABSOLUTE_URL | ||
94 | ); | ||
95 | |||
96 | $entriesByTag = $this->get('wallabag_core.entry_repository')->findAllByTagId( | ||
97 | $user->getId(), | ||
98 | $tag->getId() | ||
99 | ); | ||
100 | |||
101 | $pagerAdapter = new ArrayAdapter($entriesByTag); | ||
102 | |||
103 | $entries = $this->get('wallabag_core.helper.prepare_pager_for_entries')->prepare( | ||
104 | $pagerAdapter, | ||
105 | $user | ||
106 | ); | ||
107 | |||
108 | if (null === $entries) { | ||
109 | throw $this->createNotFoundException('No entries found?'); | ||
110 | } | ||
111 | |||
112 | try { | ||
113 | $entries->setCurrentPage($page); | ||
114 | } catch (OutOfRangeCurrentPageException $e) { | ||
115 | if ($page > 1) { | ||
116 | return $this->redirect($url.'?page='.$entries->getNbPages(), 302); | ||
117 | } | ||
118 | } | ||
119 | |||
120 | return $this->render( | ||
121 | '@WallabagCore/themes/common/Entry/entries.xml.twig', | ||
122 | [ | ||
123 | 'url_html' => $this->generateUrl('tag_entries', ['slug' => $tag->getSlug()], UrlGeneratorInterface::ABSOLUTE_URL), | ||
124 | 'type' => 'tag ('.$tag->getLabel().')', | ||
125 | 'url' => $url, | ||
126 | 'entries' => $entries, | ||
127 | ], | ||
128 | new Response('', 200, ['Content-Type' => 'application/rss+xml']) | ||
129 | ); | ||
130 | } | ||
131 | |||
132 | /** | ||
58 | * Global method to retrieve entries depending on the given type | 133 | * Global method to retrieve entries depending on the given type |
59 | * It returns the response to be send. | 134 | * It returns the response to be send. |
60 | * | 135 | * |
@@ -66,7 +141,7 @@ class RssController extends Controller | |||
66 | */ | 141 | */ |
67 | private function showEntries($type, User $user, $page = 1) | 142 | private function showEntries($type, User $user, $page = 1) |
68 | { | 143 | { |
69 | $repository = $this->getDoctrine()->getRepository('WallabagCoreBundle:Entry'); | 144 | $repository = $this->get('wallabag_core.entry_repository'); |
70 | 145 | ||
71 | switch ($type) { | 146 | switch ($type) { |
72 | case 'starred': | 147 | case 'starred': |
@@ -81,6 +156,10 @@ class RssController extends Controller | |||
81 | $qb = $repository->getBuilderForUnreadByUser($user->getId()); | 156 | $qb = $repository->getBuilderForUnreadByUser($user->getId()); |
82 | break; | 157 | break; |
83 | 158 | ||
159 | case 'all': | ||
160 | $qb = $repository->getBuilderForAllByUser($user->getId()); | ||
161 | break; | ||
162 | |||
84 | default: | 163 | default: |
85 | throw new \InvalidArgumentException(sprintf('Type "%s" is not implemented.', $type)); | 164 | throw new \InvalidArgumentException(sprintf('Type "%s" is not implemented.', $type)); |
86 | } | 165 | } |
@@ -108,10 +187,15 @@ class RssController extends Controller | |||
108 | } | 187 | } |
109 | } | 188 | } |
110 | 189 | ||
111 | return $this->render('@WallabagCore/themes/common/Entry/entries.xml.twig', [ | 190 | return $this->render( |
112 | 'type' => $type, | 191 | '@WallabagCore/themes/common/Entry/entries.xml.twig', |
113 | 'url' => $url, | 192 | [ |
114 | 'entries' => $entries, | 193 | 'url_html' => $this->generateUrl($type, [], UrlGeneratorInterface::ABSOLUTE_URL), |
115 | ]); | 194 | 'type' => $type, |
195 | 'url' => $url, | ||
196 | 'entries' => $entries, | ||
197 | ], | ||
198 | new Response('', 200, ['Content-Type' => 'application/rss+xml']) | ||
199 | ); | ||
116 | } | 200 | } |
117 | } | 201 | } |
diff --git a/src/Wallabag/CoreBundle/Controller/SiteCredentialController.php b/src/Wallabag/CoreBundle/Controller/SiteCredentialController.php new file mode 100644 index 00000000..98781dab --- /dev/null +++ b/src/Wallabag/CoreBundle/Controller/SiteCredentialController.php | |||
@@ -0,0 +1,174 @@ | |||
1 | <?php | ||
2 | |||
3 | namespace Wallabag\CoreBundle\Controller; | ||
4 | |||
5 | use Symfony\Component\HttpFoundation\Request; | ||
6 | use Symfony\Bundle\FrameworkBundle\Controller\Controller; | ||
7 | use Sensio\Bundle\FrameworkExtraBundle\Configuration\Method; | ||
8 | use Sensio\Bundle\FrameworkExtraBundle\Configuration\Route; | ||
9 | use Wallabag\UserBundle\Entity\User; | ||
10 | use Wallabag\CoreBundle\Entity\SiteCredential; | ||
11 | |||
12 | /** | ||
13 | * SiteCredential controller. | ||
14 | * | ||
15 | * @Route("/site-credentials") | ||
16 | */ | ||
17 | class SiteCredentialController extends Controller | ||
18 | { | ||
19 | /** | ||
20 | * Lists all User entities. | ||
21 | * | ||
22 | * @Route("/", name="site_credentials_index") | ||
23 | * @Method("GET") | ||
24 | */ | ||
25 | public function indexAction() | ||
26 | { | ||
27 | $credentials = $this->get('wallabag_core.site_credential_repository')->findByUser($this->getUser()); | ||
28 | |||
29 | return $this->render('WallabagCoreBundle:SiteCredential:index.html.twig', [ | ||
30 | 'credentials' => $credentials, | ||
31 | ]); | ||
32 | } | ||
33 | |||
34 | /** | ||
35 | * Creates a new site credential entity. | ||
36 | * | ||
37 | * @Route("/new", name="site_credentials_new") | ||
38 | * @Method({"GET", "POST"}) | ||
39 | * | ||
40 | * @param Request $request | ||
41 | * | ||
42 | * @return \Symfony\Component\HttpFoundation\Response | ||
43 | */ | ||
44 | public function newAction(Request $request) | ||
45 | { | ||
46 | $credential = new SiteCredential($this->getUser()); | ||
47 | |||
48 | $form = $this->createForm('Wallabag\CoreBundle\Form\Type\SiteCredentialType', $credential); | ||
49 | $form->handleRequest($request); | ||
50 | |||
51 | if ($form->isSubmitted() && $form->isValid()) { | ||
52 | $credential->setUsername($this->get('wallabag_core.helper.crypto_proxy')->crypt($credential->getUsername())); | ||
53 | $credential->setPassword($this->get('wallabag_core.helper.crypto_proxy')->crypt($credential->getPassword())); | ||
54 | |||
55 | $em = $this->getDoctrine()->getManager(); | ||
56 | $em->persist($credential); | ||
57 | $em->flush(); | ||
58 | |||
59 | $this->get('session')->getFlashBag()->add( | ||
60 | 'notice', | ||
61 | $this->get('translator')->trans('flashes.site_credential.notice.added', ['%host%' => $credential->getHost()]) | ||
62 | ); | ||
63 | |||
64 | return $this->redirectToRoute('site_credentials_index'); | ||
65 | } | ||
66 | |||
67 | return $this->render('WallabagCoreBundle:SiteCredential:new.html.twig', [ | ||
68 | 'credential' => $credential, | ||
69 | 'form' => $form->createView(), | ||
70 | ]); | ||
71 | } | ||
72 | |||
73 | /** | ||
74 | * Displays a form to edit an existing site credential entity. | ||
75 | * | ||
76 | * @Route("/{id}/edit", name="site_credentials_edit") | ||
77 | * @Method({"GET", "POST"}) | ||
78 | * | ||
79 | * @param Request $request | ||
80 | * @param SiteCredential $siteCredential | ||
81 | * | ||
82 | * @return \Symfony\Component\HttpFoundation\Response | ||
83 | */ | ||
84 | public function editAction(Request $request, SiteCredential $siteCredential) | ||
85 | { | ||
86 | $this->checkUserAction($siteCredential); | ||
87 | |||
88 | $deleteForm = $this->createDeleteForm($siteCredential); | ||
89 | $editForm = $this->createForm('Wallabag\CoreBundle\Form\Type\SiteCredentialType', $siteCredential); | ||
90 | $editForm->handleRequest($request); | ||
91 | |||
92 | if ($editForm->isSubmitted() && $editForm->isValid()) { | ||
93 | $siteCredential->setUsername($this->get('wallabag_core.helper.crypto_proxy')->crypt($siteCredential->getUsername())); | ||
94 | $siteCredential->setPassword($this->get('wallabag_core.helper.crypto_proxy')->crypt($siteCredential->getPassword())); | ||
95 | |||
96 | $em = $this->getDoctrine()->getManager(); | ||
97 | $em->persist($siteCredential); | ||
98 | $em->flush(); | ||
99 | |||
100 | $this->get('session')->getFlashBag()->add( | ||
101 | 'notice', | ||
102 | $this->get('translator')->trans('flashes.site_credential.notice.updated', ['%host%' => $siteCredential->getHost()]) | ||
103 | ); | ||
104 | |||
105 | return $this->redirectToRoute('site_credentials_index'); | ||
106 | } | ||
107 | |||
108 | return $this->render('WallabagCoreBundle:SiteCredential:edit.html.twig', [ | ||
109 | 'credential' => $siteCredential, | ||
110 | 'edit_form' => $editForm->createView(), | ||
111 | 'delete_form' => $deleteForm->createView(), | ||
112 | ]); | ||
113 | } | ||
114 | |||
115 | /** | ||
116 | * Deletes a site credential entity. | ||
117 | * | ||
118 | * @Route("/{id}", name="site_credentials_delete") | ||
119 | * @Method("DELETE") | ||
120 | * | ||
121 | * @param Request $request | ||
122 | * @param SiteCredential $siteCredential | ||
123 | * | ||
124 | * @return \Symfony\Component\HttpFoundation\RedirectResponse | ||
125 | */ | ||
126 | public function deleteAction(Request $request, SiteCredential $siteCredential) | ||
127 | { | ||
128 | $this->checkUserAction($siteCredential); | ||
129 | |||
130 | $form = $this->createDeleteForm($siteCredential); | ||
131 | $form->handleRequest($request); | ||
132 | |||
133 | if ($form->isSubmitted() && $form->isValid()) { | ||
134 | $this->get('session')->getFlashBag()->add( | ||
135 | 'notice', | ||
136 | $this->get('translator')->trans('flashes.site_credential.notice.deleted', ['%host%' => $siteCredential->getHost()]) | ||
137 | ); | ||
138 | |||
139 | $em = $this->getDoctrine()->getManager(); | ||
140 | $em->remove($siteCredential); | ||
141 | $em->flush(); | ||
142 | } | ||
143 | |||
144 | return $this->redirectToRoute('site_credentials_index'); | ||
145 | } | ||
146 | |||
147 | /** | ||
148 | * Creates a form to delete a site credential entity. | ||
149 | * | ||
150 | * @param SiteCredential $siteCredential The site credential entity | ||
151 | * | ||
152 | * @return \Symfony\Component\Form\Form The form | ||
153 | */ | ||
154 | private function createDeleteForm(SiteCredential $siteCredential) | ||
155 | { | ||
156 | return $this->createFormBuilder() | ||
157 | ->setAction($this->generateUrl('site_credentials_delete', ['id' => $siteCredential->getId()])) | ||
158 | ->setMethod('DELETE') | ||
159 | ->getForm() | ||
160 | ; | ||
161 | } | ||
162 | |||
163 | /** | ||
164 | * Check if the logged user can manage the given site credential. | ||
165 | * | ||
166 | * @param SiteCredential $siteCredential The site credential entity | ||
167 | */ | ||
168 | private function checkUserAction(SiteCredential $siteCredential) | ||
169 | { | ||
170 | if (null === $this->getUser() || $this->getUser()->getId() != $siteCredential->getUser()->getId()) { | ||
171 | throw $this->createAccessDeniedException('You can not access this site credential.'); | ||
172 | } | ||
173 | } | ||
174 | } | ||
diff --git a/src/Wallabag/CoreBundle/Controller/TagController.php b/src/Wallabag/CoreBundle/Controller/TagController.php index 8a093289..a8b1eadd 100644 --- a/src/Wallabag/CoreBundle/Controller/TagController.php +++ b/src/Wallabag/CoreBundle/Controller/TagController.php | |||
@@ -28,7 +28,7 @@ class TagController extends Controller | |||
28 | $form->handleRequest($request); | 28 | $form->handleRequest($request); |
29 | 29 | ||
30 | if ($form->isSubmitted() && $form->isValid()) { | 30 | if ($form->isSubmitted() && $form->isValid()) { |
31 | $this->get('wallabag_core.content_proxy')->assignTagsToEntry( | 31 | $this->get('wallabag_core.tags_assigner')->assignTagsToEntry( |
32 | $entry, | 32 | $entry, |
33 | $form->get('label')->getData() | 33 | $form->get('label')->getData() |
34 | ); | 34 | ); |
@@ -70,7 +70,7 @@ class TagController extends Controller | |||
70 | $em->flush(); | 70 | $em->flush(); |
71 | } | 71 | } |
72 | 72 | ||
73 | $redirectUrl = $this->get('wallabag_core.helper.redirect')->to($request->headers->get('referer')); | 73 | $redirectUrl = $this->get('wallabag_core.helper.redirect')->to($request->headers->get('referer'), '', true); |
74 | 74 | ||
75 | return $this->redirect($redirectUrl); | 75 | return $this->redirect($redirectUrl); |
76 | } | 76 | } |
@@ -84,16 +84,17 @@ class TagController extends Controller | |||
84 | */ | 84 | */ |
85 | public function showTagAction() | 85 | public function showTagAction() |
86 | { | 86 | { |
87 | $tags = $this->getDoctrine() | 87 | $repository = $this->get('wallabag_core.entry_repository'); |
88 | ->getRepository('WallabagCoreBundle:Tag') | 88 | $tags = $this->get('wallabag_core.tag_repository') |
89 | ->findAllTags($this->getUser()->getId()); | 89 | ->findAllTags($this->getUser()->getId()); |
90 | 90 | ||
91 | $flatTags = []; | 91 | $flatTags = []; |
92 | 92 | ||
93 | foreach ($tags as $tag) { | 93 | foreach ($tags as $tag) { |
94 | $nbEntries = $this->getDoctrine() | 94 | $nbEntries = $repository->countAllEntriesByUserIdAndTagId( |
95 | ->getRepository('WallabagCoreBundle:Entry') | 95 | $this->getUser()->getId(), |
96 | ->countAllEntriesByUserIdAndTagId($this->getUser()->getId(), $tag->getId()); | 96 | $tag->getId() |
97 | ); | ||
97 | 98 | ||
98 | $flatTags[] = [ | 99 | $flatTags[] = [ |
99 | 'id' => $tag->getId(), | 100 | 'id' => $tag->getId(), |
@@ -119,14 +120,14 @@ class TagController extends Controller | |||
119 | */ | 120 | */ |
120 | public function showEntriesForTagAction(Tag $tag, $page, Request $request) | 121 | public function showEntriesForTagAction(Tag $tag, $page, Request $request) |
121 | { | 122 | { |
122 | $entriesByTag = $this->getDoctrine() | 123 | $entriesByTag = $this->get('wallabag_core.entry_repository')->findAllByTagId( |
123 | ->getRepository('WallabagCoreBundle:Entry') | 124 | $this->getUser()->getId(), |
124 | ->findAllByTagId($this->getUser()->getId(), $tag->getId()); | 125 | $tag->getId() |
126 | ); | ||
125 | 127 | ||
126 | $pagerAdapter = new ArrayAdapter($entriesByTag); | 128 | $pagerAdapter = new ArrayAdapter($entriesByTag); |
127 | 129 | ||
128 | $entries = $this->get('wallabag_core.helper.prepare_pager_for_entries') | 130 | $entries = $this->get('wallabag_core.helper.prepare_pager_for_entries')->prepare($pagerAdapter); |
129 | ->prepare($pagerAdapter, $page); | ||
130 | 131 | ||
131 | try { | 132 | try { |
132 | $entries->setCurrentPage($page); | 133 | $entries->setCurrentPage($page); |
@@ -143,7 +144,7 @@ class TagController extends Controller | |||
143 | 'form' => null, | 144 | 'form' => null, |
144 | 'entries' => $entries, | 145 | 'entries' => $entries, |
145 | 'currentPage' => $page, | 146 | 'currentPage' => $page, |
146 | 'tag' => $tag->getSlug(), | 147 | 'tag' => $tag, |
147 | ]); | 148 | ]); |
148 | } | 149 | } |
149 | } | 150 | } |