Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
18 changes: 18 additions & 0 deletions src/Adapters/ModelResourceAdapter.php
Original file line number Diff line number Diff line change
Expand Up @@ -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
*/
Expand All @@ -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)
{

Expand Down Expand Up @@ -164,4 +178,8 @@ public function post($payload, $params, WebRequest $request)

return $this->makeResourceFromData($model);
}

public function delete($payload, $params, ?WebRequest $request)
{
}
}
35 changes: 31 additions & 4 deletions src/Adapters/ResourceAdapter.php
Original file line number Diff line number Diff line change
Expand Up @@ -4,6 +4,7 @@

use Rhubarb\Crown\Request\WebRequest;
use Rhubarb\RestApi\Exceptions\ResourceNotFoundException;
use Rhubarb\RestApi\Exceptions\RequestPayloadValidationException;
use Rhubarb\RestApi\Resources\ListResource;

/**
Expand All @@ -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"]){

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

absolutely

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"];
Expand Down Expand Up @@ -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.");
}
}
}
10 changes: 10 additions & 0 deletions src/Exceptions/RequestPayloadValidationException.php
Original file line number Diff line number Diff line change
@@ -0,0 +1,10 @@
<?php

namespace Rhubarb\RestApi\Exceptions;

use Rhubarb\Crown\Exceptions\RhubarbException;

class RequestPayloadValidationException extends RhubarbException
{

}
14 changes: 12 additions & 2 deletions src/UrlHandlers/RestApiHandler.php
Original file line number Diff line number Diff line change
Expand Up @@ -3,8 +3,10 @@
namespace Rhubarb\RestApi\UrlHandlers;

use Rhubarb\Crown\Response\HtmlResponse;
use Rhubarb\Crown\Response\NotAuthorisedResponse;
use Rhubarb\RestApi\Endpoints\CallableEndpoint;
use Rhubarb\RestApi\Endpoints\Endpoint;
use Rhubarb\RestApi\Exceptions\RequestPayloadValidationException;
use Rhubarb\RestApi\Exceptions\ResourceNotFoundException;
use Rhubarb\Crown\Request\WebRequest;
use Rhubarb\Crown\Response\JsonResponse;
Expand Down Expand Up @@ -150,11 +152,19 @@ protected function generateResponseForRequest($request = null)
}

$payload = $endpoint->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);
Expand Down