nextcloud/lib/api.php

138 lines
3.7 KiB
PHP
Raw Normal View History

<?php
/**
2012-07-29 01:50:40 +04:00
* ownCloud
*
* @author Tom Needham
* @author Michael Gapczynski
* @author Bart Visscher
* @copyright 2012 Tom Needham tom@owncloud.com
* @copyright 2012 Michael Gapczynski mtgap@owncloud.com
* @copyright 2012 Bart Visscher bartv@thisnet.nl
*
* 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/>.
*
*/
class OC_API {
/**
* api actions
*/
protected static $actions = array();
2012-07-29 01:50:40 +04:00
/**
* registers an api call
* @param string $method the http method
* @param string $url the url to match
* @param callable $action the function to run
* @param string $app the id of the app registering the call
2012-07-29 01:50:40 +04:00
*/
2012-08-01 01:26:15 +04:00
public static function register($method, $url, $action, $app,
$defaults = array(),
$requirements = array()){
2012-07-29 01:50:40 +04:00
$name = strtolower($method).$url;
2012-07-30 22:52:47 +04:00
$name = str_replace(array('/', '{', '}'), '_', $name);
2012-07-29 01:50:40 +04:00
if(!isset(self::$actions[$name])){
2012-07-30 22:52:47 +04:00
OC::$router->create($name, $url.'.{_format}')
->method($method)
2012-08-01 01:26:15 +04:00
->defaults(array('_format' => 'xml') + $defaults)
->requirements(array('_format' => 'xml|json') + $requirements)
2012-07-29 01:50:40 +04:00
->action('OC_API', 'call');
self::$actions[$name] = array();
}
self::$actions[$name][] = array('app' => $app, 'action' => $action);
2012-07-29 01:50:40 +04:00
}
/**
* handles an api call
* @param array $parameters
*/
public static function call($parameters){
2012-07-30 23:03:41 +04:00
$name = $parameters['_route'];
2012-07-29 01:50:40 +04:00
// Loop through registered actions
foreach(self::$actions[$name] as $action){
2012-07-30 17:39:06 +04:00
$app = $action['app'];
if(is_callable($action['action'])){
2012-07-30 17:39:06 +04:00
$responses[] = array('app' => $app, 'response' => call_user_func($action['action'], $parameters));
2012-07-29 01:50:40 +04:00
} else {
2012-07-30 17:39:06 +04:00
$responses[] = array('app' => $app, 'response' => 501);
2012-07-29 01:50:40 +04:00
}
}
2012-07-30 17:39:06 +04:00
// Merge the responses
$response = self::mergeResponses($responses);
2012-07-29 01:50:40 +04:00
// Send the response
if(isset($parameters['_format'])){
self::respond($response, $parameters['_format']);
} else {
self::respond($response);
}
// logout the user to be stateles
OC_User::logout();
2012-07-29 01:50:40 +04:00
}
2012-07-30 17:39:06 +04:00
/**
* intelligently merges the different responses
* @param array $responses
* @return array the final merged response
*/
private static function mergeResponses($responses){
$finalresponse = array();
$numresponses = count($responses);
foreach($responses as $response){
if(is_int($response) && empty($finalresponse)){
$finalresponse = $response;
continue;
}
if(is_array($response)){
// Shipped apps win
if(OC_App::isShipped($response['app'])){
2012-07-30 20:04:09 +04:00
$finalresponse = array_merge_recursive($finalresponse, $response);
2012-07-30 17:39:06 +04:00
} else {
2012-07-30 20:04:09 +04:00
$finalresponse = array_merge_recursive($response, $finalresponse);
2012-07-30 17:39:06 +04:00
}
}
}
return $finalresponse;
}
2012-07-29 01:50:40 +04:00
/**
* respond to a call
* @param int|array $response the response
* @param string $format the format xml|json
*/
2012-07-30 23:03:41 +04:00
private static function respond($response, $format='json'){
if ($format == 'json') {
echo json_encode($response);
2012-08-01 01:26:15 +04:00
//} else if ($format == 'xml') {
2012-07-30 23:03:41 +04:00
// TODO array to xml
} else {
var_dump($format, $response);
}
2012-07-29 01:50:40 +04:00
}
2012-08-01 17:37:00 +04:00
/**
* check if the user is authenticated
*/
public static function checkLoggedIn(){
// Check OAuth
if(!OC_OAuth::isAuthorised()){
OC_Response::setStatus(401);
die();
}
}
2012-07-30 23:03:41 +04:00
}