This commit is contained in:
Bernhard Posselt 2013-03-20 23:33:51 +01:00
Родитель ef2af010a6
Коммит 964383cc7a
6 изменённых файлов: 129 добавлений и 346 удалений

Просмотреть файл

@ -12,7 +12,6 @@
namespace OCA\News; namespace OCA\News;
require_once \OC_App::getAppPath('news') . '/appinfo/bootstrap.php';
\OCP\App::addNavigationEntry( array( \OCP\App::addNavigationEntry( array(
@ -22,10 +21,10 @@ require_once \OC_App::getAppPath('news') . '/appinfo/bootstrap.php';
'icon' => \OC_Helper::imagePath( 'news', 'news.svg' ), 'icon' => \OC_Helper::imagePath( 'news', 'news.svg' ),
'name' => \OC_L10N::get('news')->t('News') 'name' => \OC_L10N::get('news')->t('News')
)); ));
/*
\OC_Search::registerProvider('OC_Search_Provider_News'); \OC_Search::registerProvider('OC_Search_Provider_News');
\OCP\Backgroundjob::addRegularTask( 'OCA\News\Backgroundjob', 'run' ); \OCP\Backgroundjob::addRegularTask( 'OCA\News\Backgroundjob', 'run' );
\OCP\Share::registerBackend('news_item', 'OCA\News\Share_Backend_News_Item'); \OCP\Share::registerBackend('news_item', 'OCA\News\Share_Backend_News_Item');
*/

Просмотреть файл

@ -1,139 +0,0 @@
<?php
/**
* ownCloud - News app
*
* @author Alessandro Cosentino
* @author Bernhard Posselt
* @copyright 2012 Alessandro Cosentino cosenal@gmail.com
* @copyright 2012 Bernhard Posselt nukeawhale@gmail.com
*
* This file is licensed under the Affero General Public License version 3 or later.
* See the COPYING-README file
*
*/
namespace OCA\News;
\OC::$CLASSPATH['Pimple'] = 'apps/news/3rdparty/Pimple/Pimple.php';
\OC::$CLASSPATH['OC_Search_Provider_News'] = 'apps/news/lib/search.php';
\OC::$CLASSPATH['OCA\News\Backgroundjob'] = 'apps/news/lib/backgroundjob.php';
\OC::$CLASSPATH['OCA\News\Share_Backend_News_Item'] = 'apps/news/lib/share/item.php';
\OC::$CLASSPATH['OCA\News\Utils'] = 'apps/news/lib/utils.php';
\OC::$CLASSPATH['OCA\News\Security'] = 'apps/news/lib/security.php';
\OC::$CLASSPATH['OCA\News\API'] = 'apps/news/lib/api.php';
\OC::$CLASSPATH['OCA\News\Request'] = 'apps/news/lib/request.php';
\OC::$CLASSPATH['OCA\News\TemplateResponse'] = 'apps/news/lib/response.php';
\OC::$CLASSPATH['OCA\News\JSONResponse'] = 'apps/news/lib/response.php';
\OC::$CLASSPATH['OCA\News\TextDownloadResponse'] = 'apps/news/lib/response.php';
\OC::$CLASSPATH['OCA\News\Controller'] = 'apps/news/lib/controller.php';
\OC::$CLASSPATH['OCA\News\OPMLParser'] = 'apps/news/opmlparser.php';
\OC::$CLASSPATH['OCA\News\OPMLExporter'] = 'apps/news/opmlexporter.php';
\OC::$CLASSPATH['OCA\News\OPMLImporter'] = 'apps/news/opmlimporter.php';
\OC::$CLASSPATH['OCA\News\Enclosure'] = 'apps/news/db/enclosure.php';
\OC::$CLASSPATH['OCA\News\FeedMapper'] = 'apps/news/db/feedmapper.php';
\OC::$CLASSPATH['OCA\News\ItemMapper'] = 'apps/news/db/itemmapper.php';
\OC::$CLASSPATH['OCA\News\FolderMapper'] = 'apps/news/db/foldermapper.php';
\OC::$CLASSPATH['OCA\News\Folder'] = 'apps/news/db/folder.php';
\OC::$CLASSPATH['OCA\News\Feed'] = 'apps/news/db/feed.php';
\OC::$CLASSPATH['OCA\News\Item'] = 'apps/news/db/item.php';
\OC::$CLASSPATH['OCA\News\Collection'] = 'apps/news/db/collection.php';
\OC::$CLASSPATH['OCA\News\FeedType'] = 'apps/news/db/feedtype.php';
\OC::$CLASSPATH['OCA\News\StatusFlag'] = 'apps/news/db/statusflag.php';
\OC::$CLASSPATH['OCA\News\NewsController'] = 'apps/news/controller/news.controller.php';
\OC::$CLASSPATH['OCA\News\NewsAjaxController'] = 'apps/news/controller/news.ajax.controller.php';
\OC::$CLASSPATH['OCA\News\FolderBl'] = 'apps/news/folder.bl.php';
\OC::$CLASSPATH['OCA\News\FeedBl'] = 'apps/news/feed.bl.php';
\OC::$CLASSPATH['OCA\News\FolderApi'] = 'apps/news/external_api/folder.php';
\OC::$CLASSPATH['OCA\News\FeedApi'] = 'apps/news/external_api/feed.php';
/**
* @return a new DI container with prefilled values for the news app
*/
function createDIContainer(){
$newsContainer = new \Pimple();
/**
* CONSTANTS
*/
$newsContainer['AppName'] = 'news';
/**
* CLASSES
*/
$newsContainer['API'] = $newsContainer->share(function($c){
return new API($c['AppName']);
});
$newsContainer['Request'] = $newsContainer->share(function($c){
return new Request($_GET, $_POST, $_FILES);
});
$newsContainer['Security'] = $newsContainer->share(function($c) {
return new Security($c['AppName']);
});
/**
* MAPPERS
*/
$newsContainer['ItemMapper'] = $newsContainer->share(function($c){
return new ItemMapper($c['API']->getUserId());
});
$newsContainer['FeedMapper'] = $newsContainer->share(function($c){
return new FeedMapper($c['API']->getUserId());
});
$newsContainer['FolderMapper'] = $newsContainer->share(function($c){
return new FolderMapper($c['API']->getUserId());
});
/**
* CONTROLLERS
*/
$newsContainer['NewsController'] = function($c){
return new NewsController($c['Request'], $c['API'], $c['FeedMapper'],
$c['FolderMapper']);
};
$newsContainer['NewsAjaxController'] = function($c){
return new NewsAjaxController($c['Request'], $c['API'], $c['FeedMapper'],
$c['FolderMapper'], $c['ItemMapper']);
};
/**
* BUSINESS LAYER OBJECTS
*/
$newsContainer['FolderBl'] = $newsContainer->share(function($c){
return new FolderBl($c['FolderMapper']);
});
$newsContainer['FeedBl'] = $newsContainer->share(function($c){
return new FeedBl($c['FeedMapper']);
});
/**
* EXTERNAL API LAYER
*/
$newsContainer['FolderApi'] = $newsContainer->share(function($c){
return new FolderApi($c['FolderBl']);
});
$newsContainer['FeedApi'] = $newsContainer->share(function($c){
return new FeedApi($c['FeedBl']);
});
return $newsContainer;
}

Просмотреть файл

@ -1,205 +1,52 @@
<?php <?php
/** /**
* ownCloud - News app * ownCloud - News
* *
* @author Alessandro Cosentino
* @author Bernhard Posselt * @author Bernhard Posselt
* Copyright (c) 2012 - Bernhard Posselt <nukeawhale@gmail.com> * @copyright 2012 Alessandro Cosentino cosenal@gmail.com
* @copyright 2012 Bernhard Posselt nukeawhale@gmail.com
* *
* This file is licensed under the Affero General Public License version 3 or later. * This library is free software; you can redistribute it and/or
* See the COPYING-README file * modify it under the terms of the GNU AFFERO GENERAL PUBLIC LICENSE
* License as published by the Free Software Foundation; either
* version 3 of the License, or any later version.
*
* This library is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU AFFERO GENERAL PUBLIC LICENSE for more details.
*
* You should have received a copy of the GNU Affero General Public
* License along with this library. If not, see <http://www.gnu.org/licenses/>.
* *
*/ */
namespace OCA\News; namespace OCA\News;
require_once \OC_App::getAppPath('news') . '/appinfo/bootstrap.php'; use \OCA\AppFramework\App;
/** use \OCA\News\DependencyInjection\DIContainer;
* Shortcut for calling a controller method and printing the result
* @param string $controllerName: the name of the controller under which it is
* stored in the DI container
* @param string $methodName: the method that you want to call
* @param array $urlParams: an array with variables extracted from the routes
* @param bool $disableAdminCheck: disables the check for adminuser rights
* @param bool $isAjax: if the request is an ajax request
*/
function callController($controllerName, $methodName, $urlParams, $disableAdminCheck=true,
$isAjax=false){
$container = createDIContainer();
// run security checks
$security = $container['Security'];
runSecurityChecks($security, $isAjax, $disableAdminCheck);
// call the controller and render the page
$controller = $container[$controllerName];
$response = $controller->$methodName($urlParams);
echo $response->render();
}
/** /**
* Shortcut for calling an ajax controller method and printing the result * Webinterface
* @param string $controllerName: the name of the controller under which it is
* stored in the DI container
* @param string $methodName: the method that you want to call
* @param array $urlParams: an array with variables extracted from the routes
* @param bool $disableAdminCheck: disables the check for adminuser rights
*/
function callAjaxController($controllerName, $methodName, $urlParams, $disableAdminCheck=true){
callController($controllerName, $methodName, $urlParams, $disableAdminCheck, true);
}
/**
* Runs the security checks and exits on error
* @param Security $security: the security object
* @param bool $isAjax: if true, the ajax checks will be run, otherwise the normal
* checks
* @param bool $disableAdminCheck: disables the check for adminuser rights
*/
function runSecurityChecks($security, $isAjax=false, $disableAdminCheck=true){
if($disableAdminCheck){
$security->setIsAdminCheck(false);
}
if($isAjax){
$security->runAJAXChecks();
} else {
$security->runChecks();
}
}
/*************************
* Define your routes here
*/ */
$this->create('news_index', '/')->get()->action(
/**
* Normal Routes
*/
$this->create('news_index', '/')->action(
function($params){ function($params){
callController('NewsController', 'index', $params, true); //App::main('FolderController', 'getAll', $params, new DIContainer());
}
);
$this->create('news_index_feed', '/feed/{feedid}')->action(
function($params){
callController('NewsController', 'index', $params, true);
}
);
$this->create('news_export_opml', '/export/opml')->action(
function($params){
callController('NewsController', 'exportOPML', $params, true);
} }
); );
/** $this->create('news_folders', '/folders')->get()->action(
* AJAX Routes
*/
$this->create('news_ajax_init', '/ajax/init')->action(
function($params){ function($params){
callAjaxController('NewsAjaxController', 'init', $params); App::main('FolderController', 'getAll', $params, new DIContainer());
} }
); );
$this->create('news_ajax_setshowall', '/ajax/setshowall')->action(
function($params){
callAjaxController('NewsAjaxController', 'setShowAll', $params);
}
);
/**
* Folders
*/
$this->create('news_ajax_collapsefolder', '/ajax/collapsefolder')->action(
function($params){
callAjaxController('NewsAjaxController', 'collapseFolder', $params);
}
);
$this->create('news_ajax_changefoldername', '/ajax/changefoldername')->action(
function($params){
callAjaxController('NewsAjaxController', 'changeFolderName', $params);
}
);
$this->create('news_ajax_createfolder', '/ajax/createfolder')->action(
function($params){
callAjaxController('NewsAjaxController', 'createFolder', $params);
}
);
$this->create('news_ajax_deletefolder', '/ajax/deletefolder')->action(
function($params){
callAjaxController('NewsAjaxController', 'deleteFolder', $params);
}
);
/**
* Feeds
*/
$this->create('news_ajax_loadfeed', '/ajax/loadfeed')->action(
function($params){
callAjaxController('NewsAjaxController', 'loadFeed', $params);
}
);
$this->create('news_ajax_deletefeed', '/ajax/deletefeed')->action(
function($params){
callAjaxController('NewsAjaxController', 'deleteFeed', $params);
}
);
$this->create('news_ajax_movefeedtofolder', '/ajax/movefeedtofolder')->action(
function($params){
callAjaxController('NewsAjaxController', 'moveFeedToFolder', $params);
}
);
$this->create('news_ajax_updatefeed', '/ajax/updatefeed')->action(
function($params){
callAjaxController('NewsAjaxController', 'updateFeed', $params);
}
);
$this->create('news_ajax_createfeed', '/ajax/createfeed')->action(
function($params){
callAjaxController('NewsAjaxController', 'createFeed', $params);
}
);
/**
* Items
*/
$this->create('news_ajax_setitemstatus', '/ajax/setitemstatus')->action(
function($params){
callAjaxController('NewsAjaxController', 'setItemStatus', $params);
}
);
$this->create('news_ajax_setallitemsread', '/ajax/setallitemsread')->action(
function($params){
callAjaxController('NewsAjaxController', 'setAllItemsRead', $params);
}
);
/**
* Import stuff
*/
$this->create('news_ajax_importOPML', '/import')->action(
function($params){
callAjaxController('NewsAjaxController', 'uploadOPML', $params);
}
);
/** /**

Просмотреть файл

@ -28,16 +28,17 @@ namespace OCA\News\Controller;
use \OCA\AppFramework\Controller\Controller; use \OCA\AppFramework\Controller\Controller;
use \OCA\AppFramework\Core\API; use \OCA\AppFramework\Core\API;
use \OCA\AppFramework\Http\Request; use \OCA\AppFramework\Http\Request;
use \OCA\AppFramework\Db\DoesNotExistException;
use \OCA\AppFramework\Db\MultipleObjectsReturnedException; use \OCA\News\Bl\FolderBl;
class FolderController extends Controller { class FolderController extends Controller {
private $folderBl;
public function __construct(API $api, Request $request, $folderMapper){ public function __construct(API $api, Request $request, FolderBl $folderBl){
parent::__construct($api, $request); parent::__construct($api, $request);
$this->folderMapper = $folderMapper; $this->folderBl = $folderBl;
} }
@ -49,8 +50,11 @@ class FolderController extends Controller {
* Returns all folders * Returns all folders
*/ */
public function getAll(){ public function getAll(){
$folders = $this->folderMapper->getAll(); $folders = $this->folderBl->findAll($this->api->getUserId());
return $this->renderJSON($folders); $result = array(
'folders' => $folders
);
return $this->renderJSON($result);
} }

Просмотреть файл

@ -0,0 +1,70 @@
<?php
/**
* ownCloud - News
*
* @author Alessandro Cosentino
* @author Bernhard Posselt
* @copyright 2012 Alessandro Cosentino cosenal@gmail.com
* @copyright 2012 Bernhard Posselt nukeawhale@gmail.com
*
* This library is free software; you can redistribute it and/or
* modify it under the terms of the GNU AFFERO GENERAL PUBLIC LICENSE
* License as published by the Free Software Foundation; either
* version 3 of the License, or any later version.
*
* This library is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU AFFERO GENERAL PUBLIC LICENSE for more details.
*
* You should have received a copy of the GNU Affero General Public
* License along with this library. If not, see <http://www.gnu.org/licenses/>.
*
*/
namespace OCA\News\DependencyInjection;
use OCA\AppFramework\DependencyInjection\DIContainer as BaseContainer;
use OCA\News\Controller\FolderController;
use OCA\News\Bl\FolderBl;
use OCA\News\Db\FolderMapper;
class DIContainer extends BaseContainer {
/**
* Define your dependencies in here
*/
public function __construct(){
// tell parent container about the app name
parent::__construct('news');
/**
* CONTROLLERS
*/
$this['FolderController'] = $this->share(function($c){
return new FolderController($c['API'], $c['Request'], $c['FolderBl']);
});
/**
* Business
*/
$this['FolderBl'] = $this->share(function($c){
return new FolderBl($c['FolderMapper']);
});
/**
* MAPPERS
*/
$this['FolderMapper'] = $this->share(function($c){
return new FolderMapper($c['API']);
});
}
}

Просмотреть файл

@ -31,6 +31,8 @@ use \OCA\AppFramework\Utility\ControllerTestUtility;
use \OCA\AppFramework\Db\DoesNotExistException; use \OCA\AppFramework\Db\DoesNotExistException;
use \OCA\AppFramework\Db\MultipleObjectsReturnedException; use \OCA\AppFramework\Db\MultipleObjectsReturnedException;
use \OCA\News\Db\Folder;
require_once(__DIR__ . "/../classloader.php"); require_once(__DIR__ . "/../classloader.php");
@ -38,7 +40,7 @@ require_once(__DIR__ . "/../classloader.php");
class FolderControllerTest extends ControllerTestUtility { class FolderControllerTest extends ControllerTestUtility {
private $api; private $api;
private $folderMapper; private $folderBl;
private $request; private $request;
private $controller; private $controller;
@ -48,20 +50,21 @@ class FolderControllerTest extends ControllerTestUtility {
*/ */
public function setUp(){ public function setUp(){
$this->api = $this->getAPIMock(); $this->api = $this->getAPIMock();
$this->folderMapper = $this->getMock('FolderMapper', $this->folderBl = $this->getMockBuilder('\OCA\News\Bl\FolderBl')
array('getAll', 'setCollapsed')); ->disableOriginalConstructor()
->getMock();
$this->request = new Request(); $this->request = new Request();
$this->controller = new FolderController($this->api, $this->request, $this->controller = new FolderController($this->api, $this->request,
$this->folderMapper); $this->folderBl);
} }
/** /**
* getAll * getAll
*/ */
public function testGetAllCalled(){ public function testGetAllCalled(){
$this->folderMapper->expects($this->once()) $this->folderBl->expects($this->once())
->method('getAll') ->method('findAll')
->will($this->returnValue( array() )); ->will($this->returnValue( array() ));
$this->controller->getAll(); $this->controller->getAll();
@ -70,18 +73,21 @@ class FolderControllerTest extends ControllerTestUtility {
public function testGetAllReturnsFolders(){ public function testGetAllReturnsFolders(){
$return = array( $return = array(
'folder1' => 'name1', new Folder(),
'folder2' => 'name2' new Folder(),
); );
$this->folderMapper->expects($this->once()) $this->folderBl->expects($this->once())
->method('getAll') ->method('findAll')
->will($this->returnValue($return)); ->will($this->returnValue($return));
$response = $this->controller->getAll(); $response = $this->controller->getAll();
$this->assertEquals($return, $response->getParams()); $expected = array(
'folders' => $return
);
$this->assertEquals($expected, $response->getParams());
} }
public function testGetAllAnnotations(){ public function testGetAllAnnotations(){
$methodName = 'getAll'; $methodName = 'getAll';
$annotations = array('IsAdminExemption', 'IsSubAdminExemption', 'Ajax'); $annotations = array('IsAdminExemption', 'IsSubAdminExemption', 'Ajax');
@ -91,10 +97,6 @@ class FolderControllerTest extends ControllerTestUtility {
public function testGetAllReturnsJSON(){ public function testGetAllReturnsJSON(){
$this->folderMapper->expects($this->once())
->method('getAll')
->will($this->returnValue( array() ));
$response = $this->controller->getAll(); $response = $this->controller->getAll();
$this->assertTrue($response instanceof JSONResponse); $this->assertTrue($response instanceof JSONResponse);
@ -106,7 +108,7 @@ class FolderControllerTest extends ControllerTestUtility {
*//* *//*
public function testCollapseCalled(){ public function testCollapseCalled(){
$urlParams = array('folderId' => 1); $urlParams = array('folderId' => 1);
$this->folderMapper->expects($this->once()) $this->folderBl->expects($this->once())
->method('setCollapsed') ->method('setCollapsed')
->with($this->equalTo($urlParams['folderId']), $this->equalTo(true)); ->with($this->equalTo($urlParams['folderId']), $this->equalTo(true));
$this->controller->setURLParams($urlParams); $this->controller->setURLParams($urlParams);
@ -117,7 +119,7 @@ class FolderControllerTest extends ControllerTestUtility {
public function testCollapseReturnsNoParams(){ public function testCollapseReturnsNoParams(){
$urlParams = array('folderId' => 1); $urlParams = array('folderId' => 1);
$this->folderMapper->expects($this->once()) $this->folderBl->expects($this->once())
->method('setCollapsed') ->method('setCollapsed')
->with($this->equalTo($urlParams['folderId']), $this->equalTo(true)); ->with($this->equalTo($urlParams['folderId']), $this->equalTo(true));
$this->controller->setURLParams($urlParams); $this->controller->setURLParams($urlParams);
@ -137,7 +139,7 @@ class FolderControllerTest extends ControllerTestUtility {
public function testCollapseReturnsJSON(){ public function testCollapseReturnsJSON(){
$urlParams = array('folderId' => 1); $urlParams = array('folderId' => 1);
$this->folderMapper->expects($this->once()) $this->folderBl->expects($this->once())
->method('setCollapsed') ->method('setCollapsed')
->with($this->equalTo($urlParams['folderId']), $this->equalTo(true)); ->with($this->equalTo($urlParams['folderId']), $this->equalTo(true));
$this->controller->setURLParams($urlParams); $this->controller->setURLParams($urlParams);
@ -150,7 +152,7 @@ class FolderControllerTest extends ControllerTestUtility {
private function collapseException($ex){ private function collapseException($ex){
$urlParams = array('folderId' => 1); $urlParams = array('folderId' => 1);
$this->folderMapper->expects($this->once()) $this->folderBl->expects($this->once())
->method('setCollapsed') ->method('setCollapsed')
->with($this->equalTo($urlParams['folderId']), $this->equalTo(true)) ->with($this->equalTo($urlParams['folderId']), $this->equalTo(true))
->will($this->throwException($ex)); ->will($this->throwException($ex));