Cleanup + add error_type to API response

This commit is contained in:
Romain Neutron
2012-05-15 16:47:12 +02:00
parent c164aaab47
commit 076f0317b5
5 changed files with 225 additions and 60 deletions

View File

@@ -11,13 +11,13 @@
namespace Alchemy\Phrasea\Application; namespace Alchemy\Phrasea\Application;
use Silex\Application;
use Symfony\Component\HttpFoundation\Response; use Symfony\Component\HttpFoundation\Response;
use Symfony\Component\HttpFoundation\Request; use Symfony\Component\HttpFoundation\Request;
use Symfony\Component\HttpKernel\Exception; use Symfony\Component\HttpKernel\Exception;
/** /**
* *
* @package APIv1
* @license http://opensource.org/licenses/gpl-3.0 GPLv3 * @license http://opensource.org/licenses/gpl-3.0 GPLv3
* @link www.phraseanet.com * @link www.phraseanet.com
*/ */
@@ -185,12 +185,11 @@ return call_user_func(function() {
/* @var $user \User_Adapter */ /* @var $user \User_Adapter */
$user = $app['token']->get_account()->get_user(); $user = $app['token']->get_account()->get_user();
if ( ! $user->is_admin()) { if ( ! $user->is_admin()) {
throw new \API_V1_exception_unauthorized(); throw new \API_V1_exception_unauthorized('You are not authorized');
} }
}; };
/** /**
* *******************************************************************
* Get all tasks information * Get all tasks information
* *
* Route : /monitor/phraseanet/ * Route : /monitor/phraseanet/
@@ -298,9 +297,10 @@ return call_user_func(function() {
} }
)->middleware($mustBeAdmin); )->middleware($mustBeAdmin);
/** /**
* ******************************************************************* * *******************************************************************
* Route : /databoxes/list/FORMAT/ * Route : /databoxes/list/
* *
* Method : GET * Method : GET
* *
@@ -317,7 +317,7 @@ return call_user_func(function() {
/** /**
* ******************************************************************* * *******************************************************************
* *
* Route /databoxes/DATABOX_ID/collections/FORMAT/ * Route /databoxes/DATABOX_ID/collections/
* *
* Method : GET * Method : GET
* *
@@ -338,7 +338,7 @@ return call_user_func(function() {
/** /**
* ******************************************************************* * *******************************************************************
* Route /databoxes/DATABOX_ID/status/FORMAT/ * Route /databoxes/DATABOX_ID/status/
* *
* Method : GET * Method : GET
* *
@@ -358,7 +358,7 @@ return call_user_func(function() {
$app->get('/databoxes/{any_id}/status/', $bad_request_exception); $app->get('/databoxes/{any_id}/status/', $bad_request_exception);
/** /**
* Route /databoxes/DATABOX_ID/metadatas/FORMAT/ * Route /databoxes/DATABOX_ID/metadatas/
* *
* Method : GET * Method : GET
* *
@@ -377,7 +377,7 @@ return call_user_func(function() {
$app->get('/databoxes/{any_id}/metadatas/', $bad_request_exception); $app->get('/databoxes/{any_id}/metadatas/', $bad_request_exception);
/** /**
* Route /databoxes/DATABOX_ID/termsOfUse/FORMAT/ * Route /databoxes/DATABOX_ID/termsOfUse/
* *
* Method : GET * Method : GET
* *
@@ -396,8 +396,27 @@ return call_user_func(function() {
$app->get('/databoxes/{any_id}/termsOfUse/', $bad_request_exception); $app->get('/databoxes/{any_id}/termsOfUse/', $bad_request_exception);
/** /**
* Route : /records/search/FORMAT/ * *******************************************************************
* Route : /records/add/
*
* Method : POST
*
* Parameters :
*
*/
$route = '/records/add/';
$app->post(
$route, function(\Silex\Application $app, Request $request) {
return $app['api']->add_record($app, $request)->get_response();
}
);
$app->match('/records/add/', $bad_request_exception);
/**
* Route : /records/search/
* *
* Method : GET or POST * Method : GET or POST
* *
@@ -435,7 +454,7 @@ return call_user_func(function() {
/** /**
* Route : /records/DATABOX_ID/RECORD_ID/metadatas/FORMAT/ * Route : /records/DATABOX_ID/RECORD_ID/metadatas/
* *
* Method : GET * Method : GET
* *
@@ -456,7 +475,7 @@ return call_user_func(function() {
$app->get('/records/{any_id}/{anyother_id}/metadatas/', $bad_request_exception); $app->get('/records/{any_id}/{anyother_id}/metadatas/', $bad_request_exception);
/** /**
* Route : /records/DATABOX_ID/RECORD_ID/status/FORMAT/ * Route : /records/DATABOX_ID/RECORD_ID/status/
* *
* Method : GET * Method : GET
* *
@@ -477,7 +496,7 @@ return call_user_func(function() {
$app->get('/records/{any_id}/{anyother_id}/status/', $bad_request_exception); $app->get('/records/{any_id}/{anyother_id}/status/', $bad_request_exception);
/** /**
* Route : /records/DATABOX_ID/RECORD_ID/related/FORMAT/ * Route : /records/DATABOX_ID/RECORD_ID/related/
* *
* Method : GET * Method : GET
* *
@@ -498,7 +517,7 @@ return call_user_func(function() {
$app->get('/records/{any_id}/{anyother_id}/related/', $bad_request_exception); $app->get('/records/{any_id}/{anyother_id}/related/', $bad_request_exception);
/** /**
* Route : /records/DATABOX_ID/RECORD_ID/embed/FORMAT/ * Route : /records/DATABOX_ID/RECORD_ID/embed/
* *
* Method : GET * Method : GET
* *
@@ -519,7 +538,7 @@ return call_user_func(function() {
$app->get('/records/{any_id}/{anyother_id}/embed/', $bad_request_exception); $app->get('/records/{any_id}/{anyother_id}/embed/', $bad_request_exception);
/** /**
* Route : /records/DATABOX_ID/RECORD_ID/setmetadatas/FORMAT/ * Route : /records/DATABOX_ID/RECORD_ID/setmetadatas/
* *
* Method : POST * Method : POST
* *
@@ -540,7 +559,7 @@ return call_user_func(function() {
$app->post('/records/{any_id}/{anyother_id}/setmetadatas/', $bad_request_exception); $app->post('/records/{any_id}/{anyother_id}/setmetadatas/', $bad_request_exception);
/** /**
* Route : /records/DATABOX_ID/RECORD_ID/setstatus/FORMAT/ * Route : /records/DATABOX_ID/RECORD_ID/setstatus/
* *
* Method : POST * Method : POST
* *
@@ -562,7 +581,7 @@ return call_user_func(function() {
/** /**
* Route : /records/DATABOX_ID/RECORD_ID/setcollection/FORMAT/ * Route : /records/DATABOX_ID/RECORD_ID/setcollection/
* *
* Method : POST * Method : POST
* *
@@ -591,7 +610,7 @@ return call_user_func(function() {
$app->get('/records/{any_id}/{anyother_id}/', $bad_request_exception); $app->get('/records/{any_id}/{anyother_id}/', $bad_request_exception);
/** /**
* Route : /baskets/list/FORMAT/ * Route : /baskets/list/
* *
* Method : POST * Method : POST
* *
@@ -609,7 +628,7 @@ return call_user_func(function() {
/** /**
* Route : /baskets/add/FORMAT/ * Route : /baskets/add/
* *
* Method : POST * Method : POST
* *
@@ -628,7 +647,7 @@ return call_user_func(function() {
/** /**
* Route : /baskets/BASKET_ID/content/FORMAT/ * Route : /baskets/BASKET_ID/content/
* *
* Method : GET * Method : GET
* *
@@ -648,7 +667,7 @@ return call_user_func(function() {
/** /**
* Route : /baskets/BASKET_ID/settitle/FORMAT/ * Route : /baskets/BASKET_ID/settitle/
* *
* Method : GET * Method : GET
* *
@@ -668,7 +687,7 @@ return call_user_func(function() {
/** /**
* Route : /baskets/BASKET_ID/setdescription/FORMAT/ * Route : /baskets/BASKET_ID/setdescription/
* *
* Method : POST * Method : POST
* *
@@ -687,7 +706,7 @@ return call_user_func(function() {
$app->post('/baskets/{wrong_basket_id}/setdescription/', $bad_request_exception); $app->post('/baskets/{wrong_basket_id}/setdescription/', $bad_request_exception);
/** /**
* Route : /baskets/BASKET_ID/delete/FORMAT/ * Route : /baskets/BASKET_ID/delete/
* *
* Method : POST * Method : POST
* *
@@ -707,7 +726,7 @@ return call_user_func(function() {
/** /**
* Route : /feeds/list/FORMAT/ * Route : /feeds/list/
* *
* Method : POST * Method : POST
* *
@@ -724,7 +743,7 @@ return call_user_func(function() {
); );
/** /**
* Route : /feeds/PUBLICATION_ID/content/FORMAT/ * Route : /feeds/PUBLICATION_ID/content/
* *
* Method : GET * Method : GET
* *
@@ -769,13 +788,13 @@ return call_user_func(function() {
else else
$code = \API_V1_result::ERROR_INTERNALSERVERERROR; $code = \API_V1_result::ERROR_INTERNALSERVERERROR;
$result = $app['api']->get_error_message($app['request'], $code); $result = $app['api']->get_error_message($app['request'], $code, $e->getMessage());
return $result->get_response(); return $result->get_response();
}); });
//// ////
//// ////
//// /** //// /**
//// * Route : /records/DATABOX_ID/RECORD_ID/addtobasket/FORMAT/ //// * Route : /records/DATABOX_ID/RECORD_ID/addtobasket/
//// * //// *
//// * Method : POST //// * Method : POST
//// * //// *
@@ -788,7 +807,7 @@ return call_user_func(function() {
//// ////
//// ////
//// /** //// /**
//// * Route : /feeds/PUBLICATION_ID/remove/FORMAT/ //// * Route : /feeds/PUBLICATION_ID/remove/
//// * //// *
//// * Method : GET //// * Method : GET
//// * //// *
@@ -800,7 +819,7 @@ return call_user_func(function() {
//// ////
//// ////
//// /** //// /**
//// * Route : /users/search/FORMAT/ //// * Route : /users/search/
//// * //// *
//// * Method : POST-GET //// * Method : POST-GET
//// * //// *
@@ -810,7 +829,7 @@ return call_user_func(function() {
//// public function search_users(\Symfony\Component\HttpFoundation\Request $app['request']); //// public function search_users(\Symfony\Component\HttpFoundation\Request $app['request']);
//// ////
//// /** //// /**
//// * Route : /users/USER_ID/access/FORMAT/ //// * Route : /users/USER_ID/access/
//// * //// *
//// * Method : GET //// * Method : GET
//// * //// *
@@ -821,7 +840,7 @@ return call_user_func(function() {
//// public function get_user_acces(\Symfony\Component\HttpFoundation\Request $app['request'], $usr_id); //// public function get_user_acces(\Symfony\Component\HttpFoundation\Request $app['request'], $usr_id);
//// ////
//// /** //// /**
//// * Route : /users/add/FORMAT/ //// * Route : /users/add/
//// * //// *
//// * Method : POST //// * Method : POST
//// * //// *

View File

@@ -27,13 +27,11 @@ return call_user_func(function() {
$app["Core"] = \bootstrap::getCore(); $app["Core"] = \bootstrap::getCore();
$app["appbox"] = \appbox::get_instance($app['Core']);
$app->get( $app->get(
'/', function(Request $request) use ($app) { '/', function(Request $request) use ($app) {
$registry = $app["Core"]->getRegistry(); $registry = $app["Core"]->getRegistry();
$apiAdapter = new \API_V1_adapter(false, $app["appbox"], $app["Core"]); $apiAdapter = new \API_V1_adapter(false, \appbox::get_instance($app['Core']), $app["Core"]);
$result = new \API_V1_result($request, $apiAdapter); $result = new \API_V1_result($request, $apiAdapter);

View File

@@ -311,7 +311,7 @@ interface API_V1_Interface
*/ */
public function add_user(\Symfony\Component\HttpFoundation\Request $request); public function add_user(\Symfony\Component\HttpFoundation\Request $request);
public function get_error_message(\Symfony\Component\HttpFoundation\Request $request, $error); public function get_error_message(\Symfony\Component\HttpFoundation\Request $request, $error, $message);
public function get_error_code(\Symfony\Component\HttpFoundation\Request $request, $code); public function get_error_code(\Symfony\Component\HttpFoundation\Request $request, $code);
} }

View File

@@ -9,15 +9,14 @@
* file that was distributed with this source code. * file that was distributed with this source code.
*/ */
use Symfony\Component\HttpFoundation\Request;
use Silex\Application;
/** /**
* *
* @license http://opensource.org/licenses/gpl-3.0 GPLv3 * @license http://opensource.org/licenses/gpl-3.0 GPLv3
* @link www.phraseanet.com * @link www.phraseanet.com
*/ */
use Symfony\Component\HttpFoundation\Request;
use Silex\Application;
class API_V1_adapter extends API_V1_Abstract class API_V1_adapter extends API_V1_Abstract
{ {
/** /**
@@ -62,10 +61,10 @@ class API_V1_adapter extends API_V1_Abstract
* @param string $error * @param string $error
* @return API_V1_result ` * @return API_V1_result `
*/ */
public function get_error_message(Request $request, $error) public function get_error_message(Request $request, $error, $message)
{ {
$result = new API_V1_result($request, $this); $result = new API_V1_result($request, $this);
$result->set_error_message($error); $result->set_error_message($error, $message);
return $result; return $result;
} }
@@ -657,6 +656,144 @@ class API_V1_adapter extends API_V1_Abstract
return $result; return $result;
} }
public function add_record(Application $app, Request $request)
{
if (count($request->files->get('file')) == 0) {
throw new API_V1_exception_badrequest('Missing file parameter');
}
if ( ! $request->files->get('file') instanceof Symfony\Component\HttpFoundation\File\UploadedFile) {
throw new API_V1_exception_badrequest('You can upload one file at time');
}
$file = $request->files->get('file');
/* @var $file Symfony\Component\HttpFoundation\File\UploadedFile */
if ( ! $file->isValid()) {
throw new API_V1_exception_badrequest('Datas corrupted, please try again');
}
if ( ! $request->get('base_id')) {
throw new API_V1_exception_badrequest('Missing base_id parameter');
}
$collection = \collection::get_from_base_id($request->get('base_id'));
if ( ! $app['Core']->getAuthenticatedUser()->ACL()->has_right_on_base($request->get('base_id'), 'canaddrecord')) {
throw new API_V1_exception_forbidden(sprintf('You do not have access to collection %s', $collection->get_name()));
}
$media = \MediaVorus\MediaVorus::guess($file);
$Package = new Alchemy\Phrasea\Border\File($media, $collection, $file->getClientOriginalName());
if ($request->get('status')) {
$Package->addAttribute(new \Alchemy\Phrasea\Border\Attribute\Status($request->get('status')));
}
$session = new Entities\LazaretSession();
$session->setUsrId($app['Core']->getAuthenticatedUser()->get_id());
$app['Core']['EM']->persist($session);
$app['Core']['EM']->flush();
$errors = $output = null;
$callback = function($element, $visa, $code) use(&$errors, &$output) {
if ( ! $visa->isValid()) {
$errors = array();
foreach ($visa->getResponses() as $response) {
$errors[] = $response->getMessage();
}
}
if ($code == \Alchemy\Phrasea\Border\Manager::RECORD_CREATED) {
$output = $element;
}
if ($code == \Alchemy\Phrasea\Border\Manager::LAZARET_CREATED) {
$output = $element;
}
};
switch ($request->get('forceBehavior')) {
case '0' :
$behavior = \Alchemy\Phrasea\Border\Manager::FORCE_RECORD;
break;
case '1' :
$behavior = \Alchemy\Phrasea\Border\Manager::FORCE_LAZARET;
break;
case null:
$behavior = null;
break;
default:
throw new API_V1_exception_badrequest('Invalid forceBehavior value');
break;
}
$app['Core']['border-manager']->process($session, $Package, $callback, $behavior);
if ($output instanceof \record_adapter) {
$ret = $this->list_record($output);
}
if ($output instanceof \Entities\LazaretFile) {
$ret = array(
'errors' => $errors,
'lazaretFile' => $this->list_lazaret_file($output),
);
}
$result = new API_V1_result($request, $this);
$result->set_datas($ret);
return $result;
}
protected function list_lazaret_file(\Entities\LazaretFile $file)
{
$attributes = $checks = array();
foreach ($file->getAttributes() as $attr) {
$attributes[] = array(
'name' => $attr->getName(),
'value' => $attr->asString(),
);
}
foreach ((array) $file->getChecks() as $checker) {
if ( ! class_exists($checker)) {
continue;
}
if ( ! $checker instanceof \Alchemy\Phrasea\Border\Checker\Checker) {
continue;
}
$checks[] = $checker::getMessage();
}
$session = array(
'id' => $file->getSession()->getId(),
'usr_id' => $file->getSession()->getUsrId(),
);
return array(
'id' => $file->getId(),
'session' => $session,
'base_id' => $file->getBaseId(),
'original_name' => $file->getOriginalName(),
'sha256' => $file->getSha256(),
'uuid' => $file->getUuid(),
'forced' => $file->getForced(),
'attributes' => $attributes,
'checks' => $checks,
'created_on' => $file->getCreated()->format(DATE_ATOM),
'updated_on' => $file->getUpdated()->format(DATE_ATOM),
);
}
/** /**
* Get an API_V1_result containing the results of a records search * Get an API_V1_result containing the results of a records search
* *
@@ -922,7 +1059,7 @@ class API_V1_adapter extends API_V1_Abstract
$record->set_metadatas($metadatas); $record->set_metadatas($metadatas);
$result->set_datas(array("metadatas" => $this->list_record_caption($record->get_caption()))); $result->set_datas(array("metadatas" => $this->list_record_caption($record->get_caption())));
} catch (Exception $e) { } catch (Exception $e) {
$result->set_error_message(API_V1_result::ERROR_BAD_REQUEST); $result->set_error_message(API_V1_result::ERROR_BAD_REQUEST, _('An error occured'));
} }
return $result; return $result;
@@ -965,7 +1102,7 @@ class API_V1_adapter extends API_V1_Abstract
) )
); );
} catch (Exception $e) { } catch (Exception $e) {
$result->set_error_message(API_V1_result::ERROR_BAD_REQUEST); $result->set_error_message(API_V1_result::ERROR_BAD_REQUEST, _('An error occured'));
} }
return $result; return $result;
@@ -991,7 +1128,7 @@ class API_V1_adapter extends API_V1_Abstract
$record->move_to_collection($collection, $this->appbox); $record->move_to_collection($collection, $this->appbox);
$result->set_datas(array("record" => $this->list_record($record))); $result->set_datas(array("record" => $this->list_record($record)));
} catch (Exception $e) { } catch (Exception $e) {
$result->set_error_message(API_V1_result::ERROR_BAD_REQUEST); $result->set_error_message(API_V1_result::ERROR_BAD_REQUEST, _('An error occured'));
} }
return $result; return $result;
@@ -1012,8 +1149,10 @@ class API_V1_adapter extends API_V1_Abstract
try { try {
$record = $databox->get_record($record_id); $record = $databox->get_record($record_id);
$result->set_datas(array('record' => $this->list_record($record))); $result->set_datas(array('record' => $this->list_record($record)));
} catch (Exception_NotFound $e) {
$result->set_error_message(API_V1_result::ERROR_BAD_REQUEST, _('Record Not Found'));
} catch (Exception $e) { } catch (Exception $e) {
$result->set_error_message(API_V1_result::ERROR_BAD_REQUEST); $result->set_error_message(API_V1_result::ERROR_BAD_REQUEST, _('An error occured'));
} }
return $result; return $result;
@@ -1083,7 +1222,7 @@ class API_V1_adapter extends API_V1_Abstract
$name = $request->get('name'); $name = $request->get('name');
if (trim(strip_tags($name)) === '') { if (trim(strip_tags($name)) === '') {
throw new API_V1_exception_badrequest (); throw new API_V1_exception_badrequest('Missing basket name parameter');
} }
$user = $this->core->getAuthenticatedUser(); $user = $this->core->getAuthenticatedUser();

View File

@@ -39,6 +39,12 @@ class API_V1_result
*/ */
protected $http_code = 200; protected $http_code = 200;
/**
*
* @var string
*/
protected $error_type;
/** /**
* *
* @var string * @var string
@@ -172,6 +178,7 @@ class API_V1_result
, 'request' => $request_uri , 'request' => $request_uri
, 'response_time' => $this->response_time , 'response_time' => $this->response_time
, 'http_code' => $this->http_code , 'http_code' => $this->http_code
, 'error_type' => $this->error_type
, 'error_message' => $this->error_message , 'error_message' => $this->error_message
, 'error_details' => $this->error_details , 'error_details' => $this->error_details
, 'charset' => 'UTF-8' , 'charset' => 'UTF-8'
@@ -227,47 +234,49 @@ class API_V1_result
} }
/** /**
* Set the API_V1_result http_code, error_message and error_details * Set the API_V1_result http_code, error_type, error_message and error_details
* with the appropriate datas * with the appropriate datas
* *
* @param string $const * @param string $const
* @return API_V1_result * @return API_V1_result
*/ */
public function set_error_message($const) public function set_error_message($const, $message)
{ {
$this->error_details = $message;
switch ($const) { switch ($const) {
case self::ERROR_BAD_REQUEST: case self::ERROR_BAD_REQUEST:
$this->http_code = 400; $this->http_code = 400;
$this->error_message = $const; $this->error_type = $const;
$this->error_details = API_V1_exception_badrequest::get_details(); $this->error_message = API_V1_exception_badrequest::get_details();
break; break;
case self::ERROR_UNAUTHORIZED: case self::ERROR_UNAUTHORIZED:
$this->http_code = 401; $this->http_code = 401;
$this->error_message = $const; $this->error_type = $const;
$this->error_details = API_V1_exception_unauthorized::get_details(); $this->error_message = API_V1_exception_unauthorized::get_details();
break; break;
case self::ERROR_FORBIDDEN: case self::ERROR_FORBIDDEN:
$this->http_code = 403; $this->http_code = 403;
$this->error_message = $const; $this->error_type = $const;
$this->error_details = API_V1_exception_forbidden::get_details(); $this->error_message = API_V1_exception_forbidden::get_details();
break; break;
case self::ERROR_NOTFOUND: case self::ERROR_NOTFOUND:
$this->http_code = 404; $this->http_code = 404;
$this->error_message = $const; $this->error_type = $const;
$this->error_details = API_V1_exception_notfound::get_details(); $this->error_message = API_V1_exception_notfound::get_details();
break; break;
case self::ERROR_METHODNOTALLOWED: case self::ERROR_METHODNOTALLOWED:
$this->http_code = 405; $this->http_code = 405;
$this->error_message = $const; $this->error_type = $const;
$this->error_details = API_V1_exception_methodnotallowed::get_details(); $this->error_message = API_V1_exception_methodnotallowed::get_details();
break; break;
case self::ERROR_INTERNALSERVERERROR: case self::ERROR_INTERNALSERVERERROR:
$this->http_code = 500; $this->http_code = 500;
$this->error_message = $const; $this->error_type = $const;
$this->error_details = API_V1_exception_internalservererror::get_details(); $this->error_message = API_V1_exception_internalservererror::get_details();
break; break;
case OAUTH2_ERROR_INVALID_REQUEST: case OAUTH2_ERROR_INVALID_REQUEST:
$this->error_message = $const; $this->error_type = $const;
break; break;
} }