/**
* Update databse record or $model
*
* @param String $model the model class to update
* @param Integer $id The ID of the model to update
* @param SS_HTTPRequest the original request
*
* @return DataObject The updated model
*/
function updateModel($model, $id, $request)
{
$model = DataObject::get_by_id($model, $id);
if (!$model) {
return new RESTfulAPI_Error(404, "Record not found.");
}
if (!RESTfulAPI::api_access_control($model, $request->httpMethod())) {
return new RESTfulAPI_Error(403, "API access denied.");
}
$payload = $this->deSerializer->deserialize($request->getBody());
if ($payload instanceof RESTfulAPI_Error) {
return $payload;
}
if ($model && $payload) {
$has_one = Config::inst()->get($model->ClassName, 'has_one');
$has_many = Config::inst()->get($model->ClassName, 'has_many');
$many_many = Config::inst()->get($model->ClassName, 'many_many');
$belongs_many_many = Config::inst()->get($model->ClassName, 'belongs_many_many');
$many_many_extraFields = array();
if (isset($payload['ManyManyExtraFields'])) {
$many_many_extraFields = $payload['ManyManyExtraFields'];
unset($payload['ManyManyExtraFields']);
}
$hasChanges = false;
$hasRelationChanges = false;
foreach ($payload as $attribute => $value) {
if (!is_array($value)) {
if (is_array($has_one) && array_key_exists($attribute, $has_one)) {
$relation = $attribute . 'ID';
$model->{$relation} = $value;
$hasChanges = true;
} else {
if ($model->{$attribute} != $value) {
$model->{$attribute} = $value;
$hasChanges = true;
}
}
} else {
//has_many, many_many or $belong_many_many
if (is_array($has_many) && array_key_exists($attribute, $has_many) || is_array($many_many) && array_key_exists($attribute, $many_many) || is_array($belongs_many_many) && array_key_exists($attribute, $belongs_many_many)) {
$hasRelationChanges = true;
$ssList = $model->{$attribute}();
$ssList->removeAll();
//reset list
foreach ($value as $id) {
// check if there is extraFields
if (array_key_exists($attribute, $many_many_extraFields)) {
if (isset($many_many_extraFields[$attribute][$id])) {
$ssList->add($id, $many_many_extraFields[$attribute][$id]);
continue;
}
}
$ssList->add($id);
}
}
}
}
if ($hasChanges || $hasRelationChanges) {
$model->write(false, false, false, $hasRelationChanges);
}
}
return DataObject::get_by_id($model->ClassName, $model->ID);
}