Files
oc-server3/htdocs/okapi/services/caches/shortcuts/search_and_retrieve.php
T
2013-03-26 16:38:26 +01:00

106 lines
3.3 KiB
PHP

<?php
namespace okapi\services\caches\shortcuts\search_and_retrieve;
use okapi\Okapi;
use okapi\OkapiHttpResponse;
use okapi\OkapiInternalRequest;
use okapi\OkapiServiceRunner;
use okapi\OkapiRequest;
use okapi\ParamMissing;
use okapi\InvalidParam;
class WebService
{
public static function options()
{
return array(
'min_auth_level' => 1
);
}
public static function call(OkapiRequest $request)
{
# Check search method
$search_method = $request->get_parameter('search_method');
if (!$search_method)
throw new ParamMissing('search_method');
if (strpos($search_method, "services/caches/search/") !== 0)
throw new InvalidParam('search_method', "Should begin with 'services/caches/search/'.");
if (!OkapiServiceRunner::exists($search_method))
throw new InvalidParam('search_method', "Method does not exist: '$search_method'");
$search_params = $request->get_parameter('search_params');
if (!$search_params)
throw new ParamMissing('search_params');
$search_params = json_decode($search_params, true);
if (!is_array($search_params))
throw new InvalidParam('search_params', "Should be a JSON-encoded dictionary");
# Check retrieval method
$retr_method = $request->get_parameter('retr_method');
if (!$retr_method)
throw new ParamMissing('retr_method');
if (!OkapiServiceRunner::exists($retr_method))
throw new InvalidParam('retr_method', "Method does not exist: '$retr_method'");
$retr_params = $request->get_parameter('retr_params');
if (!$retr_params)
throw new ParamMissing('retr_params');
$retr_params = json_decode($retr_params, true);
if (!is_array($retr_params))
throw new InvalidParam('retr_params', "Should be a JSON-encoded dictionary");
# Wrapped?
$wrap = $request->get_parameter('wrap');
if ($wrap == null) throw new ParamMissing('wrap');
if (!in_array($wrap, array('true', 'false')))
throw new InvalidParam('wrap');
$wrap = ($wrap == 'true');
# Run search method
try
{
$search_result = OkapiServiceRunner::call($search_method, new OkapiInternalRequest(
$request->consumer, $request->token, $search_params));
}
catch (BadRequest $e)
{
throw new InvalidParam('search_params', "Search method responded with the ".
"following error message: ".$e->getMessage());
}
# Run retrieval method
try
{
$retr_result = OkapiServiceRunner::call($retr_method, new OkapiInternalRequest(
$request->consumer, $request->token, array_merge($retr_params,
array('cache_codes' => implode("|", $search_result['results'])))));
}
catch (BadRequest $e)
{
throw new InvalidParam('retr_params', "Retrieval method responded with the ".
"following error message: ".$e->getMessage());
}
if ($wrap)
{
# $retr_result might be a PHP object, but also might be a binary response
# (e.g. a GPX file).
if ($retr_result instanceof OkapiHttpResponse)
$result = array('results' => $retr_result->get_body());
else
$result = array('results' => $retr_result);
foreach ($search_result as $key => &$value_ref)
if ($key != 'results')
$result[$key] = $value_ref;
return Okapi::formatted_response($request, $result);
}
else
{
if ($retr_result instanceof OkapiHttpResponse)
return $retr_result;
else
return Okapi::formatted_response($request, $retr_result);
}
}
}