mirror of
https://github.com/silverstripe/silverstripe-framework
synced 2024-10-22 12:05:37 +00:00
ENHANCEMENT: Allow calling methods on DataObjects using RESTful API. Methods which can be called must be specified in the $allowed_actions array of the DataObject.
git-svn-id: svn://svn.silverstripe.com/silverstripe/open/modules/sapphire/branches/2.3@73149 467b73ca-7a2a-4603-9d3b-597d59a354a9
This commit is contained in:
parent
eeb07e221f
commit
66a1610d48
@ -381,29 +381,46 @@ class RestfulServer extends Controller {
|
|||||||
* current resolves in creatig a new element,
|
* current resolves in creatig a new element,
|
||||||
* rather than a "Conflict" message.
|
* rather than a "Conflict" message.
|
||||||
*/
|
*/
|
||||||
protected function postHandler($className, $id) {
|
protected function postHandler($className, $id, $relation) {
|
||||||
if($id) {
|
if($id) {
|
||||||
$this->response->setStatusCode(409);
|
if(!$relation) {
|
||||||
return 'Conflict';
|
$this->response->setStatusCode(409);
|
||||||
|
return 'Conflict';
|
||||||
|
}
|
||||||
|
|
||||||
|
$obj = DataObject::get_by_id($className, $id);
|
||||||
|
if(!$obj) return $this->notFound();
|
||||||
|
|
||||||
|
if(!$obj->hasMethod($relation)) {
|
||||||
|
return $this->notFound();
|
||||||
|
}
|
||||||
|
|
||||||
|
if(!$obj->stat('allowed_actions') || !in_array($relation, $obj->stat('allowed_actions'))) {
|
||||||
|
return $this->permissionFailure();
|
||||||
|
}
|
||||||
|
|
||||||
|
$obj->$relation();
|
||||||
|
|
||||||
|
$this->getResponse()->setStatusCode(204); // No Content
|
||||||
|
return true;
|
||||||
|
} else {
|
||||||
|
if(!singleton($className)->canCreate()) return $this->permissionFailure();
|
||||||
|
$obj = new $className();
|
||||||
|
|
||||||
|
$reqFormatter = $this->getRequestDataFormatter();
|
||||||
|
if(!$reqFormatter) return $this->unsupportedMediaType();
|
||||||
|
|
||||||
|
$responseFormatter = $this->getResponseDataFormatter();
|
||||||
|
|
||||||
|
$obj = $this->updateDataObject($obj, $reqFormatter);
|
||||||
|
|
||||||
|
$this->getResponse()->setStatusCode(201); // Created
|
||||||
|
$this->getResponse()->addHeader('Content-Type', $responseFormatter->getOutputContentType());
|
||||||
|
$objHref = Director::absoluteURL(self::$api_base . "$obj->class/$obj->ID");
|
||||||
|
$this->getResponse()->addHeader('Location', $objHref);
|
||||||
|
|
||||||
|
return $responseFormatter->convertDataObject($obj);
|
||||||
}
|
}
|
||||||
|
|
||||||
if(!singleton($className)->canCreate()) return $this->permissionFailure();
|
|
||||||
$obj = new $className();
|
|
||||||
|
|
||||||
$reqFormatter = $this->getRequestDataFormatter();
|
|
||||||
if(!$reqFormatter) return $this->unsupportedMediaType();
|
|
||||||
|
|
||||||
$responseFormatter = $this->getResponseDataFormatter();
|
|
||||||
|
|
||||||
$obj = $this->updateDataObject($obj, $reqFormatter);
|
|
||||||
|
|
||||||
$this->getResponse()->setStatusCode(201); // Created
|
|
||||||
$this->getResponse()->addHeader('Content-Type', $responseFormatter->getOutputContentType());
|
|
||||||
$objHref = Director::absoluteURL(self::$api_base . "$obj->class/$obj->ID");
|
|
||||||
$this->getResponse()->addHeader('Location', $objHref);
|
|
||||||
|
|
||||||
return $responseFormatter->convertDataObject($obj);
|
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
|
@ -2976,6 +2976,11 @@ class DataObject extends ViewableData implements DataObjectInterface,i18nEntityP
|
|||||||
*/
|
*/
|
||||||
public static $summary_fields = null;
|
public static $summary_fields = null;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Provides a list of allowed methods that can be called via RESTful api.
|
||||||
|
*/
|
||||||
|
public static $allowed_actions = null;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Collect all static properties on the object
|
* Collect all static properties on the object
|
||||||
* which contain natural language, and need to be translated.
|
* which contain natural language, and need to be translated.
|
||||||
|
Loading…
x
Reference in New Issue
Block a user