. * */ class OC_API { /** * api actions */ protected $actions = array(); /** * registers an api call * @param string $method the http method * @param string $url the url to match * @param callable $action the function to run */ public function register($method, $url, $action){ $name = strtolower($method).$url; if(!isset(self::$actions[$name])){ OC_Router::create($name, $url) ->action('OC_API', 'call'); self::$actions[$name] = array(); } self::$actions[$name][] = $action; } /** * handles an api call * @param array $parameters */ public function call($parameters){ // Get the routes // TODO cache foreach(OC_APP::getEnabledApps() as $app){ $file = OC_App::getAppPath($app).'/appinfo/routes.php'; if(file_exists($file)){ require_once($file); } } $name = $parameters['_name']; $response = array(); // Loop through registered actions foreach(self::$actions[$name] as $action){ if(is_callable($action)){ $action_response = call_user_func($action, $parameters); if(is_array($action_response)){ // Merge with previous $response = array_merge($response, $action_response); } else { // TODO - Something failed, do we return an error code, depends on other action responses } } else { // Action not callable // log // TODO - Depending on other action responses, do we return a 501? } } // Send the response if(isset($parameters['_format'])){ self::respond($response, $parameters['_format']); } else { self::respond($response); } } /** * respond to a call * @param int|array $response the response * @param string $format the format xml|json */ private function respond($response, $format='json'){ // TODO respond in the correct format } }