From 1daf38ddbce2bfbab74e5bbf1baa7566dce14ffe Mon Sep 17 00:00:00 2001 From: Michael Miscampbell Date: Wed, 30 Jan 2019 21:15:54 +0000 Subject: [PATCH 1/2] Adding validation to the post method on ModelResourceAdapter. This will now validate the body has data --- src/Adapters/ModelResourceAdapter.php | 2 ++ src/Adapters/ResourceAdapter.php | 4 +++- 2 files changed, 5 insertions(+), 1 deletion(-) diff --git a/src/Adapters/ModelResourceAdapter.php b/src/Adapters/ModelResourceAdapter.php index 732a564..debfc24 100644 --- a/src/Adapters/ModelResourceAdapter.php +++ b/src/Adapters/ModelResourceAdapter.php @@ -173,6 +173,8 @@ protected function countItems($rangeStart, $rangeEnd, $params, ?WebRequest $requ public function post($payload, $params, WebRequest $request) { + $payload = $this->validatePostRequestPayload($payload); + $model = $this->makeModelFromResource($payload); $model->save(); diff --git a/src/Adapters/ResourceAdapter.php b/src/Adapters/ResourceAdapter.php index 627ec05..b7d5b9c 100644 --- a/src/Adapters/ResourceAdapter.php +++ b/src/Adapters/ResourceAdapter.php @@ -73,7 +73,7 @@ public abstract function post($payload, $params, WebRequest $request); protected function validatePostRequestPayload($payload) { - $this->validateRequestPayload($payload); + return $this->validateRequestPayload($payload); } public abstract function delete($payload, $params, ?WebRequest $request); @@ -92,5 +92,7 @@ private final function validateRequestPayload($payload) if (!is_array($payload)) { throw new RequestPayloadValidationException("POST and PUT options require a JSON encoded resource object in the body of the request."); } + + return $payload; } } \ No newline at end of file From ad58e5a5e39c9927a075e6610a1514ee90ec5c7b Mon Sep 17 00:00:00 2001 From: Michael Miscampbell Date: Wed, 30 Jan 2019 22:38:04 +0000 Subject: [PATCH 2/2] Removing abstract methods. This will enable us to override the functionality of post/put methods and add validation. Added RestImplementationException --- src/Adapters/ModelResourceAdapter.php | 6 +- src/Adapters/ResourceAdapter.php | 84 +++++++++++++------ .../RestImplementationException.php | 13 +++ src/UrlHandlers/RestApiHandler.php | 7 +- 4 files changed, 78 insertions(+), 32 deletions(-) create mode 100644 src/Exceptions/RestImplementationException.php diff --git a/src/Adapters/ModelResourceAdapter.php b/src/Adapters/ModelResourceAdapter.php index debfc24..44f24be 100644 --- a/src/Adapters/ModelResourceAdapter.php +++ b/src/Adapters/ModelResourceAdapter.php @@ -171,11 +171,9 @@ protected function countItems($rangeStart, $rangeEnd, $params, ?WebRequest $requ return count($this->getCollection($rangeStart, $rangeEnd, $params, $request)); } - public function post($payload, $params, WebRequest $request) + public function postResource($resource) { - $payload = $this->validatePostRequestPayload($payload); - - $model = $this->makeModelFromResource($payload); + $model = $this->makeModelFromResource($resource); $model->save(); return $this->makeResourceFromData($model); diff --git a/src/Adapters/ResourceAdapter.php b/src/Adapters/ResourceAdapter.php index b7d5b9c..6d03903 100644 --- a/src/Adapters/ResourceAdapter.php +++ b/src/Adapters/ResourceAdapter.php @@ -12,6 +12,15 @@ */ abstract class ResourceAdapter { + public function get($params, ?WebRequest $request) + { + $id = $params["id"]; + + $payload = $this->makeResourceByIdentifier($id); + + return $payload; + } + /** * @param $payload * @param $params @@ -39,20 +48,58 @@ protected function validatePutRequestPayload($payload) return $payload; } - public function get($params, ?WebRequest $request) + public function putResource($resource) { - $id = $params["id"]; + throw new RestImplementationException("Missing implementation of " . __FUNCTION__); + } - $payload = $this->makeResourceByIdentifier($id); + public function post($payload, $params, WebRequest $request) + { + $payload = $this->validatePostRequestPayload($payload); + + return $this->postResource($payload); + } + + protected function validatePostRequestPayload($payload) + { + return $this->validateRequestPayload($payload); + } + + public function postResource($resource) + { + throw new RestImplementationException("Missing implementation of " . __FUNCTION__); + } + + public function delete($payload, $params, ?WebRequest $request) + { + throw new RestImplementationException("Missing implementation of " . __FUNCTION__); + } + + + protected function applyParamsToPayload($payload, $params) + { + return $payload; + } + + private final function validateRequestPayload($payload) + { + if (!is_array($payload)) { + throw new RequestPayloadValidationException("POST and PUT options require a JSON encoded resource object in the body of the request."); + } return $payload; } - public abstract function putResource($resource); - public abstract function makeResourceByIdentifier($id); + public function makeResourceByIdentifier($id) + { + throw new RestImplementationException("Missing implementation of " . __FUNCTION__); + } - public abstract function makeResourceFromData($data); + public function makeResourceFromData($data) + { + throw new RestImplementationException("Missing implementation of " . __FUNCTION__); + } public function list($params, ?WebRequest $request = null) { @@ -69,30 +116,13 @@ public function list($params, ?WebRequest $request = null) return $response; } - public abstract function post($payload, $params, WebRequest $request); - - protected function validatePostRequestPayload($payload) - { - return $this->validateRequestPayload($payload); - } - - public abstract function delete($payload, $params, ?WebRequest $request); - - protected abstract function countItems($rangeStart, $rangeEnd, $params, ?WebRequest $request); - - protected abstract function getItems($rangeStart, $rangeEnd, $params, ?WebRequest $request); - - protected function applyParamsToPayload($payload, $params) + protected function countItems($rangeStart, $rangeEnd, $params, ?WebRequest $request) { - return $payload; + throw new RestImplementationException("Missing implementation of " . __FUNCTION__); } - private final function validateRequestPayload($payload) + protected function getItems($rangeStart, $rangeEnd, $params, ?WebRequest $request) { - if (!is_array($payload)) { - throw new RequestPayloadValidationException("POST and PUT options require a JSON encoded resource object in the body of the request."); - } - - return $payload; + throw new RestImplementationException("Missing implementation of " . __FUNCTION__); } } \ No newline at end of file diff --git a/src/Exceptions/RestImplementationException.php b/src/Exceptions/RestImplementationException.php new file mode 100644 index 0000000..c256dbd --- /dev/null +++ b/src/Exceptions/RestImplementationException.php @@ -0,0 +1,13 @@ +setContent($er->getMessage()); - } catch (\Throwable $er){ + } catch (RestImplementationException $exception) { + $response = new Response(); + $response->setResponseCode(Response::HTTP_STATUS_CLIENT_ERROR_BAD_REQUEST); + $response->setResponseMessage("Bad request received"); + } catch(\Throwable $er){ $response = new Response(); $response->setResponseCode(500); $response->setResponseMessage("An internal error occurred.");