diff --git a/lib/api.php b/lib/api.php new file mode 100644 index 0000000000..767f1d30b7 --- /dev/null +++ b/lib/api.php @@ -0,0 +1,91 @@ +. + * + */ + + 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){ + // TODO load the routes.php from apps + $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 + } + + } \ No newline at end of file