From 653b9f82ab2c397543c9f7da23ad79444ef41e45 Mon Sep 17 00:00:00 2001 From: Bernhard Posselt Date: Mon, 10 Jun 2013 19:02:36 +0200 Subject: implement starring and marking as read for multiple items --- appinfo/api.php | 102 ++++++++++++------- external/itemapi.php | 57 +++++++++-- tests/unit/external/ItemAPITest.php | 198 ++++++++++++++++++++++++++++++++++-- 3 files changed, 300 insertions(+), 57 deletions(-) diff --git a/appinfo/api.php b/appinfo/api.php index e54493e5f..5d5a1fee2 100644 --- a/appinfo/api.php +++ b/appinfo/api.php @@ -35,8 +35,8 @@ use \OCA\AppFramework\External\External; \OCP\API::register('get', '/apps/news/version', function($params) { return External::main('NewsAPI', 'version', $params, new DIContainer()); - }, - 'news', + }, + 'news', \OC_API::USER_AUTH ); @@ -46,40 +46,40 @@ use \OCA\AppFramework\External\External; \OCP\API::register('get', '/apps/news/folders', function($params) { return External::main('FolderAPI', 'getAll', $params, new DIContainer()); - }, - 'news', + }, + 'news', \OC_API::USER_AUTH ); \OCP\API::register('post', '/apps/news/folders', function($params) { return External::main('FolderAPI', 'create', $params, new DIContainer()); - }, - 'news', + }, + 'news', \OC_API::USER_AUTH ); \OCP\API::register('delete', '/apps/news/folders/{folderId}', function($params) { return External::main('FolderAPI', 'delete', $params, new DIContainer()); - }, - 'news', + }, + 'news', \OC_API::USER_AUTH ); \OCP\API::register('put', '/apps/news/folders/{folderId}', function($params) { return External::main('FolderAPI', 'update', $params, new DIContainer()); - }, - 'news', + }, + 'news', \OC_API::USER_AUTH ); \OCP\API::register('put', '/apps/news/folders/{folderId}/read', function($params) { return External::main('FolderAPI', 'read', $params, new DIContainer()); - }, - 'news', + }, + 'news', \OC_API::USER_AUTH ); @@ -89,40 +89,40 @@ use \OCA\AppFramework\External\External; \OCP\API::register('get', '/apps/news/feeds', function($params) { return External::main('FeedAPI', 'getAll', $params, new DIContainer()); - }, - 'news', + }, + 'news', \OC_API::USER_AUTH ); \OCP\API::register('post', '/apps/news/feeds/{feedId}', function($params) { return External::main('FeedAPI', 'create', $params, new DIContainer()); - }, - 'news', + }, + 'news', \OC_API::USER_AUTH ); \OCP\API::register('delete', '/apps/news/feeds/{feedId}', function($params) { return External::main('FeedAPI', 'delete', $params, new DIContainer()); - }, - 'news', + }, + 'news', \OC_API::USER_AUTH ); \OCP\API::register('put', '/apps/news/feeds/{feedId}/move', function($params) { return External::main('FeedAPI', 'move', $params, new DIContainer()); - }, - 'news', + }, + 'news', \OC_API::USER_AUTH ); \OCP\API::register('put', '/apps/news/feeds/{feedId}/read', function($params) { return External::main('FeedAPI', 'read', $params, new DIContainer()); - }, - 'news', + }, + 'news', \OC_API::USER_AUTH ); @@ -132,63 +132,87 @@ use \OCA\AppFramework\External\External; \OCP\API::register('get', '/apps/news/items', function($params) { return External::main('ItemAPI', 'getAll', $params, new DIContainer()); - }, - 'news', + }, + 'news', \OC_API::USER_AUTH ); \OCP\API::register('get', '/apps/news/items/updated', function($params) { return External::main('ItemAPI', 'getUpdated', $params, new DIContainer()); - }, - 'news', + }, + 'news', \OC_API::USER_AUTH ); \OCP\API::register('put', '/apps/news/items/{itemId}/read', function($params) { return External::main('ItemAPI', 'read', $params, new DIContainer()); - }, - 'news', + }, + 'news', \OC_API::USER_AUTH ); \OCP\API::register('put', '/apps/news/items/{itemId}/unread', function($params) { return External::main('ItemAPI', 'unread', $params, new DIContainer()); - }, - 'news', + }, + 'news', \OC_API::USER_AUTH ); \OCP\API::register('put', '/apps/news/items/{feedId}/{guidHash}/star', function($params) { return External::main('ItemAPI', 'star', $params, new DIContainer()); - }, - 'news', + }, + 'news', \OC_API::USER_AUTH ); \OCP\API::register('put', '/apps/news/items/{feedId}/{guidHash}/unstar', function($params) { return External::main('ItemAPI', 'unstar', $params, new DIContainer()); - }, - 'news', + }, + 'news', \OC_API::USER_AUTH ); \OCP\API::register('put', '/apps/news/items/read', function($params) { return External::main('ItemAPI', 'readAll', $params, new DIContainer()); - }, - 'news', + }, + 'news', \OC_API::USER_AUTH ); \OCP\API::register('put', '/apps/news/items/read/multiple', function($params) { return External::main('ItemAPI', 'readMultiple', $params, new DIContainer()); - }, - 'news', + }, + 'news', \OC_API::USER_AUTH -); \ No newline at end of file +); + +\OCP\API::register('put', '/apps/news/items/unread/multiple', + function($params) { + return External::main('ItemAPI', 'unreadMultiple', $params, new DIContainer()); + }, + 'news', + \OC_API::USER_AUTH +); + +\OCP\API::register('put', '/apps/news/items/star/multiple', + function($params) { + return External::main('ItemAPI', 'starMultiple', $params, new DIContainer()); + }, + 'news', + \OC_API::USER_AUTH +); + +\OCP\API::register('put', '/apps/news/items/unstar/multiple', + function($params) { + return External::main('ItemAPI', 'unstarMultiple', $params, new DIContainer()); + }, + 'news', + \OC_API::USER_AUTH +); diff --git a/external/itemapi.php b/external/itemapi.php index a67d5a171..6b4aeb80c 100644 --- a/external/itemapi.php +++ b/external/itemapi.php @@ -107,7 +107,7 @@ class ItemAPI extends Controller { $this->itemBusinessLayer->read($itemId, $isRead, $userId); return new NewsAPIResult(); } catch(BusinessLayerException $ex){ - return new NewsAPIResult(null, NewsAPIResult::NOT_FOUND_ERROR, + return new NewsAPIResult(null, NewsAPIResult::NOT_FOUND_ERROR, $ex->getMessage()); } } @@ -121,7 +121,7 @@ class ItemAPI extends Controller { $this->itemBusinessLayer->star($feedId, $guidHash, $isStarred, $userId); return new NewsAPIResult(); } catch(BusinessLayerException $ex){ - return new NewsAPIResult(null, NewsAPIResult::NOT_FOUND_ERROR, + return new NewsAPIResult(null, NewsAPIResult::NOT_FOUND_ERROR, $ex->getMessage()); } } @@ -156,13 +156,56 @@ class ItemAPI extends Controller { } + private function setMultipleRead($isRead) { + $userId = $this->api->getUserId(); + $items = $this->params('items'); + + foreach($items as $id) { + try { + $this->itemBusinessLayer->read($id, $isRead, $userId); + } catch(BusinessLayerException $ex) { + continue; + } + } + + return new NewsAPIResult(); + } + + public function readMultiple() { + return $this->setMultipleRead(true); + } + + + public function unreadMultiple() { + return $this->setMultipleRead(false); + } + + + private function setMultipleStarred($isStarred) { $userId = $this->api->getUserId(); - //$ids = $this->params('_put'); - //print_r(json_decode(file_get_contents('php://input'), true)); - - exit(); - //return new NewsAPIResult(); + $items = $this->params('items'); + + foreach($items as $item) { + try { + $this->itemBusinessLayer->star($item['feedId'], + $item['guidHash'], $isStarred, $userId); + } catch(BusinessLayerException $ex) { + continue; + } + } + + return new NewsAPIResult(); + } + + + public function starMultiple() { + return $this->setMultipleStarred(true); + } + + + public function unstarMultiple() { + return $this->setMultipleStarred(false); } } diff --git a/tests/unit/external/ItemAPITest.php b/tests/unit/external/ItemAPITest.php index 94c91eea0..56e518da8 100644 --- a/tests/unit/external/ItemAPITest.php +++ b/tests/unit/external/ItemAPITest.php @@ -147,7 +147,7 @@ class ItemAPITest extends \PHPUnit_Framework_TestCase { $this->api, $request, $this->itemBusinessLayer - ); + ); $this->itemBusinessLayer->expects($this->once()) ->method('read') @@ -173,7 +173,7 @@ class ItemAPITest extends \PHPUnit_Framework_TestCase { $this->api, $request, $this->itemBusinessLayer - ); + ); $this->itemBusinessLayer->expects($this->once()) ->method('read') @@ -195,7 +195,7 @@ class ItemAPITest extends \PHPUnit_Framework_TestCase { $this->api, $request, $this->itemBusinessLayer - ); + ); $this->itemBusinessLayer->expects($this->once()) ->method('read') @@ -221,7 +221,7 @@ class ItemAPITest extends \PHPUnit_Framework_TestCase { $this->api, $request, $this->itemBusinessLayer - ); + ); $this->itemBusinessLayer->expects($this->once()) ->method('read') @@ -244,7 +244,7 @@ class ItemAPITest extends \PHPUnit_Framework_TestCase { $this->api, $request, $this->itemBusinessLayer - ); + ); $this->itemBusinessLayer->expects($this->once()) ->method('star') @@ -272,7 +272,7 @@ class ItemAPITest extends \PHPUnit_Framework_TestCase { $this->api, $request, $this->itemBusinessLayer - ); + ); $this->itemBusinessLayer->expects($this->once()) ->method('star') @@ -295,7 +295,7 @@ class ItemAPITest extends \PHPUnit_Framework_TestCase { $this->api, $request, $this->itemBusinessLayer - ); + ); $this->itemBusinessLayer->expects($this->once()) ->method('star') @@ -323,7 +323,7 @@ class ItemAPITest extends \PHPUnit_Framework_TestCase { $this->api, $request, $this->itemBusinessLayer - ); + ); $this->itemBusinessLayer->expects($this->once()) ->method('star') @@ -347,9 +347,9 @@ class ItemAPITest extends \PHPUnit_Framework_TestCase { $this->api, $request, $this->itemBusinessLayer - ); + ); + - $this->itemBusinessLayer->expects($this->once()) ->method('readAll') ->with( @@ -364,4 +364,180 @@ class ItemAPITest extends \PHPUnit_Framework_TestCase { } -} \ No newline at end of file + + public function testReadMultiple() { + $request = new Request(array('params' => array( + 'items' => array(2, 4) + ))); + $this->itemAPI = new ItemAPI( + $this->api, + $request, + $this->itemBusinessLayer + ); + + $this->itemBusinessLayer->expects($this->at(0)) + ->method('read') + ->with($this->equalTo(2), + $this->equalTo(true), + $this->equalTo($this->user)); + $this->itemBusinessLayer->expects($this->at(1)) + ->method('read') + ->with($this->equalTo(4), + $this->equalTo(true), + $this->equalTo($this->user)); + $response = $this->itemAPI->readMultiple(); + $this->assertEquals(NewsAPIResult::OK, $response->getStatusCode()); + } + + + public function testReadMultipleDoesntCareAboutException() { + $request = new Request(array('params' => array( + 'items' => array(2, 4) + ))); + $this->itemAPI = new ItemAPI( + $this->api, + $request, + $this->itemBusinessLayer + ); + + $this->itemBusinessLayer->expects($this->at(0)) + ->method('read') + ->will($this->throwException(new BusinessLayerException(''))); + $this->itemBusinessLayer->expects($this->at(1)) + ->method('read') + ->with($this->equalTo(4), + $this->equalTo(true), + $this->equalTo($this->user)); + $this->itemAPI->readMultiple(); + } + + + public function testUnreadMultiple() { + $request = new Request(array('params' => array( + 'items' => array(2, 4) + ))); + $this->itemAPI = new ItemAPI( + $this->api, + $request, + $this->itemBusinessLayer + ); + + $this->itemBusinessLayer->expects($this->at(0)) + ->method('read') + ->with($this->equalTo(2), + $this->equalTo(false), + $this->equalTo($this->user)); + $this->itemBusinessLayer->expects($this->at(1)) + ->method('read') + ->with($this->equalTo(4), + $this->equalTo(false), + $this->equalTo($this->user)); + $response = $this->itemAPI->unreadMultiple(); + $this->assertEquals(NewsAPIResult::OK, $response->getStatusCode()); + } + + + public function testStarMultiple() { + $request = new Request(array('params' => array( + 'items' => array( + array( + 'feedId' => 2, + 'guidHash' => 'a' + ), + array( + 'feedId' => 4, + 'guidHash' => 'b' + ) + ) + ))); + $this->itemAPI = new ItemAPI( + $this->api, + $request, + $this->itemBusinessLayer + ); + + $this->itemBusinessLayer->expects($this->at(0)) + ->method('star') + ->with($this->equalTo(2), + $this->equalTo('a'), + $this->equalTo(true), + $this->equalTo($this->user)); + $this->itemBusinessLayer->expects($this->at(1)) + ->method('star') + ->with($this->equalTo(4), + $this->equalTo('b'), + $this->equalTo(true), + $this->equalTo($this->user)); + $response = $this->itemAPI->starMultiple(); + $this->assertEquals(NewsAPIResult::OK, $response->getStatusCode()); + } + + + public function testStarMultipleDoesntCareAboutException() { + $request = new Request(array('params' => array( + 'items' => array( + array( + 'feedId' => 2, + 'guidHash' => 'a' + ), + array( + 'feedId' => 4, + 'guidHash' => 'b' + ) + ) + ))); + $this->itemAPI = new ItemAPI( + $this->api, + $request, + $this->itemBusinessLayer + ); + + $this->itemBusinessLayer->expects($this->at(0)) + ->method('star') + ->will($this->throwException(new BusinessLayerException(''))); + $this->itemBusinessLayer->expects($this->at(1)) + ->method('star') + ->with($this->equalTo(4), + $this->equalTo('b'), + $this->equalTo(true), + $this->equalTo($this->user)); + $this->itemAPI->starMultiple(); + } + + + public function testUnstarMultiple() { + $request = new Request(array('params' => array( + 'items' => array( + array( + 'feedId' => 2, + 'guidHash' => 'a' + ), + array( + 'feedId' => 4, + 'guidHash' => 'b' + ) + ) + ))); + $this->itemAPI = new ItemAPI( + $this->api, + $request, + $this->itemBusinessLayer + ); + + $this->itemBusinessLayer->expects($this->at(0)) + ->method('star') + ->with($this->equalTo(2), + $this->equalTo('a'), + $this->equalTo(false), + $this->equalTo($this->user)); + $this->itemBusinessLayer->expects($this->at(1)) + ->method('star') + ->with($this->equalTo(4), + $this->equalTo('b'), + $this->equalTo(false), + $this->equalTo($this->user)); + $response = $this->itemAPI->unstarMultiple(); + $this->assertEquals(NewsAPIResult::OK, $response->getStatusCode()); + } + +} -- cgit v1.2.3