From a13726025e8c86a99771734d60e33aec41f3cc62 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Beno=C3=AEt=20Burnichon?= Date: Thu, 14 May 2015 17:43:25 +0200 Subject: [PATCH] Feed Controller split into method calls --- .../Phrasea/ControllerProvider/Prod/Feed.php | 506 ++++++++++-------- 1 file changed, 284 insertions(+), 222 deletions(-) diff --git a/lib/Alchemy/Phrasea/ControllerProvider/Prod/Feed.php b/lib/Alchemy/Phrasea/ControllerProvider/Prod/Feed.php index a9bc9d8314..cdd70fabd0 100644 --- a/lib/Alchemy/Phrasea/ControllerProvider/Prod/Feed.php +++ b/lib/Alchemy/Phrasea/ControllerProvider/Prod/Feed.php @@ -36,246 +36,308 @@ class Feed implements ControllerProviderInterface $controllers = $this->createAuthenticatedCollection($app); - $controllers->post('/requestavailable/', function (Application $app, Request $request) { - $feeds = $app['repo.feeds']->getAllForUser( - $app['acl']->get($app['authentication']->getUser()) - ); - $publishing = RecordsRequest::fromRequest($app, $request, true, [], ['bas_chupub']); + $controllers->post('/requestavailable/', 'controller.prod.feed:publishRecordsAction'); - return $app['twig']->render('prod/actions/publish/publish.html.twig', ['publishing' => $publishing, 'feeds' => $feeds]); - }); - - $controllers->post('/entry/create/', function (Application $app, Request $request) { - $feed = $app['repo.feeds']->find($request->request->get('feed_id')); - - if (null === $feed) { - $app->abort(404, "Feed not found"); - } - - $publisher = $app['repo.feed-publishers']->findOneBy(['feed' => $feed, 'user' => $app['authentication']->getUser()]); - - if ('' === $title = trim($request->request->get('title', ''))) { - $app->abort(400, "Bad request"); - } - - if (!$feed->isPublisher($app['authentication']->getUser())) { - $app->abort(403, 'Unathorized action'); - } - - $entry = new FeedEntry(); - $entry->setAuthorEmail($request->request->get('author_mail')) - ->setAuthorName($request->request->get('author_name')) - ->setTitle($title) - ->setFeed($feed) - ->setPublisher($publisher) - ->setSubtitle($request->request->get('subtitle', '')); - - $feed->addEntry($entry); - - $publishing = RecordsRequest::fromRequest($app, $request, true, [], ['bas_chupub']); - foreach ($publishing as $record) { - $item = new FeedItem(); - $item->setEntry($entry) - ->setRecordId($record->get_record_id()) - ->setSbasId($record->get_sbas_id()); - $entry->addItem($item); - $app['orm.em']->persist($item); - } - - $app['orm.em']->persist($entry); - $app['orm.em']->persist($feed); - $app['orm.em']->flush(); - - $app['dispatcher']->dispatch(PhraseaEvents::FEED_ENTRY_CREATE, new FeedEntryEvent($entry, $request->request->get('notify'))); - - $datas = ['error' => false, 'message' => false]; - - return $app->json($datas); - }) + $controllers->post('/entry/create/', 'controller.prod.feed:createFeedEntryAction') ->bind('prod_feeds_entry_create') - ->before(function (Request $request) use ($app) { - $app['firewall']->requireRight('bas_chupub'); - }); + ->before('controller.prod.feed:ensureUserHasPublishRight'); - $controllers->get('/entry/{id}/edit/', function (Application $app, Request $request, $id) { - $entry = $app['repo.feed-entries']->find($id); - - if (!$entry->isPublisher($app['authentication']->getUser())) { - throw new AccessDeniedHttpException(); - } - - $feeds = $app['repo.feeds']->getAllForUser($app['acl']->get($app['authentication']->getUser())); - - $datas = $app['twig']->render('prod/actions/publish/publish_edit.html.twig', ['entry' => $entry, 'feeds' => $feeds]); - - return new Response($datas); - }) + $controllers->get('/entry/{id}/edit/', 'controller.prod.feed:editEntryAction') ->bind('prod_feeds_entry_edit') ->assert('id', '\d+') - ->before(function (Request $request) use ($app) { - $app['firewall']->requireRight('bas_chupub'); - }); + ->before('controller.prod.feed:ensureUserHasPublishRight'); - $controllers->post('/entry/{id}/update/', function (Application $app, Request $request, $id) { - $datas = ['error' => true, 'message' => '', 'datas' => '']; - $entry = $app['repo.feed-entries']->find($id); - - if (null === $entry) { - $app->abort(404, 'Entry not found'); - } - if (!$entry->isPublisher($app['authentication']->getUser())) { - $app->abort(403, 'Unathorized action'); - } - if ('' === $title = trim($request->request->get('title', ''))) { - $app->abort(400, "Bad request"); - } - - $entry->setAuthorEmail($request->request->get('author_mail')) - ->setAuthorName($request->request->get('author_name')) - ->setTitle($title) - ->setSubtitle($request->request->get('subtitle', '')); - - $currentFeedId = $entry->getFeed()->getId(); - $new_feed_id = $request->request->get('feed_id', $currentFeedId); - if ($currentFeedId !== (int) $new_feed_id) { - - $new_feed = $app['repo.feeds']->find($new_feed_id); - - if ($new_feed === null) { - $app->abort(404, 'Feed not found'); - } - - if (!$new_feed->isPublisher($app['authentication']->getUser())) { - $app->abort(403, 'You are not publisher of this feed'); - } - $entry->setFeed($new_feed); - } - - $items = explode(';', $request->request->get('sorted_lst')); - - foreach ($items as $item_sort) { - $item_sort_datas = explode('_', $item_sort); - if (count($item_sort_datas) != 2) { - continue; - } - $item = $app['repo.feed-items']->find($item_sort_datas[0]); - $item->setOrd($item_sort_datas[1]); - $app['orm.em']->persist($item); - } - - $app['orm.em']->persist($entry); - $app['orm.em']->flush(); - - return $app->json([ - 'error' => false, - 'message' => 'succes', - 'datas' => $app['twig']->render('prod/results/entry.html.twig', [ - 'entry' => $entry - ]) - ]); - }) + $controllers->post('/entry/{id}/update/', 'controller.prod.feed:updateEntryAction') ->bind('prod_feeds_entry_update') - ->assert('id', '\d+')->before(function (Request $request) use ($app) { - $app['firewall']->requireRight('bas_chupub'); - }); + ->assert('id', '\d+') + ->before('controller.prod.feed:ensureUserHasPublishRight'); - $controllers->post('/entry/{id}/delete/', function (Application $app, Request $request, $id) { - $datas = ['error' => true, 'message' => '']; - - $entry = $app['repo.feed-entries']->find($id); - - if (null === $entry) { - $app->abort(404, 'Entry not found'); - } - if (!$entry->isPublisher($app['authentication']->getUser()) && $entry->getFeed()->isOwner($app['authentication']->getUser()) === false) { - $app->abort(403, $app->trans('Action Forbidden : You are not the publisher')); - } - - $app['orm.em']->remove($entry); - $app['orm.em']->flush(); - - return $app->json(['error' => false, 'message' => 'succes']); - }) + $controllers->post('/entry/{id}/delete/', 'controller.prod.feed:deleteEntryAction') ->bind('prod_feeds_entry_delete') - ->assert('id', '\d+')->before(function (Request $request) use ($app) { - $app['firewall']->requireRight('bas_chupub'); - }); + ->assert('id', '\d+') + ->before('controller.prod.feed:ensureUserHasPublishRight'); - $controllers->get('/', function (Application $app, Request $request) { - $request = $app['request']; - $page = (int) $request->query->get('page'); - $page = $page > 0 ? $page : 1; + $controllers->get('/', 'controller.prod.feed:indexAction') + ->bind('prod_feeds'); - $feeds = $app['repo.feeds']->getAllForUser($app['acl']->get($app['authentication']->getUser())); - - $datas = $app['twig']->render('prod/results/feeds.html.twig', [ - 'feeds' => $feeds, - 'feed' => new Aggregate($app['orm.em'], $feeds), - 'page' => $page - ]); - - return new Response($datas); - })->bind('prod_feeds'); - - $controllers->get('/feed/{id}/', function (Application $app, Request $request, $id) { - $page = (int) $request->query->get('page'); - $page = $page > 0 ? $page : 1; - - $feed = $app['repo.feeds']->find($id); - if (!$feed->isAccessible($app['authentication']->getUser(), $app)) { - $app->abort(404, 'Feed not found'); - } - $feeds = $app['repo.feeds']->getAllForUser($app['acl']->get($app['authentication']->getUser())); - - $datas = $app['twig']->render('prod/results/feeds.html.twig', ['feed' => $feed, 'feeds' => $feeds, 'page' => $page]); - - return new Response($datas); - }) + $controllers->get('/feed/{id}/', 'controller.prod.feed:showAction') ->bind('prod_feeds_feed') ->assert('id', '\d+'); - $controllers->get('/subscribe/aggregated/', function (Application $app, Request $request) { - $renew = ($request->query->get('renew') === 'true'); + $controllers->get('/subscribe/aggregated/', 'controller.prod.feed:subscribeAggregatedFeedAction') + ->bind('prod_feeds_subscribe_aggregated'); - $feeds = $app['repo.feeds']->getAllForUser($app['acl']->get($app['authentication']->getUser())); - - $link = $app['feed.aggregate-link-generator']->generate(new Aggregate($app['orm.em'], $feeds), - $app['authentication']->getUser(), - AggregateLinkGenerator::FORMAT_RSS, - null, $renew - ); - - $output = [ - 'texte' => '

' . $app->trans('publication::Voici votre fil RSS personnel. Il vous permettra d\'etre tenu au courrant des publications.') - . '

' . $app->trans('publications::Ne le partagez pas, il est strictement confidentiel') . '

-
', - 'titre' => $app->trans('publications::votre rss personnel') - ]; - - return $app->json($output); - })->bind('prod_feeds_subscribe_aggregated'); - - $controllers->get('/subscribe/{id}/', function (Application $app, Request $request, $id) { - $renew = ($request->query->get('renew') === 'true'); - - $feed = $app['repo.feeds']->find($id); - if (!$feed->isAccessible($app['authentication']->getUser(), $app)) { - $app->abort(404, 'Feed not found'); - } - $link = $app['feed.user-link-generator']->generate($feed, $app['authentication']->getUser(), FeedLinkGenerator::FORMAT_RSS, null, $renew); - - $output = [ - 'texte' => '

' . $app->trans('publication::Voici votre fil RSS personnel. Il vous permettra d\'etre tenu au courrant des publications.') - . '

' . $app->trans('publications::Ne le partagez pas, il est strictement confidentiel') . '

-
', - 'titre' => $app->trans('publications::votre rss personnel') - ]; - - return $app->json($output); - }) + $controllers->get('/subscribe/{id}/', 'controller.prod.feed:subscribeFeedAction') ->bind('prod_feeds_subscribe_feed') ->assert('id', '\d+'); return $controllers; } + + public function publishRecordsAction(Application $app, Request $request) + { + $feeds = $app['repo.feeds']->getAllForUser( + $app['acl']->get($app['authentication']->getUser()) + ); + $publishing = RecordsRequest::fromRequest($app, $request, true, [], ['bas_chupub']); + + return $app['twig']->render( + 'prod/actions/publish/publish.html.twig', + ['publishing' => $publishing, 'feeds' => $feeds] + ); + } + + public function createFeedEntryAction(Application $app, Request $request) { + $feed = $app['repo.feeds']->find($request->request->get('feed_id')); + + if (null === $feed) { + $app->abort(404, "Feed not found"); + } + + $publisher = $app['repo.feed-publishers']->findOneBy( + ['feed' => $feed, 'user' => $app['authentication']->getUser()] + ); + + if ('' === $title = trim($request->request->get('title', ''))) { + $app->abort(400, "Bad request"); + } + + if (!$feed->isPublisher($app['authentication']->getUser())) { + $app->abort(403, 'Unathorized action'); + } + + $entry = new FeedEntry(); + $entry->setAuthorEmail($request->request->get('author_mail')) + ->setAuthorName($request->request->get('author_name')) + ->setTitle($title) + ->setFeed($feed) + ->setPublisher($publisher) + ->setSubtitle($request->request->get('subtitle', '')); + + $feed->addEntry($entry); + + $publishing = RecordsRequest::fromRequest($app, $request, true, [], ['bas_chupub']); + foreach ($publishing as $record) { + $item = new FeedItem(); + $item->setEntry($entry) + ->setRecordId($record->get_record_id()) + ->setSbasId($record->get_sbas_id()); + $entry->addItem($item); + $app['orm.em']->persist($item); + } + + $app['orm.em']->persist($entry); + $app['orm.em']->persist($feed); + $app['orm.em']->flush(); + + $app['dispatcher']->dispatch( + PhraseaEvents::FEED_ENTRY_CREATE, + new FeedEntryEvent($entry, $request->request->get('notify')) + ); + + $datas = ['error' => false, 'message' => false]; + + return $app->json($datas); + } + + public function editEntryAction(Application $app, Request $request, $id) { + $entry = $app['repo.feed-entries']->find($id); + + if (!$entry->isPublisher($app['authentication']->getUser())) { + throw new AccessDeniedHttpException(); + } + + $feeds = $app['repo.feeds']->getAllForUser($app['acl']->get($app['authentication']->getUser())); + + $datas = $app['twig']->render( + 'prod/actions/publish/publish_edit.html.twig', + ['entry' => $entry, 'feeds' => $feeds] + ); + + return new Response($datas); + } + + /** + * @param Application $app + * @param Request $request + * @param int $id + * @return \Symfony\Component\HttpFoundation\JsonResponse + */ + public function updateEntryAction(Application $app, Request $request, $id) { + $datas = ['error' => true, 'message' => '', 'datas' => '']; + $entry = $app['repo.feed-entries']->find($id); + + if (null === $entry) { + $app->abort(404, 'Entry not found'); + } + if (!$entry->isPublisher($app['authentication']->getUser())) { + $app->abort(403, 'Unathorized action'); + } + if ('' === $title = trim($request->request->get('title', ''))) { + $app->abort(400, "Bad request"); + } + + $entry->setAuthorEmail($request->request->get('author_mail')) + ->setAuthorName($request->request->get('author_name')) + ->setTitle($title) + ->setSubtitle($request->request->get('subtitle', '')); + + $currentFeedId = $entry->getFeed() + ->getId(); + $new_feed_id = $request->request->get('feed_id', $currentFeedId); + if ($currentFeedId !== (int)$new_feed_id) { + + $new_feed = $app['repo.feeds']->find($new_feed_id); + + if ($new_feed === null) { + $app->abort(404, 'Feed not found'); + } + + if (!$new_feed->isPublisher($app['authentication']->getUser())) { + $app->abort(403, 'You are not publisher of this feed'); + } + $entry->setFeed($new_feed); + } + + $items = explode(';', $request->request->get('sorted_lst')); + + foreach ($items as $item_sort) { + $item_sort_datas = explode('_', $item_sort); + if (count($item_sort_datas) != 2) { + continue; + } + $item = $app['repo.feed-items']->find($item_sort_datas[0]); + $item->setOrd($item_sort_datas[1]); + $app['orm.em']->persist($item); + } + + $app['orm.em']->persist($entry); + $app['orm.em']->flush(); + + return $app->json( + [ + 'error' => false, + 'message' => 'succes', + 'datas' => $app['twig']->render( + 'prod/results/entry.html.twig', + [ + 'entry' => $entry + ] + ) + ] + ); + } + + public function deleteEntryAction(Application $app, Request $request, $id) { + $datas = ['error' => true, 'message' => '']; + + $entry = $app['repo.feed-entries']->find($id); + + if (null === $entry) { + $app->abort(404, 'Entry not found'); + } + if (!$entry->isPublisher($app['authentication']->getUser()) && $entry->getFeed() + ->isOwner($app['authentication']->getUser()) === false + ) { + $app->abort(403, $app->trans('Action Forbidden : You are not the publisher')); + } + + $app['orm.em']->remove($entry); + $app['orm.em']->flush(); + + return $app->json(['error' => false, 'message' => 'succes']); + } + + public function indexAction(Application $app, Request $request) { + $request = $app['request']; + $page = (int)$request->query->get('page'); + $page = $page > 0 ? $page : 1; + + $feeds = $app['repo.feeds']->getAllForUser($app['acl']->get($app['authentication']->getUser())); + + $datas = $app['twig']->render( + 'prod/results/feeds.html.twig', + [ + 'feeds' => $feeds, + 'feed' => new Aggregate($app['orm.em'], $feeds), + 'page' => $page + ] + ); + + return new Response($datas); + } + + public function showAction(Application $app, Request $request, $id) { + $page = (int)$request->query->get('page'); + $page = $page > 0 ? $page : 1; + + $feed = $app['repo.feeds']->find($id); + if (!$feed->isAccessible($app['authentication']->getUser(), $app)) { + $app->abort(404, 'Feed not found'); + } + $feeds = $app['repo.feeds']->getAllForUser($app['acl']->get($app['authentication']->getUser())); + + $datas = $app['twig']->render( + 'prod/results/feeds.html.twig', + ['feed' => $feed, 'feeds' => $feeds, 'page' => $page] + ); + + return new Response($datas); + } + + public function subscribeAggregatedFeedAction(Application $app, Request $request) { + $renew = ($request->query->get('renew') === 'true'); + + $feeds = $app['repo.feeds']->getAllForUser($app['acl']->get($app['authentication']->getUser())); + + $link = $app['feed.aggregate-link-generator']->generate( + new Aggregate($app['orm.em'], $feeds), + $app['authentication']->getUser(), + AggregateLinkGenerator::FORMAT_RSS, + null, + $renew + ); + + $output = [ + 'texte' => '

' . $app->trans( + 'publication::Voici votre fil RSS personnel. Il vous permettra d\'etre tenu au courrant des publications.' + ) . '

' . $app->trans('publications::Ne le partagez pas, il est strictement confidentiel') . '

+
', + 'titre' => $app->trans('publications::votre rss personnel') + ]; + + return $app->json($output); + } + + public function subscribeFeedAction(Application $app, Request $request, $id) { + $renew = ($request->query->get('renew') === 'true'); + + $feed = $app['repo.feeds']->find($id); + if (!$feed->isAccessible($app['authentication']->getUser(), $app)) { + $app->abort(404, 'Feed not found'); + } + $link = $app['feed.user-link-generator']->generate( + $feed, + $app['authentication']->getUser(), + FeedLinkGenerator::FORMAT_RSS, + null, + $renew + ); + + $output = [ + 'texte' => '

' . $app->trans( + 'publication::Voici votre fil RSS personnel. Il vous permettra d\'etre tenu au courrant des publications.' + ) . '

' . $app->trans('publications::Ne le partagez pas, il est strictement confidentiel') . '

+
', + 'titre' => $app->trans('publications::votre rss personnel') + ]; + + return $app->json($output); + } + + public function ensureUserHasPublishRight(Application $app) + { + $this->getFirewall($app)->requireRight('bas_chupub'); + } }