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
4 changes: 2 additions & 2 deletions src/Adapters/ModelResourceAdapter.php
Original file line number Diff line number Diff line change
Expand Up @@ -171,9 +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)
{
$model = $this->makeModelFromResource($payload);
$model = $this->makeModelFromResource($resource);
$model->save();

return $this->makeResourceFromData($model);
Expand Down
82 changes: 57 additions & 25 deletions src/Adapters/ResourceAdapter.php
Original file line number Diff line number Diff line change
Expand Up @@ -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
Expand Down Expand Up @@ -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;
}

public abstract function putResource($resource);
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 makeResourceByIdentifier($id);

public abstract function makeResourceFromData($data);
public function makeResourceByIdentifier($id)
{
throw new RestImplementationException("Missing implementation of " . __FUNCTION__);
}

public function makeResourceFromData($data)
{
throw new RestImplementationException("Missing implementation of " . __FUNCTION__);
}

public function list($params, ?WebRequest $request = null)
{
Expand All @@ -69,28 +116,13 @@ public function list($params, ?WebRequest $request = null)
return $response;
}

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)
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.");
}
throw new RestImplementationException("Missing implementation of " . __FUNCTION__);
}
}
13 changes: 13 additions & 0 deletions src/Exceptions/RestImplementationException.php
Original file line number Diff line number Diff line change
@@ -0,0 +1,13 @@
<?php

namespace Rhubarb\RestApi\Exceptions;

use Rhubarb\Crown\Exceptions\RhubarbException;

class RestImplementationException extends RhubarbException
{
public function __construct($message = "")
{
parent::__construct($message);
}
}
7 changes: 6 additions & 1 deletion src/UrlHandlers/RestApiHandler.php
Original file line number Diff line number Diff line change
Expand Up @@ -13,6 +13,7 @@
use Rhubarb\Crown\Response\NotFoundResponse;
use Rhubarb\Crown\Response\Response;
use Rhubarb\Crown\UrlHandlers\UrlHandler;
use Rhubarb\RestApi\Exceptions\RestImplementationException;
use Rhubarb\RestApi\Middleware\Middleware;
use Rhubarb\RestApi\Middleware\MiddlewareProcessingTrait;

Expand Down Expand Up @@ -165,7 +166,11 @@ protected function generateResponseForRequest($request = null)
} catch (RequestPayloadValidationException $er){
$response = new NotAuthorisedResponse();
$response->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.");
Expand Down