Split controllers

pull/1/head
Victor Dubiniuk 11 years ago
parent 84c9eb786d
commit a92c665916

@ -14,205 +14,16 @@ namespace OCA\Documents;
class Controller {
/**
* Process partial/complete file download
* @param array $args - array containing session id as anelement with a key es_id
*/
public static function serve($args){
self::preDispatch(false);
$session = Session::getSession(@$args['es_id']);
$filename = isset($session['genesis_url']) ? $session['genesis_url'] : '';
$documentsView = View::initDocumentsView($session['owner']);
$download = new Download($documentsView, $filename);
$download->sendResponse();
}
public static function startSession($args){
$uid = self::preDispatch();
try{
$path = \OC\Files\Filesystem::getPath(@$_POST['fileid']);
if (!$path){
throw new \Exception('No file has been passed');
}
$info = \OC\Files\Filesystem::getFileInfo($path);
if (!$info){
// Is it shared?
//searchByMime returns incorrect path for shared items
//
if (substr($path, 0, 14) === '/Shared/files/'){
// remove 'files/' from path as it's relative to '/Shared'
$path = '/Shared' . substr($path, 13);
$sharedInfo = \OC\Files\Filesystem::getFileInfo($path);
$fileId = $sharedInfo['fileid'];
}
} else {
$fileId = $info['fileid'];
}
$session = Session::getSessionByFileId($fileId);
//If there is no existing session we need to start a new one
if (!$session || empty($session)){
$documentsView = View::initDocumentsView($uid);
$genesisPath = View::storeDocument($uid, $path);
if (!$genesisPath){
throw new \Exception('Unable to copy document. Check permissions and make sure you have enought free space.');
}
$hash = View::getHashByGenesis($uid, $genesisPath);
$session = Session::add($genesisPath, $hash, $fileId);
}
$session['member_id'] = (string) Member::add($session['es_id'], $uid, Helper::getRandomColor());
\OCP\JSON::success($session);
exit();
} catch (\Exception $e){
Helper::warnLog('Starting a session failed. Reason: ' . $e->getMessage());
\OCP\JSON::error();
exit();
}
}
public static function joinSession($args){
$esId = @$args['es_id'];
$uid = self::preDispatch();
try{
if (!$esId){
throw new \Exception('Session id is empty');
}
$session = Session::getSession($esId);
if (!$session || empty($session)){
throw new \Exception('Session doesn\'t exist');
}
$session['member_id'] = (string) Member::add($session['es_id'], $uid, Helper::getRandomColor());
\OCP\JSON::success($session);
exit();
} catch (\Exception $e){
Helper::warnLog('Joining a session failed. Reason:' . $e->getMessage());
\OCP\JSON::error(array('message'=>$e->getMessage()));
exit();
}
}
/**
* Store the document content to its origin
*/
public static function save(){
$uid = self::preDispatch();
$sessionID = @$_SERVER['HTTP_WEBODF_SESSION_ID'];
$memberId = @$_SERVER['HTTP_WEBODF_MEMBER_ID'];
$sessionRevision = @$_SERVER['HTTP_WEBODF_SESSION_REVISION'];
$content = fopen('php://input','r');
if ($sessionID && $content){
$session = Session::getSession($sessionID);
$fileInfo = \OC\Files\Cache\Cache::getById($session['file_id']);
$path = $fileInfo[1];
$view = new \OC\Files\View('/' . $session['owner']);
$canWrite = ($view->file_exists($path) && $view->isUpdatable($path)) || $view->isCreatable($path);
if ($canWrite){
$view->file_put_contents($path, $content);
} else {
// TODO: report an error, break a plate, burn a house, conquer the galaxy
}
}
}
/**
* lists the documents the user has access to (including shared files, once the code in core has been fixed)
* also adds session and member info for these files
*/
public static function listDocuments(){
self::preDispatch();
$documents = Storage::getDocuments();
$fileIds = array();
foreach ($documents as $document) {
$fileIds[] = $document['fileid'];
}
$sessions = Session::getSessionsByFileIds($fileIds);
$members = array();
foreach ($sessions as $session) {
$members[$session['es_id']] = Member::getMembersByEsId($session['es_id']);
}
\OCP\JSON::success(array('documents' => $documents,'sessions' => $sessions,'members' => $members));
}
public static function listSessions(){
self::preDispatch();
$sessions = Session::getAll();
if (!is_array($sessions)){
$sessions = array();
}
$preparedSessions = array_map(
function($x){
return ($x['es_id']);
}, $sessions
);
\OCP\JSON::success(array(
"session_list" => $preparedSessions
));
}
public static function sessionInfo(){
self::preDispatch();
$items = @$_POST['items'];
$info = array();
if (is_array($items)){
$info = Session::getInfoByFileid($items);
}
\OCP\JSON::success(array(
"info" => $info
));
}
public static function listSessionsHtml(){
self::preDispatch();
$sessions = Session::getAll();
if (!is_array($sessions)){
$sessions = array();
}
$preparedSessions = array_map(
function($x){
return ($x['es_id']);
}, $sessions
);
$invites = Invite::getAllInvites();
if (!is_array($invites)){
$invites = array();
}
$tmpl = new \OCP\Template('documents', 'part.sessions', '');
$tmpl->assign('invites', $invites);
$tmpl->assign('sessions', $sessions);
echo $tmpl->fetchPage();
}
/**
* Do security precheck
* @param bool callcheck - whether security token check is needed
* @return string userId of the currently logged in user
*/
protected static function preDispatch($callcheck = true){
public static function preDispatch($callcheck = true){
if ($callcheck){
\OCP\JSON::callCheck();
}
\OCP\JSON::checkAppEnabled('documents');
\OCP\JSON::checkLoggedIn();
return \OCP\User::getUser();
}

@ -0,0 +1,54 @@
<?php
/**
* ownCloud - Documents App
*
* @author Victor Dubiniuk
* @copyright 2013 Victor Dubiniuk victor.dubiniuk@gmail.com
*
* This file is licensed under the Affero General Public License version 3 or
* later.
*/
namespace OCA\Documents;
class DocumentController extends Controller{
/**
* Process partial/complete file download
* @param array $args - array containing session id as anelement with a key es_id
*/
public static function serve($args){
self::preDispatch(false);
$session = Session::getSession(@$args['es_id']);
$filename = isset($session['genesis_url']) ? $session['genesis_url'] : '';
$documentsView = View::initDocumentsView($session['owner']);
$download = new Download($documentsView, $filename);
$download->sendResponse();
}
/**
* lists the documents the user has access to (including shared files, once the code in core has been fixed)
* also adds session and member info for these files
*/
public static function listAll(){
self::preDispatch();
$documents = Storage::getDocuments();
$fileIds = array();
foreach ($documents as $document) {
$fileIds[] = $document['fileid'];
}
$sessions = Session::getSessionsByFileIds($fileIds);
$members = array();
foreach ($sessions as $session) {
$members[$session['es_id']] = Member::getMembersByEsId($session['es_id']);
}
\OCP\JSON::success(array('documents' => $documents,'sessions' => $sessions,'members' => $members));
}
}

@ -0,0 +1,169 @@
<?php
/**
* ownCloud - Documents App
*
* @author Victor Dubiniuk
* @copyright 2013 Victor Dubiniuk victor.dubiniuk@gmail.com
*
* This file is licensed under the Affero General Public License version 3 or
* later.
*/
namespace OCA\Documents;
class SessionController extends Controller{
public static function start($args){
$uid = self::preDispatch();
try{
$path = \OC\Files\Filesystem::getPath(@$_POST['fileid']);
if (!$path){
throw new \Exception('No file has been passed');
}
$info = \OC\Files\Filesystem::getFileInfo($path);
if (!$info){
// Is it shared?
//searchByMime returns incorrect path for shared items
//
if (substr($path, 0, 14) === '/Shared/files/'){
// remove 'files/' from path as it's relative to '/Shared'
$path = '/Shared' . substr($path, 13);
$sharedInfo = \OC\Files\Filesystem::getFileInfo($path);
$fileId = $sharedInfo['fileid'];
}
} else {
$fileId = $info['fileid'];
}
$session = Session::getSessionByFileId($fileId);
//If there is no existing session we need to start a new one
if (!$session || empty($session)){
$documentsView = View::initDocumentsView($uid);
$genesisPath = View::storeDocument($uid, $path);
if (!$genesisPath){
throw new \Exception('Unable to copy document. Check permissions and make sure you have enought free space.');
}
$hash = View::getHashByGenesis($uid, $genesisPath);
$session = Session::add($genesisPath, $hash, $fileId);
}
$session['member_id'] = (string) Member::add($session['es_id'], $uid, Helper::getRandomColor());
\OCP\JSON::success($session);
exit();
} catch (\Exception $e){
Helper::warnLog('Starting a session failed. Reason: ' . $e->getMessage());
\OCP\JSON::error();
exit();
}
}
public static function join($args){
$esId = @$args['es_id'];
$uid = self::preDispatch();
try{
if (!$esId){
throw new \Exception('Session id is empty');
}
$session = Session::getSession($esId);
if (!$session || empty($session)){
throw new \Exception('Session doesn\'t exist');
}
$session['member_id'] = (string) Member::add($session['es_id'], $uid, Helper::getRandomColor());
\OCP\JSON::success($session);
exit();
} catch (\Exception $e){
Helper::warnLog('Joining a session failed. Reason:' . $e->getMessage());
\OCP\JSON::error(array('message'=>$e->getMessage()));
exit();
}
}
/**
* Store the document content to its origin
*/
public static function save(){
$uid = self::preDispatch();
$sessionID = @$_SERVER['HTTP_WEBODF_SESSION_ID'];
$memberId = @$_SERVER['HTTP_WEBODF_MEMBER_ID'];
$sessionRevision = @$_SERVER['HTTP_WEBODF_SESSION_REVISION'];
$content = fopen('php://input','r');
if ($sessionID && $content){
$session = Session::getSession($sessionID);
$fileInfo = \OC\Files\Cache\Cache::getById($session['file_id']);
$path = $fileInfo[1];
$view = new \OC\Files\View('/' . $session['owner']);
$canWrite = ($view->file_exists($path) && $view->isUpdatable($path)) || $view->isCreatable($path);
if ($canWrite){
$view->file_put_contents($path, $content);
} else {
// TODO: report an error, break a plate, burn a house, conquer the galaxy
}
}
}
public static function info(){
self::preDispatch();
$items = @$_POST['items'];
$info = array();
if (is_array($items)){
$info = Session::getInfoByFileid($items);
}
\OCP\JSON::success(array(
"info" => $info
));
}
public static function listAll(){
self::preDispatch();
$sessions = Session::getAll();
if (!is_array($sessions)){
$sessions = array();
}
$preparedSessions = array_map(
function($x){
return ($x['es_id']);
}, $sessions
);
\OCP\JSON::success(array(
"session_list" => $preparedSessions
));
}
public static function listAllHtml(){
self::preDispatch();
$sessions = Session::getAll();
if (!is_array($sessions)){
$sessions = array();
}
$preparedSessions = array_map(
function($x){
return ($x['es_id']);
}, $sessions
);
$invites = Invite::getAllInvites();
if (!is_array($invites)){
$invites = array();
}
$tmpl = new \OCP\Template('documents', 'part.sessions', '');
$tmpl->assign('invites', $invites);
$tmpl->assign('sessions', $sessions);
echo $tmpl->fetchPage();
}
}

@ -12,7 +12,7 @@
namespace OCA\Documents;
class UserController {
class UserController extends Controller{
/**
* Search users according to the pattern
@ -74,17 +74,4 @@ class UserController {
echo $image->show();
}
/**
* Do security precheck
* @param bool callcheck - whether security token check is needed
* @return string userId of the currently logged in user
*/
protected static function preDispatch($callcheck = true){
if ($callcheck){
\OCP\JSON::callCheck();
}
\OCP\JSON::checkLoggedIn();
return \OCP\User::getUser();
}
}

@ -35,6 +35,8 @@ OCP\App::addNavigationEntry(array(
);
OC::$CLASSPATH['OCA\Documents\Controller'] = 'documents/ajax/controller.php';
OC::$CLASSPATH['OCA\Documents\DocumentController'] = 'documents/ajax/documentController.php';
OC::$CLASSPATH['OCA\Documents\SessionController'] = 'documents/ajax/sessionController.php';
OC::$CLASSPATH['OCA\Documents\UserController'] = 'documents/ajax/userController.php';
OC::$CLASSPATH['OCA\Documents\Download\Simple'] = 'documents/lib/download/simple.php';
OC::$CLASSPATH['OCA\Documents\Download\Range'] = 'documents/lib/download/range.php';

@ -9,67 +9,76 @@
* later.
*/
/**
* Document routes
*/
$this->create('documents_genesis', 'ajax/genesis/{es_id}')
->post()
->action('\OCA\Documents\Controller', 'serve')
->action('\OCA\Documents\DocumentController', 'serve')
;
$this->create('documents_genesis', 'ajax/genesis/{es_id}')
->get()
->action('\OCA\Documents\Controller', 'serve')
->action('\OCA\Documents\DocumentController', 'serve')
;
$this->create('documents_documents_list', 'ajax/documents/list')
->get()
->action('\OCA\Documents\DocumentController', 'listAll')
;
/**
* Session routes
*/
$this->create('documents_session_start', 'ajax/session/start')
->get()
->action('\OCA\Documents\Controller', 'startSession')
->action('\OCA\Documents\SessionController', 'start')
;
$this->create('documents_session_start', 'ajax/session/start')
->post()
->action('\OCA\Documents\Controller', 'startSession')
;
$this->create('documents_documents_list', 'ajax/documents/list')
->get()
->action('\OCA\Documents\Controller', 'listDocuments')
->action('\OCA\Documents\SessionController', 'start')
;
$this->create('documents_session_list', 'ajax/session/list')
->get()
->action('\OCA\Documents\Controller', 'listSessions')
->action('\OCA\Documents\SessionController', 'listAll')
;
$this->create('documents_session_list', 'ajax/session/list')
->post()
->action('\OCA\Documents\Controller', 'listSessions')
->action('\OCA\Documents\SessionController', 'listAll')
;
$this->create('documents_session_info', 'ajax/session/info')
->post()
->action('\OCA\Documents\Controller', 'sessionInfo')
->action('\OCA\Documents\SessionController', 'info')
;
$this->create('documents_session_listhtml', 'ajax/session/listHtml')
->get()
->action('\OCA\Documents\Controller', 'listSessionsHtml')
->action('\OCA\Documents\SessionController', 'listAllHtml')
;
$this->create('documents_session_listhtml', 'ajax/session/listHtml')
->post()
->action('\OCA\Documents\Controller', 'listSessionsHtml')
->action('\OCA\Documents\SessionController', 'listAllHtml')
;
$this->create('documents_session_join', 'ajax/session/join/{es_id}')
->get()
->action('\OCA\Documents\Controller', 'joinSession')
->action('\OCA\Documents\SessionController', 'join')
;
$this->create('documents_session_join', 'ajax/session/join/{es_id}')
->post()
->action('\OCA\Documents\Controller', 'joinSession')
->action('\OCA\Documents\SessionController', 'join')
;
$this->create('documents_session_save', 'ajax/session/save')
->post()
->action('\OCA\Documents\Controller', 'save')
->action('\OCA\Documents\SessionController', 'save')
;
/**
* User routes
*/
$this->create('documents_user_avatar', 'ajax/user/avatar')
->get()
->action('\OCA\Documents\UserController', 'sendAvatar')

Loading…
Cancel
Save