diff --git a/src/Adapters/ModelResourceAdapter.php b/src/Adapters/ModelResourceAdapter.php index ca03490..732a564 100644 --- a/src/Adapters/ModelResourceAdapter.php +++ b/src/Adapters/ModelResourceAdapter.php @@ -110,6 +110,11 @@ protected function applyResourceToModel($resource, Model $model) public function putResource($resource) { $modelClass = $this->modelClassName; + + if (!isset($resource["id"])) { + throw new ResourceNotFoundException(); + } + /** * @var $model Model */ @@ -122,6 +127,15 @@ public function putResource($resource) return $model; } + protected function applyParamsToPayload($payload, $params) + { + if (isset($params["id"])) { + $payload["id"] = $params["id"]; + } + + return parent::applyParamsToPayload($payload, $params); + } + protected function filterCollection(Collection $collection, $params, ?WebRequest $request = null) { @@ -164,4 +178,8 @@ public function post($payload, $params, WebRequest $request) return $this->makeResourceFromData($model); } + + public function delete($payload, $params, ?WebRequest $request) + { + } } \ No newline at end of file diff --git a/src/Adapters/ResourceAdapter.php b/src/Adapters/ResourceAdapter.php index e0d9205..627ec05 100644 --- a/src/Adapters/ResourceAdapter.php +++ b/src/Adapters/ResourceAdapter.php @@ -4,6 +4,7 @@ use Rhubarb\Crown\Request\WebRequest; use Rhubarb\RestApi\Exceptions\ResourceNotFoundException; +use Rhubarb\RestApi\Exceptions\RequestPayloadValidationException; use Rhubarb\RestApi\Resources\ListResource; /** @@ -20,17 +21,24 @@ abstract class ResourceAdapter */ public function put($payload, $params, ?WebRequest $request) { - $resource = $this->get($params, $request); + $payload = $this->validatePutRequestPayload($payload); - if ($resource->id != $payload["id"]){ - throw new ResourceNotFoundException(); - } + $payload = $this->applyParamsToPayload($payload, $params); + + $resource = $this->get($params, $request); $this->putResource($payload); return $this->get($params, $request); } + protected function validatePutRequestPayload($payload) + { + $this->validateRequestPayload($payload); + + return $payload; + } + public function get($params, ?WebRequest $request) { $id = $params["id"]; @@ -63,7 +71,26 @@ public function list($params, ?WebRequest $request = null) public abstract function post($payload, $params, WebRequest $request); + protected function validatePostRequestPayload($payload) + { + $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) + { + 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."); + } + } } \ No newline at end of file diff --git a/src/Exceptions/RequestPayloadValidationException.php b/src/Exceptions/RequestPayloadValidationException.php new file mode 100644 index 0000000..6597d1d --- /dev/null +++ b/src/Exceptions/RequestPayloadValidationException.php @@ -0,0 +1,10 @@ +processRequest($matches, $request); - $response = new JsonResponse(); - $response->setContent($payload); + + if ($payload instanceof Response) { + $response = $payload; + } else { + $response = new JsonResponse(); + $response->setContent($payload); + } } catch (ResourceNotFoundException $er){ $response = new NotFoundResponse(); $response->setContent("The resource could not be located."); + } catch (RequestPayloadValidationException $er){ + $response = new NotAuthorisedResponse(); + $response->setContent($er->getMessage()); } catch (\Throwable $er){ $response = new Response(); $response->setResponseCode(500);