diff options
Diffstat (limited to 'src/Wallabag/CoreBundle/Controller')
8 files changed, 558 insertions, 287 deletions
diff --git a/src/Wallabag/CoreBundle/Controller/ConfigController.php b/src/Wallabag/CoreBundle/Controller/ConfigController.php index 907bf78e..a89bb780 100644 --- a/src/Wallabag/CoreBundle/Controller/ConfigController.php +++ b/src/Wallabag/CoreBundle/Controller/ConfigController.php | |||
@@ -10,8 +10,8 @@ use Symfony\Component\HttpFoundation\Request; | |||
10 | use Symfony\Component\HttpKernel\Exception\AccessDeniedHttpException; | 10 | use Symfony\Component\HttpKernel\Exception\AccessDeniedHttpException; |
11 | use Wallabag\CoreBundle\Entity\Config; | 11 | use Wallabag\CoreBundle\Entity\Config; |
12 | use Wallabag\CoreBundle\Entity\TaggingRule; | 12 | use Wallabag\CoreBundle\Entity\TaggingRule; |
13 | use Wallabag\CoreBundle\Form\Type\ConfigType; | ||
14 | use Wallabag\CoreBundle\Form\Type\ChangePasswordType; | 13 | use Wallabag\CoreBundle\Form\Type\ChangePasswordType; |
14 | use Wallabag\CoreBundle\Form\Type\ConfigType; | ||
15 | use Wallabag\CoreBundle\Form\Type\RssType; | 15 | use Wallabag\CoreBundle\Form\Type\RssType; |
16 | use Wallabag\CoreBundle\Form\Type\TaggingRuleType; | 16 | use Wallabag\CoreBundle\Form\Type\TaggingRuleType; |
17 | use Wallabag\CoreBundle\Form\Type\UserInformationType; | 17 | use Wallabag\CoreBundle\Form\Type\UserInformationType; |
@@ -54,7 +54,7 @@ class ConfigController extends Controller | |||
54 | } | 54 | } |
55 | 55 | ||
56 | // handle changing password | 56 | // handle changing password |
57 | $pwdForm = $this->createForm(ChangePasswordType::class, null, ['action' => $this->generateUrl('config').'#set4']); | 57 | $pwdForm = $this->createForm(ChangePasswordType::class, null, ['action' => $this->generateUrl('config') . '#set4']); |
58 | $pwdForm->handleRequest($request); | 58 | $pwdForm->handleRequest($request); |
59 | 59 | ||
60 | if ($pwdForm->isSubmitted() && $pwdForm->isValid()) { | 60 | if ($pwdForm->isSubmitted() && $pwdForm->isValid()) { |
@@ -69,13 +69,13 @@ class ConfigController extends Controller | |||
69 | 69 | ||
70 | $this->get('session')->getFlashBag()->add('notice', $message); | 70 | $this->get('session')->getFlashBag()->add('notice', $message); |
71 | 71 | ||
72 | return $this->redirect($this->generateUrl('config').'#set4'); | 72 | return $this->redirect($this->generateUrl('config') . '#set4'); |
73 | } | 73 | } |
74 | 74 | ||
75 | // handle changing user information | 75 | // handle changing user information |
76 | $userForm = $this->createForm(UserInformationType::class, $user, [ | 76 | $userForm = $this->createForm(UserInformationType::class, $user, [ |
77 | 'validation_groups' => ['Profile'], | 77 | 'validation_groups' => ['Profile'], |
78 | 'action' => $this->generateUrl('config').'#set3', | 78 | 'action' => $this->generateUrl('config') . '#set3', |
79 | ]); | 79 | ]); |
80 | $userForm->handleRequest($request); | 80 | $userForm->handleRequest($request); |
81 | 81 | ||
@@ -87,11 +87,11 @@ class ConfigController extends Controller | |||
87 | 'flashes.config.notice.user_updated' | 87 | 'flashes.config.notice.user_updated' |
88 | ); | 88 | ); |
89 | 89 | ||
90 | return $this->redirect($this->generateUrl('config').'#set3'); | 90 | return $this->redirect($this->generateUrl('config') . '#set3'); |
91 | } | 91 | } |
92 | 92 | ||
93 | // handle rss information | 93 | // handle rss information |
94 | $rssForm = $this->createForm(RssType::class, $config, ['action' => $this->generateUrl('config').'#set2']); | 94 | $rssForm = $this->createForm(RssType::class, $config, ['action' => $this->generateUrl('config') . '#set2']); |
95 | $rssForm->handleRequest($request); | 95 | $rssForm->handleRequest($request); |
96 | 96 | ||
97 | if ($rssForm->isSubmitted() && $rssForm->isValid()) { | 97 | if ($rssForm->isSubmitted() && $rssForm->isValid()) { |
@@ -103,12 +103,12 @@ class ConfigController extends Controller | |||
103 | 'flashes.config.notice.rss_updated' | 103 | 'flashes.config.notice.rss_updated' |
104 | ); | 104 | ); |
105 | 105 | ||
106 | return $this->redirect($this->generateUrl('config').'#set2'); | 106 | return $this->redirect($this->generateUrl('config') . '#set2'); |
107 | } | 107 | } |
108 | 108 | ||
109 | // handle tagging rule | 109 | // handle tagging rule |
110 | $taggingRule = new TaggingRule(); | 110 | $taggingRule = new TaggingRule(); |
111 | $action = $this->generateUrl('config').'#set5'; | 111 | $action = $this->generateUrl('config') . '#set5'; |
112 | 112 | ||
113 | if ($request->query->has('tagging-rule')) { | 113 | if ($request->query->has('tagging-rule')) { |
114 | $taggingRule = $this->getDoctrine() | 114 | $taggingRule = $this->getDoctrine() |
@@ -119,7 +119,7 @@ class ConfigController extends Controller | |||
119 | return $this->redirect($action); | 119 | return $this->redirect($action); |
120 | } | 120 | } |
121 | 121 | ||
122 | $action = $this->generateUrl('config').'?tagging-rule='.$taggingRule->getId().'#set5'; | 122 | $action = $this->generateUrl('config') . '?tagging-rule=' . $taggingRule->getId() . '#set5'; |
123 | } | 123 | } |
124 | 124 | ||
125 | $newTaggingRule = $this->createForm(TaggingRuleType::class, $taggingRule, ['action' => $action]); | 125 | $newTaggingRule = $this->createForm(TaggingRuleType::class, $taggingRule, ['action' => $action]); |
@@ -135,7 +135,7 @@ class ConfigController extends Controller | |||
135 | 'flashes.config.notice.tagging_rules_updated' | 135 | 'flashes.config.notice.tagging_rules_updated' |
136 | ); | 136 | ); |
137 | 137 | ||
138 | return $this->redirect($this->generateUrl('config').'#set5'); | 138 | return $this->redirect($this->generateUrl('config') . '#set5'); |
139 | } | 139 | } |
140 | 140 | ||
141 | return $this->render('WallabagCoreBundle:Config:index.html.twig', [ | 141 | return $this->render('WallabagCoreBundle:Config:index.html.twig', [ |
@@ -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 | } |
@@ -183,7 +182,7 @@ class ConfigController extends Controller | |||
183 | 'flashes.config.notice.rss_token_updated' | 182 | 'flashes.config.notice.rss_token_updated' |
184 | ); | 183 | ); |
185 | 184 | ||
186 | return $this->redirect($this->generateUrl('config').'#set2'); | 185 | return $this->redirect($this->generateUrl('config') . '#set2'); |
187 | } | 186 | } |
188 | 187 | ||
189 | /** | 188 | /** |
@@ -208,7 +207,7 @@ class ConfigController extends Controller | |||
208 | 'flashes.config.notice.tagging_rules_deleted' | 207 | 'flashes.config.notice.tagging_rules_deleted' |
209 | ); | 208 | ); |
210 | 209 | ||
211 | return $this->redirect($this->generateUrl('config').'#set5'); | 210 | return $this->redirect($this->generateUrl('config') . '#set5'); |
212 | } | 211 | } |
213 | 212 | ||
214 | /** | 213 | /** |
@@ -224,7 +223,7 @@ class ConfigController extends Controller | |||
224 | { | 223 | { |
225 | $this->validateRuleAction($rule); | 224 | $this->validateRuleAction($rule); |
226 | 225 | ||
227 | return $this->redirect($this->generateUrl('config').'?tagging-rule='.$rule->getId().'#set5'); | 226 | return $this->redirect($this->generateUrl('config') . '?tagging-rule=' . $rule->getId() . '#set5'); |
228 | } | 227 | } |
229 | 228 | ||
230 | /** | 229 | /** |
@@ -242,56 +241,114 @@ class ConfigController extends Controller | |||
242 | ->getRepository('WallabagAnnotationBundle:Annotation') | 241 | ->getRepository('WallabagAnnotationBundle:Annotation') |
243 | ->removeAllByUserId($this->getUser()->getId()); | 242 | ->removeAllByUserId($this->getUser()->getId()); |
244 | break; | 243 | break; |
245 | |||
246 | case 'tags': | 244 | case 'tags': |
247 | $this->removeAllTagsByUserId($this->getUser()->getId()); | 245 | $this->removeAllTagsByUserId($this->getUser()->getId()); |
248 | break; | 246 | break; |
249 | |||
250 | case 'entries': | 247 | case 'entries': |
251 | // SQLite doesn't care about cascading remove, so we need to manually remove associated stuf | 248 | // SQLite doesn't care about cascading remove, so we need to manually remove associated stuff |
252 | // otherwise they won't be removed ... | 249 | // otherwise they won't be removed ... |
253 | if ($this->get('doctrine')->getConnection()->getDriver() instanceof \Doctrine\DBAL\Driver\PDOSqlite\Driver) { | 250 | if ($this->get('doctrine')->getConnection()->getDatabasePlatform() instanceof \Doctrine\DBAL\Platforms\SqlitePlatform) { |
254 | $this->getDoctrine()->getRepository('WallabagAnnotationBundle:Annotation')->removeAllByUserId($this->getUser()->getId()); | 251 | $this->getDoctrine()->getRepository('WallabagAnnotationBundle:Annotation')->removeAllByUserId($this->getUser()->getId()); |
255 | } | 252 | } |
256 | 253 | ||
257 | // manually remove tags to avoid orphan tag | 254 | // manually remove tags to avoid orphan tag |
258 | $this->removeAllTagsByUserId($this->getUser()->getId()); | 255 | $this->removeAllTagsByUserId($this->getUser()->getId()); |
259 | 256 | ||
260 | $this->getDoctrine() | 257 | $this->get('wallabag_core.entry_repository')->removeAllByUserId($this->getUser()->getId()); |
261 | ->getRepository('WallabagCoreBundle:Entry') | 258 | break; |
262 | ->removeAllByUserId($this->getUser()->getId()); | 259 | case 'archived': |
260 | if ($this->get('doctrine')->getConnection()->getDatabasePlatform() instanceof \Doctrine\DBAL\Platforms\SqlitePlatform) { | ||
261 | $this->removeAnnotationsForArchivedByUserId($this->getUser()->getId()); | ||
262 | } | ||
263 | |||
264 | // manually remove tags to avoid orphan tag | ||
265 | $this->removeTagsForArchivedByUserId($this->getUser()->getId()); | ||
266 | |||
267 | $this->get('wallabag_core.entry_repository')->removeArchivedByUserId($this->getUser()->getId()); | ||
268 | break; | ||
263 | } | 269 | } |
264 | 270 | ||
265 | $this->get('session')->getFlashBag()->add( | 271 | $this->get('session')->getFlashBag()->add( |
266 | 'notice', | 272 | 'notice', |
267 | 'flashes.config.notice.'.$type.'_reset' | 273 | 'flashes.config.notice.' . $type . '_reset' |
268 | ); | 274 | ); |
269 | 275 | ||
270 | return $this->redirect($this->generateUrl('config').'#set3'); | 276 | return $this->redirect($this->generateUrl('config') . '#set3'); |
271 | } | 277 | } |
272 | 278 | ||
273 | /** | 279 | /** |
274 | * Remove all tags for a given user and cleanup orphan tags. | 280 | * Delete account for current user. |
275 | * | 281 | * |
276 | * @param int $userId | 282 | * @Route("/account/delete", name="delete_account") |
283 | * | ||
284 | * @param Request $request | ||
285 | * | ||
286 | * @throws AccessDeniedHttpException | ||
287 | * | ||
288 | * @return \Symfony\Component\HttpFoundation\RedirectResponse | ||
277 | */ | 289 | */ |
278 | private function removeAllTagsByUserId($userId) | 290 | public function deleteAccountAction(Request $request) |
291 | { | ||
292 | $enabledUsers = $this->get('wallabag_user.user_repository') | ||
293 | ->getSumEnabledUsers(); | ||
294 | |||
295 | if ($enabledUsers <= 1) { | ||
296 | throw new AccessDeniedHttpException(); | ||
297 | } | ||
298 | |||
299 | $user = $this->getUser(); | ||
300 | |||
301 | // logout current user | ||
302 | $this->get('security.token_storage')->setToken(null); | ||
303 | $request->getSession()->invalidate(); | ||
304 | |||
305 | $em = $this->get('fos_user.user_manager'); | ||
306 | $em->deleteUser($user); | ||
307 | |||
308 | return $this->redirect($this->generateUrl('fos_user_security_login')); | ||
309 | } | ||
310 | |||
311 | /** | ||
312 | * Switch view mode for current user. | ||
313 | * | ||
314 | * @Route("/config/view-mode", name="switch_view_mode") | ||
315 | * | ||
316 | * @param Request $request | ||
317 | * | ||
318 | * @return \Symfony\Component\HttpFoundation\RedirectResponse | ||
319 | */ | ||
320 | public function changeViewModeAction(Request $request) | ||
279 | { | 321 | { |
280 | $tags = $this->getDoctrine()->getRepository('WallabagCoreBundle:Tag')->findAllTags($userId); | 322 | $user = $this->getUser(); |
323 | $user->getConfig()->setListMode(!$user->getConfig()->getListMode()); | ||
324 | |||
325 | $em = $this->getDoctrine()->getManager(); | ||
326 | $em->persist($user); | ||
327 | $em->flush(); | ||
281 | 328 | ||
329 | return $this->redirect($request->headers->get('referer')); | ||
330 | } | ||
331 | |||
332 | /** | ||
333 | * Remove all tags for given tags and a given user and cleanup orphan tags. | ||
334 | * | ||
335 | * @param array $tags | ||
336 | * @param int $userId | ||
337 | */ | ||
338 | private function removeAllTagsByStatusAndUserId($tags, $userId) | ||
339 | { | ||
282 | if (empty($tags)) { | 340 | if (empty($tags)) { |
283 | return; | 341 | return; |
284 | } | 342 | } |
285 | 343 | ||
286 | $this->getDoctrine() | 344 | $this->get('wallabag_core.entry_repository') |
287 | ->getRepository('WallabagCoreBundle:Entry') | ||
288 | ->removeTags($userId, $tags); | 345 | ->removeTags($userId, $tags); |
289 | 346 | ||
290 | // cleanup orphan tags | 347 | // cleanup orphan tags |
291 | $em = $this->getDoctrine()->getManager(); | 348 | $em = $this->getDoctrine()->getManager(); |
292 | 349 | ||
293 | foreach ($tags as $tag) { | 350 | foreach ($tags as $tag) { |
294 | if (count($tag->getEntries()) === 0) { | 351 | if (0 === count($tag->getEntries())) { |
295 | $em->remove($tag); | 352 | $em->remove($tag); |
296 | } | 353 | } |
297 | } | 354 | } |
@@ -300,13 +357,50 @@ class ConfigController extends Controller | |||
300 | } | 357 | } |
301 | 358 | ||
302 | /** | 359 | /** |
360 | * Remove all tags for a given user and cleanup orphan tags. | ||
361 | * | ||
362 | * @param int $userId | ||
363 | */ | ||
364 | private function removeAllTagsByUserId($userId) | ||
365 | { | ||
366 | $tags = $this->get('wallabag_core.tag_repository')->findAllTags($userId); | ||
367 | $this->removeAllTagsByStatusAndUserId($tags, $userId); | ||
368 | } | ||
369 | |||
370 | /** | ||
371 | * Remove all tags for a given user and cleanup orphan tags. | ||
372 | * | ||
373 | * @param int $userId | ||
374 | */ | ||
375 | private function removeTagsForArchivedByUserId($userId) | ||
376 | { | ||
377 | $tags = $this->get('wallabag_core.tag_repository')->findForArchivedArticlesByUser($userId); | ||
378 | $this->removeAllTagsByStatusAndUserId($tags, $userId); | ||
379 | } | ||
380 | |||
381 | private function removeAnnotationsForArchivedByUserId($userId) | ||
382 | { | ||
383 | $em = $this->getDoctrine()->getManager(); | ||
384 | |||
385 | $archivedEntriesAnnotations = $this->getDoctrine() | ||
386 | ->getRepository('WallabagAnnotationBundle:Annotation') | ||
387 | ->findAllArchivedEntriesByUser($userId); | ||
388 | |||
389 | foreach ($archivedEntriesAnnotations as $archivedEntriesAnnotation) { | ||
390 | $em->remove($archivedEntriesAnnotation); | ||
391 | } | ||
392 | |||
393 | $em->flush(); | ||
394 | } | ||
395 | |||
396 | /** | ||
303 | * Validate that a rule can be edited/deleted by the current user. | 397 | * Validate that a rule can be edited/deleted by the current user. |
304 | * | 398 | * |
305 | * @param TaggingRule $rule | 399 | * @param TaggingRule $rule |
306 | */ | 400 | */ |
307 | private function validateRuleAction(TaggingRule $rule) | 401 | private function validateRuleAction(TaggingRule $rule) |
308 | { | 402 | { |
309 | if ($this->getUser()->getId() != $rule->getConfig()->getUser()->getId()) { | 403 | if ($this->getUser()->getId() !== $rule->getConfig()->getUser()->getId()) { |
310 | throw $this->createAccessDeniedException('You can not access this tagging rule.'); | 404 | throw $this->createAccessDeniedException('You can not access this tagging rule.'); |
311 | } | 405 | } |
312 | } | 406 | } |
@@ -330,58 +424,4 @@ class ConfigController extends Controller | |||
330 | 424 | ||
331 | return $config; | 425 | return $config; |
332 | } | 426 | } |
333 | |||
334 | /** | ||
335 | * Delete account for current user. | ||
336 | * | ||
337 | * @Route("/account/delete", name="delete_account") | ||
338 | * | ||
339 | * @param Request $request | ||
340 | * | ||
341 | * @throws AccessDeniedHttpException | ||
342 | * | ||
343 | * @return \Symfony\Component\HttpFoundation\RedirectResponse | ||
344 | */ | ||
345 | public function deleteAccountAction(Request $request) | ||
346 | { | ||
347 | $enabledUsers = $this->getDoctrine() | ||
348 | ->getRepository('WallabagUserBundle:User') | ||
349 | ->getSumEnabledUsers(); | ||
350 | |||
351 | if ($enabledUsers <= 1) { | ||
352 | throw new AccessDeniedHttpException(); | ||
353 | } | ||
354 | |||
355 | $user = $this->getUser(); | ||
356 | |||
357 | // logout current user | ||
358 | $this->get('security.token_storage')->setToken(null); | ||
359 | $request->getSession()->invalidate(); | ||
360 | |||
361 | $em = $this->get('fos_user.user_manager'); | ||
362 | $em->deleteUser($user); | ||
363 | |||
364 | return $this->redirect($this->generateUrl('fos_user_security_login')); | ||
365 | } | ||
366 | |||
367 | /** | ||
368 | * Switch view mode for current user. | ||
369 | * | ||
370 | * @Route("/config/view-mode", name="switch_view_mode") | ||
371 | * | ||
372 | * @param Request $request | ||
373 | * | ||
374 | * @return \Symfony\Component\HttpFoundation\RedirectResponse | ||
375 | */ | ||
376 | public function changeViewModeAction(Request $request) | ||
377 | { | ||
378 | $user = $this->getUser(); | ||
379 | $user->getConfig()->setListMode(!$user->getConfig()->getListMode()); | ||
380 | |||
381 | $em = $this->getDoctrine()->getManager(); | ||
382 | $em->persist($user); | ||
383 | $em->flush(); | ||
384 | |||
385 | return $this->redirect($request->headers->get('referer')); | ||
386 | } | ||
387 | } | 427 | } |
diff --git a/src/Wallabag/CoreBundle/Controller/EntryController.php b/src/Wallabag/CoreBundle/Controller/EntryController.php index f7398e69..840dc254 100644 --- a/src/Wallabag/CoreBundle/Controller/EntryController.php +++ b/src/Wallabag/CoreBundle/Controller/EntryController.php | |||
@@ -4,17 +4,17 @@ namespace Wallabag\CoreBundle\Controller; | |||
4 | 4 | ||
5 | use Pagerfanta\Adapter\DoctrineORMAdapter; | 5 | use Pagerfanta\Adapter\DoctrineORMAdapter; |
6 | use Pagerfanta\Exception\OutOfRangeCurrentPageException; | 6 | use Pagerfanta\Exception\OutOfRangeCurrentPageException; |
7 | use Sensio\Bundle\FrameworkExtraBundle\Configuration\Cache; | ||
7 | use Sensio\Bundle\FrameworkExtraBundle\Configuration\Route; | 8 | use Sensio\Bundle\FrameworkExtraBundle\Configuration\Route; |
8 | use Symfony\Bundle\FrameworkBundle\Controller\Controller; | 9 | use Symfony\Bundle\FrameworkBundle\Controller\Controller; |
9 | use Symfony\Component\HttpFoundation\Request; | 10 | use Symfony\Component\HttpFoundation\Request; |
10 | use Symfony\Component\Routing\Generator\UrlGeneratorInterface; | 11 | use Symfony\Component\Routing\Generator\UrlGeneratorInterface; |
11 | use Wallabag\CoreBundle\Entity\Entry; | 12 | use Wallabag\CoreBundle\Entity\Entry; |
12 | use Wallabag\CoreBundle\Form\Type\EntryFilterType; | 13 | use Wallabag\CoreBundle\Event\EntryDeletedEvent; |
14 | use Wallabag\CoreBundle\Event\EntrySavedEvent; | ||
13 | use Wallabag\CoreBundle\Form\Type\EditEntryType; | 15 | use Wallabag\CoreBundle\Form\Type\EditEntryType; |
16 | use Wallabag\CoreBundle\Form\Type\EntryFilterType; | ||
14 | use Wallabag\CoreBundle\Form\Type\NewEntryType; | 17 | use Wallabag\CoreBundle\Form\Type\NewEntryType; |
15 | use Sensio\Bundle\FrameworkExtraBundle\Configuration\Cache; | ||
16 | use Wallabag\CoreBundle\Event\EntrySavedEvent; | ||
17 | use Wallabag\CoreBundle\Event\EntryDeletedEvent; | ||
18 | use Wallabag\CoreBundle\Form\Type\SearchEntryType; | 18 | use Wallabag\CoreBundle\Form\Type\SearchEntryType; |
19 | 19 | ||
20 | class EntryController extends Controller | 20 | class EntryController extends Controller |
@@ -52,38 +52,6 @@ class EntryController extends Controller | |||
52 | } | 52 | } |
53 | 53 | ||
54 | /** | 54 | /** |
55 | * Fetch content and update entry. | ||
56 | * In case it fails, entry will return to avod loosing the data. | ||
57 | * | ||
58 | * @param Entry $entry | ||
59 | * @param string $prefixMessage Should be the translation key: entry_saved or entry_reloaded | ||
60 | * | ||
61 | * @return Entry | ||
62 | */ | ||
63 | private function updateEntry(Entry $entry, $prefixMessage = 'entry_saved') | ||
64 | { | ||
65 | // put default title in case of fetching content failed | ||
66 | $entry->setTitle('No title found'); | ||
67 | |||
68 | $message = 'flashes.entry.notice.'.$prefixMessage; | ||
69 | |||
70 | try { | ||
71 | $entry = $this->get('wallabag_core.content_proxy')->updateEntry($entry, $entry->getUrl()); | ||
72 | } catch (\Exception $e) { | ||
73 | $this->get('logger')->error('Error while saving an entry', [ | ||
74 | 'exception' => $e, | ||
75 | 'entry' => $entry, | ||
76 | ]); | ||
77 | |||
78 | $message = 'flashes.entry.notice.'.$prefixMessage.'_failed'; | ||
79 | } | ||
80 | |||
81 | $this->get('session')->getFlashBag()->add('notice', $message); | ||
82 | |||
83 | return $entry; | ||
84 | } | ||
85 | |||
86 | /** | ||
87 | * @param Request $request | 55 | * @param Request $request |
88 | * | 56 | * |
89 | * @Route("/new-entry", name="new_entry") | 57 | * @Route("/new-entry", name="new_entry") |
@@ -227,7 +195,7 @@ class EntryController extends Controller | |||
227 | public function showUnreadAction(Request $request, $page) | 195 | public function showUnreadAction(Request $request, $page) |
228 | { | 196 | { |
229 | // load the quickstart if no entry in database | 197 | // load the quickstart if no entry in database |
230 | if ($page == 1 && $this->get('wallabag_core.entry_repository')->countAllEntriesByUsername($this->getUser()->getId()) == 0) { | 198 | if (1 === (int) $page && 0 === $this->get('wallabag_core.entry_repository')->countAllEntriesByUser($this->getUser()->getId())) { |
231 | return $this->redirect($this->generateUrl('quickstart')); | 199 | return $this->redirect($this->generateUrl('quickstart')); |
232 | } | 200 | } |
233 | 201 | ||
@@ -265,84 +233,6 @@ class EntryController extends Controller | |||
265 | } | 233 | } |
266 | 234 | ||
267 | /** | 235 | /** |
268 | * Global method to retrieve entries depending on the given type | ||
269 | * It returns the response to be send. | ||
270 | * | ||
271 | * @param string $type Entries type: unread, starred or archive | ||
272 | * @param Request $request | ||
273 | * @param int $page | ||
274 | * | ||
275 | * @return \Symfony\Component\HttpFoundation\Response | ||
276 | */ | ||
277 | private function showEntries($type, Request $request, $page) | ||
278 | { | ||
279 | $repository = $this->get('wallabag_core.entry_repository'); | ||
280 | $searchTerm = (isset($request->get('search_entry')['term']) ? $request->get('search_entry')['term'] : ''); | ||
281 | $currentRoute = (!is_null($request->query->get('currentRoute')) ? $request->query->get('currentRoute') : ''); | ||
282 | |||
283 | switch ($type) { | ||
284 | case 'search': | ||
285 | $qb = $repository->getBuilderForSearchByUser($this->getUser()->getId(), $searchTerm, $currentRoute); | ||
286 | |||
287 | break; | ||
288 | case 'untagged': | ||
289 | $qb = $repository->getBuilderForUntaggedByUser($this->getUser()->getId()); | ||
290 | |||
291 | break; | ||
292 | case 'starred': | ||
293 | $qb = $repository->getBuilderForStarredByUser($this->getUser()->getId()); | ||
294 | break; | ||
295 | |||
296 | case 'archive': | ||
297 | $qb = $repository->getBuilderForArchiveByUser($this->getUser()->getId()); | ||
298 | break; | ||
299 | |||
300 | case 'unread': | ||
301 | $qb = $repository->getBuilderForUnreadByUser($this->getUser()->getId()); | ||
302 | break; | ||
303 | |||
304 | case 'all': | ||
305 | $qb = $repository->getBuilderForAllByUser($this->getUser()->getId()); | ||
306 | break; | ||
307 | |||
308 | default: | ||
309 | throw new \InvalidArgumentException(sprintf('Type "%s" is not implemented.', $type)); | ||
310 | } | ||
311 | |||
312 | $form = $this->createForm(EntryFilterType::class); | ||
313 | |||
314 | if ($request->query->has($form->getName())) { | ||
315 | // manually bind values from the request | ||
316 | $form->submit($request->query->get($form->getName())); | ||
317 | |||
318 | // build the query from the given form object | ||
319 | $this->get('lexik_form_filter.query_builder_updater')->addFilterConditions($form, $qb); | ||
320 | } | ||
321 | |||
322 | $pagerAdapter = new DoctrineORMAdapter($qb->getQuery(), true, false); | ||
323 | |||
324 | $entries = $this->get('wallabag_core.helper.prepare_pager_for_entries') | ||
325 | ->prepare($pagerAdapter, $page); | ||
326 | |||
327 | try { | ||
328 | $entries->setCurrentPage($page); | ||
329 | } catch (OutOfRangeCurrentPageException $e) { | ||
330 | if ($page > 1) { | ||
331 | return $this->redirect($this->generateUrl($type, ['page' => $entries->getNbPages()]), 302); | ||
332 | } | ||
333 | } | ||
334 | |||
335 | return $this->render( | ||
336 | 'WallabagCoreBundle:Entry:entries.html.twig', [ | ||
337 | 'form' => $form->createView(), | ||
338 | 'entries' => $entries, | ||
339 | 'currentPage' => $page, | ||
340 | 'searchTerm' => $searchTerm, | ||
341 | ] | ||
342 | ); | ||
343 | } | ||
344 | |||
345 | /** | ||
346 | * Shows entry content. | 236 | * Shows entry content. |
347 | * | 237 | * |
348 | * @param Entry $entry | 238 | * @param Entry $entry |
@@ -443,6 +333,7 @@ class EntryController extends Controller | |||
443 | $this->checkUserAction($entry); | 333 | $this->checkUserAction($entry); |
444 | 334 | ||
445 | $entry->toggleStar(); | 335 | $entry->toggleStar(); |
336 | $entry->updateStar($entry->isStarred()); | ||
446 | $this->getDoctrine()->getManager()->flush(); | 337 | $this->getDoctrine()->getManager()->flush(); |
447 | 338 | ||
448 | $message = 'flashes.entry.notice.entry_unstarred'; | 339 | $message = 'flashes.entry.notice.entry_unstarred'; |
@@ -495,7 +386,7 @@ class EntryController extends Controller | |||
495 | 386 | ||
496 | // don't redirect user to the deleted entry (check that the referer doesn't end with the same url) | 387 | // don't redirect user to the deleted entry (check that the referer doesn't end with the same url) |
497 | $referer = $request->headers->get('referer'); | 388 | $referer = $request->headers->get('referer'); |
498 | $to = (1 !== preg_match('#'.$url.'$#i', $referer) ? $referer : null); | 389 | $to = (1 !== preg_match('#' . $url . '$#i', $referer) ? $referer : null); |
499 | 390 | ||
500 | $redirectUrl = $this->get('wallabag_core.helper.redirect')->to($to); | 391 | $redirectUrl = $this->get('wallabag_core.helper.redirect')->to($to); |
501 | 392 | ||
@@ -503,30 +394,6 @@ class EntryController extends Controller | |||
503 | } | 394 | } |
504 | 395 | ||
505 | /** | 396 | /** |
506 | * Check if the logged user can manage the given entry. | ||
507 | * | ||
508 | * @param Entry $entry | ||
509 | */ | ||
510 | private function checkUserAction(Entry $entry) | ||
511 | { | ||
512 | if (null === $this->getUser() || $this->getUser()->getId() != $entry->getUser()->getId()) { | ||
513 | throw $this->createAccessDeniedException('You can not access this entry.'); | ||
514 | } | ||
515 | } | ||
516 | |||
517 | /** | ||
518 | * Check for existing entry, if it exists, redirect to it with a message. | ||
519 | * | ||
520 | * @param Entry $entry | ||
521 | * | ||
522 | * @return Entry|bool | ||
523 | */ | ||
524 | private function checkIfEntryAlreadyExists(Entry $entry) | ||
525 | { | ||
526 | return $this->get('wallabag_core.entry_repository')->findByUrlAndUserId($entry->getUrl(), $this->getUser()->getId()); | ||
527 | } | ||
528 | |||
529 | /** | ||
530 | * Get public URL for entry (and generate it if necessary). | 397 | * Get public URL for entry (and generate it if necessary). |
531 | * | 398 | * |
532 | * @param Entry $entry | 399 | * @param Entry $entry |
@@ -612,4 +479,127 @@ class EntryController extends Controller | |||
612 | { | 479 | { |
613 | return $this->showEntries('untagged', $request, $page); | 480 | return $this->showEntries('untagged', $request, $page); |
614 | } | 481 | } |
482 | |||
483 | /** | ||
484 | * Fetch content and update entry. | ||
485 | * In case it fails, $entry->getContent will return an error message. | ||
486 | * | ||
487 | * @param Entry $entry | ||
488 | * @param string $prefixMessage Should be the translation key: entry_saved or entry_reloaded | ||
489 | */ | ||
490 | private function updateEntry(Entry $entry, $prefixMessage = 'entry_saved') | ||
491 | { | ||
492 | $message = 'flashes.entry.notice.' . $prefixMessage; | ||
493 | |||
494 | try { | ||
495 | $this->get('wallabag_core.content_proxy')->updateEntry($entry, $entry->getUrl()); | ||
496 | } catch (\Exception $e) { | ||
497 | $this->get('logger')->error('Error while saving an entry', [ | ||
498 | 'exception' => $e, | ||
499 | 'entry' => $entry, | ||
500 | ]); | ||
501 | |||
502 | $message = 'flashes.entry.notice.' . $prefixMessage . '_failed'; | ||
503 | } | ||
504 | |||
505 | $this->get('session')->getFlashBag()->add('notice', $message); | ||
506 | } | ||
507 | |||
508 | /** | ||
509 | * Global method to retrieve entries depending on the given type | ||
510 | * It returns the response to be send. | ||
511 | * | ||
512 | * @param string $type Entries type: unread, starred or archive | ||
513 | * @param Request $request | ||
514 | * @param int $page | ||
515 | * | ||
516 | * @return \Symfony\Component\HttpFoundation\Response | ||
517 | */ | ||
518 | private function showEntries($type, Request $request, $page) | ||
519 | { | ||
520 | $repository = $this->get('wallabag_core.entry_repository'); | ||
521 | $searchTerm = (isset($request->get('search_entry')['term']) ? $request->get('search_entry')['term'] : ''); | ||
522 | $currentRoute = (null !== $request->query->get('currentRoute') ? $request->query->get('currentRoute') : ''); | ||
523 | |||
524 | switch ($type) { | ||
525 | case 'search': | ||
526 | $qb = $repository->getBuilderForSearchByUser($this->getUser()->getId(), $searchTerm, $currentRoute); | ||
527 | |||
528 | break; | ||
529 | case 'untagged': | ||
530 | $qb = $repository->getBuilderForUntaggedByUser($this->getUser()->getId()); | ||
531 | |||
532 | break; | ||
533 | case 'starred': | ||
534 | $qb = $repository->getBuilderForStarredByUser($this->getUser()->getId()); | ||
535 | break; | ||
536 | case 'archive': | ||
537 | $qb = $repository->getBuilderForArchiveByUser($this->getUser()->getId()); | ||
538 | break; | ||
539 | case 'unread': | ||
540 | $qb = $repository->getBuilderForUnreadByUser($this->getUser()->getId()); | ||
541 | break; | ||
542 | case 'all': | ||
543 | $qb = $repository->getBuilderForAllByUser($this->getUser()->getId()); | ||
544 | break; | ||
545 | default: | ||
546 | throw new \InvalidArgumentException(sprintf('Type "%s" is not implemented.', $type)); | ||
547 | } | ||
548 | |||
549 | $form = $this->createForm(EntryFilterType::class); | ||
550 | |||
551 | if ($request->query->has($form->getName())) { | ||
552 | // manually bind values from the request | ||
553 | $form->submit($request->query->get($form->getName())); | ||
554 | |||
555 | // build the query from the given form object | ||
556 | $this->get('lexik_form_filter.query_builder_updater')->addFilterConditions($form, $qb); | ||
557 | } | ||
558 | |||
559 | $pagerAdapter = new DoctrineORMAdapter($qb->getQuery(), true, false); | ||
560 | |||
561 | $entries = $this->get('wallabag_core.helper.prepare_pager_for_entries')->prepare($pagerAdapter); | ||
562 | |||
563 | try { | ||
564 | $entries->setCurrentPage($page); | ||
565 | } catch (OutOfRangeCurrentPageException $e) { | ||
566 | if ($page > 1) { | ||
567 | return $this->redirect($this->generateUrl($type, ['page' => $entries->getNbPages()]), 302); | ||
568 | } | ||
569 | } | ||
570 | |||
571 | return $this->render( | ||
572 | 'WallabagCoreBundle:Entry:entries.html.twig', [ | ||
573 | 'form' => $form->createView(), | ||
574 | 'entries' => $entries, | ||
575 | 'currentPage' => $page, | ||
576 | 'searchTerm' => $searchTerm, | ||
577 | 'isFiltered' => $form->isSubmitted(), | ||
578 | ] | ||
579 | ); | ||
580 | } | ||
581 | |||
582 | /** | ||
583 | * Check if the logged user can manage the given entry. | ||
584 | * | ||
585 | * @param Entry $entry | ||
586 | */ | ||
587 | private function checkUserAction(Entry $entry) | ||
588 | { | ||
589 | if (null === $this->getUser() || $this->getUser()->getId() !== $entry->getUser()->getId()) { | ||
590 | throw $this->createAccessDeniedException('You can not access this entry.'); | ||
591 | } | ||
592 | } | ||
593 | |||
594 | /** | ||
595 | * Check for existing entry, if it exists, redirect to it with a message. | ||
596 | * | ||
597 | * @param Entry $entry | ||
598 | * | ||
599 | * @return Entry|bool | ||
600 | */ | ||
601 | private function checkIfEntryAlreadyExists(Entry $entry) | ||
602 | { | ||
603 | return $this->get('wallabag_core.entry_repository')->findByUrlAndUserId($entry->getUrl(), $this->getUser()->getId()); | ||
604 | } | ||
615 | } | 605 | } |
diff --git a/src/Wallabag/CoreBundle/Controller/ExceptionController.php b/src/Wallabag/CoreBundle/Controller/ExceptionController.php index abfa9c2f..461309ea 100644 --- a/src/Wallabag/CoreBundle/Controller/ExceptionController.php +++ b/src/Wallabag/CoreBundle/Controller/ExceptionController.php | |||
@@ -14,7 +14,7 @@ class ExceptionController extends BaseExceptionController | |||
14 | protected function findTemplate(Request $request, $format, $code, $showException) | 14 | protected function findTemplate(Request $request, $format, $code, $showException) |
15 | { | 15 | { |
16 | $name = $showException ? 'exception' : 'error'; | 16 | $name = $showException ? 'exception' : 'error'; |
17 | if ($showException && 'html' == $format) { | 17 | if ($showException && 'html' === $format) { |
18 | $name = 'exception_full'; | 18 | $name = 'exception_full'; |
19 | } | 19 | } |
20 | 20 | ||
diff --git a/src/Wallabag/CoreBundle/Controller/ExportController.php b/src/Wallabag/CoreBundle/Controller/ExportController.php index abc3336a..7ca89239 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. |
@@ -34,6 +33,7 @@ class ExportController extends Controller | |||
34 | return $this->get('wallabag_core.helper.entries_export') | 33 | return $this->get('wallabag_core.helper.entries_export') |
35 | ->setEntries($entry) | 34 | ->setEntries($entry) |
36 | ->updateTitle('entry') | 35 | ->updateTitle('entry') |
36 | ->updateAuthor('entry') | ||
37 | ->exportAs($format); | 37 | ->exportAs($format); |
38 | } catch (\InvalidArgumentException $e) { | 38 | } catch (\InvalidArgumentException $e) { |
39 | throw new NotFoundHttpException($e->getMessage()); | 39 | throw new NotFoundHttpException($e->getMessage()); |
@@ -56,17 +56,18 @@ class ExportController extends Controller | |||
56 | public function downloadEntriesAction(Request $request, $format, $category) | 56 | public function downloadEntriesAction(Request $request, $format, $category) |
57 | { | 57 | { |
58 | $method = ucfirst($category); | 58 | $method = ucfirst($category); |
59 | $methodBuilder = 'getBuilderFor'.$method.'ByUser'; | 59 | $methodBuilder = 'getBuilderFor' . $method . 'ByUser'; |
60 | $repository = $this->get('wallabag_core.entry_repository'); | ||
60 | 61 | ||
61 | if ($category == 'tag_entries') { | 62 | if ('tag_entries' === $category) { |
62 | $tag = $this->getDoctrine()->getRepository('WallabagCoreBundle:Tag')->findOneBySlug($request->query->get('tag')); | 63 | $tag = $this->get('wallabag_core.tag_repository')->findOneBySlug($request->query->get('tag')); |
63 | 64 | ||
64 | $entries = $this->getDoctrine() | 65 | $entries = $repository->findAllByTagId( |
65 | ->getRepository('WallabagCoreBundle:Entry') | 66 | $this->getUser()->getId(), |
66 | ->findAllByTagId($this->getUser()->getId(), $tag->getId()); | 67 | $tag->getId() |
68 | ); | ||
67 | } else { | 69 | } else { |
68 | $entries = $this->getDoctrine() | 70 | $entries = $repository |
69 | ->getRepository('WallabagCoreBundle:Entry') | ||
70 | ->$methodBuilder($this->getUser()->getId()) | 71 | ->$methodBuilder($this->getUser()->getId()) |
71 | ->getQuery() | 72 | ->getQuery() |
72 | ->getResult(); | 73 | ->getResult(); |
@@ -76,6 +77,7 @@ class ExportController extends Controller | |||
76 | return $this->get('wallabag_core.helper.entries_export') | 77 | return $this->get('wallabag_core.helper.entries_export') |
77 | ->setEntries($entries) | 78 | ->setEntries($entries) |
78 | ->updateTitle($method) | 79 | ->updateTitle($method) |
80 | ->updateAuthor($method) | ||
79 | ->exportAs($format); | 81 | ->exportAs($format); |
80 | } catch (\InvalidArgumentException $e) { | 82 | } catch (\InvalidArgumentException $e) { |
81 | throw new NotFoundHttpException($e->getMessage()); | 83 | throw new NotFoundHttpException($e->getMessage()); |
diff --git a/src/Wallabag/CoreBundle/Controller/RssController.php b/src/Wallabag/CoreBundle/Controller/RssController.php index 92f18707..e84044b1 100644 --- a/src/Wallabag/CoreBundle/Controller/RssController.php +++ b/src/Wallabag/CoreBundle/Controller/RssController.php | |||
@@ -2,16 +2,19 @@ | |||
2 | 2 | ||
3 | namespace Wallabag\CoreBundle\Controller; | 3 | namespace Wallabag\CoreBundle\Controller; |
4 | 4 | ||
5 | use Pagerfanta\Adapter\ArrayAdapter; | ||
5 | use Pagerfanta\Adapter\DoctrineORMAdapter; | 6 | use Pagerfanta\Adapter\DoctrineORMAdapter; |
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\Bundle\FrameworkBundle\Controller\Controller; | 11 | use Symfony\Bundle\FrameworkBundle\Controller\Controller; |
12 | use Symfony\Component\HttpFoundation\Request; | ||
13 | use Symfony\Component\HttpFoundation\Response; | ||
14 | use Symfony\Component\Routing\Generator\UrlGeneratorInterface; | ||
12 | use Wallabag\CoreBundle\Entity\Entry; | 15 | use Wallabag\CoreBundle\Entity\Entry; |
16 | use Wallabag\CoreBundle\Entity\Tag; | ||
13 | use Wallabag\UserBundle\Entity\User; | 17 | use Wallabag\UserBundle\Entity\User; |
14 | use Symfony\Component\Routing\Generator\UrlGeneratorInterface; | ||
15 | 18 | ||
16 | class RssController extends Controller | 19 | class RssController extends Controller |
17 | { | 20 | { |
@@ -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,21 +141,21 @@ 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': |
73 | $qb = $repository->getBuilderForStarredByUser($user->getId()); | 148 | $qb = $repository->getBuilderForStarredByUser($user->getId()); |
74 | break; | 149 | break; |
75 | |||
76 | case 'archive': | 150 | case 'archive': |
77 | $qb = $repository->getBuilderForArchiveByUser($user->getId()); | 151 | $qb = $repository->getBuilderForArchiveByUser($user->getId()); |
78 | break; | 152 | break; |
79 | |||
80 | case 'unread': | 153 | case 'unread': |
81 | $qb = $repository->getBuilderForUnreadByUser($user->getId()); | 154 | $qb = $repository->getBuilderForUnreadByUser($user->getId()); |
82 | break; | 155 | break; |
83 | 156 | case 'all': | |
157 | $qb = $repository->getBuilderForAllByUser($user->getId()); | ||
158 | break; | ||
84 | default: | 159 | default: |
85 | throw new \InvalidArgumentException(sprintf('Type "%s" is not implemented.', $type)); | 160 | throw new \InvalidArgumentException(sprintf('Type "%s" is not implemented.', $type)); |
86 | } | 161 | } |
@@ -92,7 +167,7 @@ class RssController extends Controller | |||
92 | $entries->setMaxPerPage($perPage); | 167 | $entries->setMaxPerPage($perPage); |
93 | 168 | ||
94 | $url = $this->generateUrl( | 169 | $url = $this->generateUrl( |
95 | $type.'_rss', | 170 | $type . '_rss', |
96 | [ | 171 | [ |
97 | 'username' => $user->getUsername(), | 172 | 'username' => $user->getUsername(), |
98 | 'token' => $user->getConfig()->getRssToken(), | 173 | 'token' => $user->getConfig()->getRssToken(), |
@@ -104,14 +179,19 @@ class RssController extends Controller | |||
104 | $entries->setCurrentPage((int) $page); | 179 | $entries->setCurrentPage((int) $page); |
105 | } catch (OutOfRangeCurrentPageException $e) { | 180 | } catch (OutOfRangeCurrentPageException $e) { |
106 | if ($page > 1) { | 181 | if ($page > 1) { |
107 | return $this->redirect($url.'?page='.$entries->getNbPages(), 302); | 182 | return $this->redirect($url . '?page=' . $entries->getNbPages(), 302); |
108 | } | 183 | } |
109 | } | 184 | } |
110 | 185 | ||
111 | return $this->render('@WallabagCore/themes/common/Entry/entries.xml.twig', [ | 186 | return $this->render( |
112 | 'type' => $type, | 187 | '@WallabagCore/themes/common/Entry/entries.xml.twig', |
113 | 'url' => $url, | 188 | [ |
114 | 'entries' => $entries, | 189 | 'url_html' => $this->generateUrl($type, [], UrlGeneratorInterface::ABSOLUTE_URL), |
115 | ]); | 190 | 'type' => $type, |
191 | 'url' => $url, | ||
192 | 'entries' => $entries, | ||
193 | ], | ||
194 | new Response('', 200, ['Content-Type' => 'application/rss+xml']) | ||
195 | ); | ||
116 | } | 196 | } |
117 | } | 197 | } |
diff --git a/src/Wallabag/CoreBundle/Controller/SiteCredentialController.php b/src/Wallabag/CoreBundle/Controller/SiteCredentialController.php new file mode 100644 index 00000000..fa2066dc --- /dev/null +++ b/src/Wallabag/CoreBundle/Controller/SiteCredentialController.php | |||
@@ -0,0 +1,174 @@ | |||
1 | <?php | ||
2 | |||
3 | namespace Wallabag\CoreBundle\Controller; | ||
4 | |||
5 | use Sensio\Bundle\FrameworkExtraBundle\Configuration\Method; | ||
6 | use Sensio\Bundle\FrameworkExtraBundle\Configuration\Route; | ||
7 | use Symfony\Bundle\FrameworkBundle\Controller\Controller; | ||
8 | use Symfony\Component\HttpFoundation\Request; | ||
9 | use Wallabag\CoreBundle\Entity\SiteCredential; | ||
10 | use Wallabag\UserBundle\Entity\User; | ||
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/StaticController.php b/src/Wallabag/CoreBundle/Controller/StaticController.php index 82714217..318af303 100644 --- a/src/Wallabag/CoreBundle/Controller/StaticController.php +++ b/src/Wallabag/CoreBundle/Controller/StaticController.php | |||
@@ -16,7 +16,9 @@ class StaticController extends Controller | |||
16 | 16 | ||
17 | return $this->render( | 17 | return $this->render( |
18 | '@WallabagCore/themes/common/Static/howto.html.twig', | 18 | '@WallabagCore/themes/common/Static/howto.html.twig', |
19 | ['addonsUrl' => $addonsUrl] | 19 | [ |
20 | 'addonsUrl' => $addonsUrl, | ||
21 | ] | ||
20 | ); | 22 | ); |
21 | } | 23 | } |
22 | 24 | ||
@@ -40,8 +42,7 @@ class StaticController extends Controller | |||
40 | public function quickstartAction() | 42 | public function quickstartAction() |
41 | { | 43 | { |
42 | return $this->render( | 44 | return $this->render( |
43 | '@WallabagCore/themes/common/Static/quickstart.html.twig', | 45 | '@WallabagCore/themes/common/Static/quickstart.html.twig' |
44 | [] | ||
45 | ); | 46 | ); |
46 | } | 47 | } |
47 | } | 48 | } |
diff --git a/src/Wallabag/CoreBundle/Controller/TagController.php b/src/Wallabag/CoreBundle/Controller/TagController.php index 8a093289..616c37f2 100644 --- a/src/Wallabag/CoreBundle/Controller/TagController.php +++ b/src/Wallabag/CoreBundle/Controller/TagController.php | |||
@@ -4,13 +4,13 @@ namespace Wallabag\CoreBundle\Controller; | |||
4 | 4 | ||
5 | use Pagerfanta\Adapter\ArrayAdapter; | 5 | use Pagerfanta\Adapter\ArrayAdapter; |
6 | use Pagerfanta\Exception\OutOfRangeCurrentPageException; | 6 | use Pagerfanta\Exception\OutOfRangeCurrentPageException; |
7 | use Sensio\Bundle\FrameworkExtraBundle\Configuration\ParamConverter; | ||
7 | use Sensio\Bundle\FrameworkExtraBundle\Configuration\Route; | 8 | use Sensio\Bundle\FrameworkExtraBundle\Configuration\Route; |
8 | use Symfony\Bundle\FrameworkBundle\Controller\Controller; | 9 | use Symfony\Bundle\FrameworkBundle\Controller\Controller; |
9 | use Symfony\Component\HttpFoundation\Request; | 10 | use Symfony\Component\HttpFoundation\Request; |
10 | use Wallabag\CoreBundle\Entity\Entry; | 11 | use Wallabag\CoreBundle\Entity\Entry; |
11 | use Wallabag\CoreBundle\Entity\Tag; | 12 | use Wallabag\CoreBundle\Entity\Tag; |
12 | use Wallabag\CoreBundle\Form\Type\NewTagType; | 13 | use Wallabag\CoreBundle\Form\Type\NewTagType; |
13 | use Sensio\Bundle\FrameworkExtraBundle\Configuration\ParamConverter; | ||
14 | 14 | ||
15 | class TagController extends Controller | 15 | class TagController extends Controller |
16 | { | 16 | { |
@@ -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 | ); |
@@ -65,12 +65,12 @@ class TagController extends Controller | |||
65 | $em->flush(); | 65 | $em->flush(); |
66 | 66 | ||
67 | // remove orphan tag in case no entries are associated to it | 67 | // remove orphan tag in case no entries are associated to it |
68 | if (count($tag->getEntries()) === 0) { | 68 | if (0 === count($tag->getEntries())) { |
69 | $em->remove($tag); | 69 | $em->remove($tag); |
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,27 +84,11 @@ class TagController extends Controller | |||
84 | */ | 84 | */ |
85 | public function showTagAction() | 85 | public function showTagAction() |
86 | { | 86 | { |
87 | $tags = $this->getDoctrine() | 87 | $tags = $this->get('wallabag_core.tag_repository') |
88 | ->getRepository('WallabagCoreBundle:Tag') | 88 | ->findAllFlatTagsWithNbEntries($this->getUser()->getId()); |
89 | ->findAllTags($this->getUser()->getId()); | ||
90 | |||
91 | $flatTags = []; | ||
92 | |||
93 | foreach ($tags as $tag) { | ||
94 | $nbEntries = $this->getDoctrine() | ||
95 | ->getRepository('WallabagCoreBundle:Entry') | ||
96 | ->countAllEntriesByUserIdAndTagId($this->getUser()->getId(), $tag->getId()); | ||
97 | |||
98 | $flatTags[] = [ | ||
99 | 'id' => $tag->getId(), | ||
100 | 'label' => $tag->getLabel(), | ||
101 | 'slug' => $tag->getSlug(), | ||
102 | 'nbEntries' => $nbEntries, | ||
103 | ]; | ||
104 | } | ||
105 | 89 | ||
106 | return $this->render('WallabagCoreBundle:Tag:tags.html.twig', [ | 90 | return $this->render('WallabagCoreBundle:Tag:tags.html.twig', [ |
107 | 'tags' => $flatTags, | 91 | 'tags' => $tags, |
108 | ]); | 92 | ]); |
109 | } | 93 | } |
110 | 94 | ||
@@ -119,14 +103,14 @@ class TagController extends Controller | |||
119 | */ | 103 | */ |
120 | public function showEntriesForTagAction(Tag $tag, $page, Request $request) | 104 | public function showEntriesForTagAction(Tag $tag, $page, Request $request) |
121 | { | 105 | { |
122 | $entriesByTag = $this->getDoctrine() | 106 | $entriesByTag = $this->get('wallabag_core.entry_repository')->findAllByTagId( |
123 | ->getRepository('WallabagCoreBundle:Entry') | 107 | $this->getUser()->getId(), |
124 | ->findAllByTagId($this->getUser()->getId(), $tag->getId()); | 108 | $tag->getId() |
109 | ); | ||
125 | 110 | ||
126 | $pagerAdapter = new ArrayAdapter($entriesByTag); | 111 | $pagerAdapter = new ArrayAdapter($entriesByTag); |
127 | 112 | ||
128 | $entries = $this->get('wallabag_core.helper.prepare_pager_for_entries') | 113 | $entries = $this->get('wallabag_core.helper.prepare_pager_for_entries')->prepare($pagerAdapter); |
129 | ->prepare($pagerAdapter, $page); | ||
130 | 114 | ||
131 | try { | 115 | try { |
132 | $entries->setCurrentPage($page); | 116 | $entries->setCurrentPage($page); |
@@ -143,7 +127,7 @@ class TagController extends Controller | |||
143 | 'form' => null, | 127 | 'form' => null, |
144 | 'entries' => $entries, | 128 | 'entries' => $entries, |
145 | 'currentPage' => $page, | 129 | 'currentPage' => $page, |
146 | 'tag' => $tag->getSlug(), | 130 | 'tag' => $tag, |
147 | ]); | 131 | ]); |
148 | } | 132 | } |
149 | } | 133 | } |