As discussed in #200

This commit is contained in:
Maurits van der Schee 2017-03-11 00:22:59 +01:00
commit bc31c2ba67
3 changed files with 45 additions and 30 deletions

View file

@ -91,6 +91,7 @@ $api = new PHP_CRUD_API(array(
'tenancy_function'=>function($cmd,$db,$tab,$col) { return null; }, 'tenancy_function'=>function($cmd,$db,$tab,$col) { return null; },
'input_sanitizer'=>function($cmd,$db,$tab,$col,$typ,$val) { return $val; }, 'input_sanitizer'=>function($cmd,$db,$tab,$col,$typ,$val) { return $val; },
'input_validator'=>function($cmd,$db,$tab,$col,$typ,$val,$ctx) { return true; }, 'input_validator'=>function($cmd,$db,$tab,$col,$typ,$val,$ctx) { return true; },
'after'=>function($cmd,$db,$tab,$id,$in,$out) { /* do something */ },
// configurable options // configurable options
'allow_origin'=>'*', 'allow_origin'=>'*',
'auto_include'=>true, 'auto_include'=>true,
@ -755,6 +756,10 @@ PUT http://localhost/api.php/categories/2
{"name":"Internet","icon":null} {"name":"Internet","icon":null}
``` ```
## Custom actions
After any operation the 'after' function is called that allows you to do some custom actions, note that the output parameter is not filled for 'read' or 'list' operations.
## Multi-domain CORS ## Multi-domain CORS
By specifying `allow_origin` in the configuration you can control the `Access-Control-Allow-Origin` response header that is being sent. By specifying `allow_origin` in the configuration you can control the `Access-Control-Allow-Origin` response header that is being sent.

69
api.php
View file

@ -1134,11 +1134,15 @@ class PHP_CRUD_API {
return $values; return $values;
} }
protected function applyAfterWrite($action,$table,$id,$input) { protected function applyAfterHandler($parameters,$output) {
$callback = $this->settings['after_write']; $callback = $parameters['after'];
if (is_callable($callback,true)) { if (is_callable($callback,true)) {
$database = $this->settings['database']; $action = $parameters['action'];
$callback($action,$database,$table,$id,$input); $database = $parameters['database'];
$table = $parameters['tables'][0];
$id = $parameters['key'][0];
$input = isset($parameters['inputs'])?$parameters['inputs']:false;
$callback($action,$database,$table,$id,$input,$output);
} }
} }
@ -1265,6 +1269,7 @@ class PHP_CRUD_API {
} else { } else {
echo json_encode($headers); echo json_encode($headers);
} }
return false;
} }
protected function startOutput() { protected function startOutput() {
@ -1476,7 +1481,6 @@ class PHP_CRUD_API {
$result = $this->db->query('INSERT INTO ! ('.$keys.') VALUES ('.$values.')',$params); $result = $this->db->query('INSERT INTO ! ('.$keys.') VALUES ('.$values.')',$params);
if (!$result) return null; if (!$result) return null;
$insertId = $this->db->insertId($result); $insertId = $this->db->insertId($result);
$this->applyAfterWrite('create',$tables[0],$insertId,$input);
return $insertId; return $insertId;
} }
@ -1513,7 +1517,6 @@ class PHP_CRUD_API {
$this->addWhereFromFilters($filters[$table],$sql,$params); $this->addWhereFromFilters($filters[$table],$sql,$params);
$result = $this->db->query($sql,$params); $result = $this->db->query($sql,$params);
if (!$result) return null; if (!$result) return null;
$this->applyAfterWrite('update',$tables[0],$key[0],$input);
return $this->db->affectedRows($result); return $this->db->affectedRows($result);
} }
@ -1546,7 +1549,6 @@ class PHP_CRUD_API {
$this->addWhereFromFilters($filters[$table],$sql,$params); $this->addWhereFromFilters($filters[$table],$sql,$params);
$result = $this->db->query($sql,$params); $result = $this->db->query($sql,$params);
if (!$result) return null; if (!$result) return null;
$this->applyAfterWrite('delete',$tables[0],$key[0],array());
return $this->db->affectedRows($result); return $this->db->affectedRows($result);
} }
@ -1591,7 +1593,6 @@ class PHP_CRUD_API {
$this->addWhereFromFilters($filters[$table],$sql,$params); $this->addWhereFromFilters($filters[$table],$sql,$params);
$result = $this->db->query($sql,$params); $result = $this->db->query($sql,$params);
if (!$result) return null; if (!$result) return null;
$this->applyAfterWrite('increment',$tables[0],$key[0],$input);
return $this->db->affectedRows($result); return $this->db->affectedRows($result);
} }
@ -1884,7 +1885,7 @@ class PHP_CRUD_API {
} }
} }
return compact('action','database','tables','key','page','filters','fields','orderings','transform','multi','inputs','collect','select'); return compact('action','database','tables','key','page','filters','fields','orderings','transform','multi','inputs','collect','select','after');
} }
protected function addWhereFromFilters($filters,&$sql,&$params) { protected function addWhereFromFilters($filters,&$sql,&$params) {
@ -2037,37 +2038,34 @@ class PHP_CRUD_API {
if (!$object) $this->exitWith404('object'); if (!$object) $this->exitWith404('object');
$this->startOutput(); $this->startOutput();
echo json_encode($object); echo json_encode($object);
return false;
} }
protected function createCommand($parameters) { protected function createCommand($parameters) {
extract($parameters); extract($parameters);
if (!$inputs || !$inputs[0]) $this->exitWith404('input'); if (!$inputs || !$inputs[0]) $this->exitWith404('input');
$this->startOutput(); if ($multi) return $this->createObjects($inputs,$tables);
if ($multi) echo json_encode($this->createObjects($inputs,$tables)); return $this->createObject($inputs[0],$tables);
else echo json_encode($this->createObject($inputs[0],$tables));
} }
protected function updateCommand($parameters) { protected function updateCommand($parameters) {
extract($parameters); extract($parameters);
if (!$inputs || !$inputs[0]) $this->exitWith404('subject'); if (!$inputs || !$inputs[0]) $this->exitWith404('subject');
$this->startOutput(); if ($multi) return $this->updateObjects($key,$inputs,$filters,$tables);
if ($multi) echo json_encode($this->updateObjects($key,$inputs,$filters,$tables)); return $this->updateObject($key,$inputs[0],$filters,$tables);
else echo json_encode($this->updateObject($key,$inputs[0],$filters,$tables));
} }
protected function deleteCommand($parameters) { protected function deleteCommand($parameters) {
extract($parameters); extract($parameters);
$this->startOutput(); if ($multi) return $this->deleteObjects($key,$filters,$tables);
if ($multi) echo json_encode($this->deleteObjects($key,$filters,$tables)); return $this->deleteObject($key,$filters,$tables);
else echo json_encode($this->deleteObject($key,$filters,$tables));
} }
protected function incrementCommand($parameters) { protected function incrementCommand($parameters) {
extract($parameters); extract($parameters);
if (!$inputs || !$inputs[0]) $this->exitWith404('subject'); if (!$inputs || !$inputs[0]) $this->exitWith404('subject');
$this->startOutput(); if ($multi) return $this->incrementObjects($key,$inputs,$filters,$tables,$fields);
if ($multi) echo json_encode($this->incrementObjects($key,$inputs,$filters,$tables,$fields)); return $this->incrementObject($key,$inputs[0],$filters,$tables,$fields);
else echo json_encode($this->incrementObject($key,$inputs[0],$filters,$tables,$fields));
} }
protected function listCommand($parameters) { protected function listCommand($parameters) {
@ -2083,6 +2081,7 @@ class PHP_CRUD_API {
$data = json_decode($content,true); $data = json_decode($content,true);
echo json_encode(self::php_crud_api_transform($data)); echo json_encode(self::php_crud_api_transform($data));
} }
return false;
} }
protected function retrievePostData() { protected function retrievePostData() {
@ -2122,7 +2121,7 @@ class PHP_CRUD_API {
$input_validator = isset($input_validator)?$input_validator:null; $input_validator = isset($input_validator)?$input_validator:null;
$auto_include = isset($auto_include)?$auto_include:null; $auto_include = isset($auto_include)?$auto_include:null;
$allow_origin = isset($allow_origin)?$allow_origin:null; $allow_origin = isset($allow_origin)?$allow_origin:null;
$after_write = isset($after_write)?$after_write:null; $after = isset($after)?$after:null;
$db = isset($db)?$db:null; $db = isset($db)?$db:null;
$method = isset($method)?$method:null; $method = isset($method)?$method:null;
@ -2174,7 +2173,7 @@ class PHP_CRUD_API {
} }
$this->db = $db; $this->db = $db;
$this->settings = compact('method', 'request', 'get', 'post', 'origin', 'database', 'table_authorizer', 'record_filter', 'column_authorizer', 'tenancy_function', 'input_sanitizer', 'input_validator', 'after_write', 'auto_include', 'allow_origin'); $this->settings = compact('method', 'request', 'get', 'post', 'origin', 'database', 'table_authorizer', 'record_filter', 'column_authorizer', 'tenancy_function', 'input_sanitizer', 'input_validator', 'after', 'auto_include', 'allow_origin');
} }
public static function php_crud_api_transform(&$tables) { public static function php_crud_api_transform(&$tables) {
@ -2627,13 +2626,23 @@ class PHP_CRUD_API {
} else { } else {
$parameters = $this->getParameters($this->settings); $parameters = $this->getParameters($this->settings);
switch($parameters['action']){ switch($parameters['action']){
case 'list': $this->listCommand($parameters); break; case 'list': $output = $this->listCommand($parameters); break;
case 'read': $this->readCommand($parameters); break; case 'read': $output = $this->readCommand($parameters); break;
case 'create': $this->createCommand($parameters); break; case 'create': $output = $this->createCommand($parameters); break;
case 'update': $this->updateCommand($parameters); break; case 'update': $output = $this->updateCommand($parameters); break;
case 'delete': $this->deleteCommand($parameters); break; case 'delete': $output = $this->deleteCommand($parameters); break;
case 'increment': $this->incrementCommand($parameters); break; case 'increment': $output = $this->incrementCommand($parameters); break;
case 'headers': $this->headersCommand($parameters); break; case 'headers': $output = $this->headersCommand($parameters); break;
default: $output = false;
}
if ($output!==false) {
$this->startOutput();
echo json_encode($output);
}
if ($parameters['after']) {
if ($output!==null) {
$this->applyAfterHandler($parameters,$output);
}
} }
} }
} }

View file

@ -34,6 +34,7 @@ class API
'tenancy_function'=>function($action,$database,$table,$column) { return ($table=='users'&&$column=='id')?1:null; }, 'tenancy_function'=>function($action,$database,$table,$column) { return ($table=='users'&&$column=='id')?1:null; },
'input_sanitizer'=>function($action,$database,$table,$column,$type,$value) { return is_string($value)?strip_tags($value):$value; }, 'input_sanitizer'=>function($action,$database,$table,$column,$type,$value) { return is_string($value)?strip_tags($value):$value; },
'input_validator'=>function($action,$database,$table,$column,$type,$value,$context) { return ($column=='category_id' && !is_numeric($value))?'must be numeric':true; }, 'input_validator'=>function($action,$database,$table,$column,$type,$value,$context) { return ($column=='category_id' && !is_numeric($value))?'must be numeric':true; },
'after' => function ($action,$database,$table,$id,$input,$output) { file_put_contents('log.txt',var_export(array($action,$database,$table,$id,$input,$output),true),FILE_APPEND); },
// for tests // for tests
'method' =>$method, 'method' =>$method,
'request' =>$url['path'], 'request' =>$url['path'],