Skip to content

Commit

Permalink
Fix controller handle method
Browse files Browse the repository at this point in the history
Write tests for controller handle methods
  • Loading branch information
nohponex committed Feb 4, 2016
1 parent dac1797 commit c850598
Show file tree
Hide file tree
Showing 22 changed files with 913 additions and 116 deletions.
58 changes: 31 additions & 27 deletions src/Controller/Base.php
Expand Up @@ -27,7 +27,6 @@
*/
abstract class Base
{

/**
* Shortcut to \Phramework\Phramework::view.
* @uses \Phramework\Phramework::view
Expand Down Expand Up @@ -113,24 +112,24 @@ public static function viewData(

/**
* Extract included related resources from parameters
* @param object $params Request parameters
* @param object $parameters Request parameters
* @return string[]
*/
protected static function getRequestInclude($params)
protected static function getRequestInclude($parameters)
{
//work with arrays
if (!is_object($params) && is_array($params)) {
$params = (object)$params;
if (!is_object($parameters) && is_array($parameters)) {
$parameters = (object)$parameters;
}

if (!isset($params->include) || empty($params->include)) {
if (!isset($parameters->include) || empty($parameters->include)) {
return [];
}

$include = [];

//split parameter using , (for multiple values)
foreach (explode(',', $params->include) as $i) {
foreach (explode(',', $parameters->include) as $i) {
$include[] = trim($i);
}

Expand All @@ -152,63 +151,68 @@ protected static function getRequestInclude($params)
* ]
* ]
* ```
* @param object $params Request parameters
* @param object $parameters Request parameters
* @uses Request::requireParameters
* @return object
*/
protected static function getRequestAttributes($params)
protected static function getRequestAttributes($parameters)
{
//work with objects
if (!is_object($params) && is_array($params)) {
$params = (object)$params;
if (is_array($parameters)) {
$parameters = (object) $parameters;
}

//Require data
Request::requireParameters($params, ['data']);
Request::requireParameters($parameters, ['data']);

//Require data attributes
Request::requireParameters($params->data, ['attributes']);
Request::requireParameters($parameters->data, ['attributes']);

//work with objects
if (is_array($parameters->data)) {
$parameters->data = (object) $parameters->data;
}

return (object)$params->data->attributes;
return (object)$parameters->data->attributes;
}

/**
* Get request primary data
* @param object $params Request parameters
* @param object $parameters Request parameters
* @uses Request::requireParameters
* @return object|object[]
*/
protected static function getRequestData($params)
protected static function getRequestData($parameters)
{
//work with objects
if (!is_object($params) && is_array($params)) {
$params = (object)$params;
if (!is_object($parameters) && is_array($parameters)) {
$parameters = (object)$parameters;
}

//Require data
Request::requireParameters($params, ['data']);
Request::requireParameters($parameters, ['data']);

return $params->data;
return $parameters->data;
}

/**
* Get request relationships if any attributes.
* @param object $params Request parameters
* @param object $parameters Request parameters
* @return \stdClass
*/
protected static function getRequestRelationships($params)
protected static function getRequestRelationships($parameters)
{
//work with objects
if (!is_object($params) && is_array($params)) {
$params = (object)$params;
if (!is_object($parameters) && is_array($parameters)) {
$parameters = (object)$parameters;
}

//Require data
Request::requireParameters($params, ['relationships']);
Request::requireParameters($parameters, ['relationships']);

//Require data['relationships']
if (isset($params->data->relationships)) {
return (object)$params->data->relationships;
if (isset($parameters->data->relationships)) {
return (object)$parameters->data->relationships;
} else {
return new \stdClass();
}
Expand Down
14 changes: 9 additions & 5 deletions src/Controller/DELETE.php
Expand Up @@ -30,7 +30,7 @@ abstract class DELETE extends \Phramework\JSONAPI\Controller\PATCH
/**
* Handle DELETE method
* On success will respond with 204 No Content
* @param object $params Request parameters
* @param object $parameters Request parameters
* @param string $method Request method
* @param array $headers Request headers
* @param integer|string $id Requested resource's id
Expand All @@ -43,18 +43,22 @@ abstract class DELETE extends \Phramework\JSONAPI\Controller\PATCH
* @uses model's `getById` method to fetch resource
* @uses $modelClass::delete method to
* delete resources
* @return void
* @return bool
*/
protected static function handleDELETE(
$params,
$parameters,
$method,
$headers,
$id,
$modelClass,
$primaryDataParameters = []
) {
//Fetch data, in order to check if resource exists (and/or is accessible)
$data = $modelClass::getById($id, $primaryDataParameters);
$data = $modelClass::getById(
$id,
null, //fields
...$primaryDataParameters
);

//Check if resource exists
static::exists($data);
Expand All @@ -71,6 +75,6 @@ protected static function handleDELETE(

\Phramework\Models\Response::noContent();

return;
return true;
}
}
32 changes: 11 additions & 21 deletions src/Controller/GET.php
Expand Up @@ -16,9 +16,10 @@
*/
namespace Phramework\JSONAPI\Controller;

use Phramework\JSONAPI\Controller\GET\Filter;
use Phramework\JSONAPI\Controller\GET\Page;
use Phramework\JSONAPI\Controller\GET\Sort;
use Phramework\JSONAPI\Filter;
use Phramework\JSONAPI\Fields;
use Phramework\JSONAPI\Page;
use Phramework\JSONAPI\Sort;
use Phramework\JSONAPI\Model;
use \Phramework\Models\Request;
use \Phramework\Models\Operator;
Expand Down Expand Up @@ -57,30 +58,18 @@ protected static function handleGET(
$parameters,
$modelClass,
$primaryDataParameters = [],
$relationshipParameters = [],
$filterable = true,
$filterableJSON = false,
$sortable = true
$relationshipParameters = []
) {
$filter = null;

$sort = null;

if ($filterable) {
$filter = $modelClass::parseFilter($parameters);
}

$page = Page::parseFromParameters($parameters);

if ($sortable) {
$sort = $modelClass::parseSort($parameters);
}
$page = $modelClass::parsePage($parameters);
$filter = $modelClass::parseFilter($parameters);
$sort = $modelClass::parseSort($parameters);
$fields = $modelClass::parseFields($parameters);

$data = $modelClass::get(
$page,
$filter,
$sort,
null, //fields
$fields,
$primaryDataParameters
);

Expand All @@ -90,6 +79,7 @@ protected static function handleGET(
$includedData = $modelClass::getIncludedData(
$data,
$requestInclude,
$fields,
$relationshipParameters
);

Expand Down
25 changes: 15 additions & 10 deletions src/Controller/GETById.php
Expand Up @@ -16,8 +16,9 @@
*/
namespace Phramework\JSONAPI\Controller;

use \Phramework\Models\Request;
use \Phramework\Exceptions\RequestException;
use Phramework\Models\Request;
use Phramework\JSONAPI\Fields;
use Phramework\Exceptions\RequestException;

/**
* GETById related methods
Expand All @@ -30,7 +31,7 @@ abstract class GETById extends \Phramework\JSONAPI\Controller\Relationships

/**
* handles GETById requests
* @param object $params Request parameters
* @param object $parameters Request parameters
* @param integer|string $id Requested resource's id
* @param string $modelClass Resource's primary model
* to be used
Expand All @@ -42,34 +43,38 @@ abstract class GETById extends \Phramework\JSONAPI\Controller\Relationships
* @return boolean
*/
protected static function handleGETByid(
$params,
$parameters,
$id,
$modelClass,
$primaryDataParameters = [],
$relationshipParameters = []
) {
//Rewrite resource's id
$id = Request::requireId($params);

$filterValidationModel = $modelClass::getFilterValidationModel();

$idAttribute = $modelClass::getIdAttribute();

//Filter id attribute value
if (!empty($filterValidationModel) && isset($filterValidationModel->{$idAttribute})) {
$id = $filterValidationModel->{$idAttribute}->parse($id);
}

//validate if set
$fields = $modelClass::parseFields($parameters);

$data = $modelClass::getById($id, $primaryDataParameters);
$data = $modelClass::getById(
$id,
$fields,
...$primaryDataParameters
);

//Check if resource exists
static::exists($data);

$requestInclude = static::getRequestInclude($params);
$requestInclude = static::getRequestInclude($parameters);

$includedData = $modelClass::getIncludedData(
$data,
$requestInclude,
$fields,
$relationshipParameters
);

Expand Down
16 changes: 11 additions & 5 deletions src/Controller/PATCH.php
Expand Up @@ -29,7 +29,7 @@
abstract class PATCH extends \Phramework\JSONAPI\Controller\POST
{
/**
* @param object $params Request parameters
* @param object $parameters Request parameters
* @param string $method Request method
* @param array $headers Request headers
* @param integer|string $id Requested resource's id
Expand All @@ -49,7 +49,7 @@ abstract class PATCH extends \Phramework\JSONAPI\Controller\POST
* @todo rethink output
*/
protected static function handlePATCH(
$params,
$parameters,
$method,
$headers,
$id,
Expand Down Expand Up @@ -84,7 +84,7 @@ protected static function handlePATCH(
);
}

$requestAttributes = static::getRequestAttributes($params);
$requestAttributes = static::getRequestAttributes($parameters);

$attributes = $validator->parse($requestAttributes);
$attributesCount = 0;
Expand All @@ -101,13 +101,19 @@ protected static function handlePATCH(
}

//Fetch data, to check if resource exists
$data = $modelClass::getById(id, $primaryDataParameters);
$data = $modelClass::getById(
$id,
null, //fields
...$primaryDataParameters
);

//Check if resource exists
//Check if resource exists (MUST exist!)
static::exists($data);

$patch = $modelClass::patch($id, (array) $attributes);

self::testUnknownError($patch, 'PATCH operation was not successful');

static::viewData(
$modelClass::resource(['id' => $id]),
['self' => $modelClass::getSelfLink($id)]
Expand Down
2 changes: 1 addition & 1 deletion src/Controller/POST.php
Expand Up @@ -133,7 +133,7 @@ protected static function handlePOST(
$ids[] = $id;
}

return $ids;
return $ids; //TODO REMOVE

if (count($ids) === 1) {
//Prepare response with 201 Created status code
Expand Down
6 changes: 2 additions & 4 deletions src/Controller/Relationships.php
Expand Up @@ -33,7 +33,7 @@ abstract class Relationships extends \Phramework\JSONAPI\Controller\Base
{
/**
* Handle handleByIdRelationships requests
* @param object $params Request parameters
* @param object $parameters Request parameters
* @param string $method Request method
* @param array $headers Request headers
* @param integer|string $id Resource's id
Expand All @@ -51,7 +51,7 @@ abstract class Relationships extends \Phramework\JSONAPI\Controller\Base
* @throws IncorrectParametersException When request method is not allowed
*/
protected static function handleByIdRelationships(
$params,
$parameters,
$method,
$headers,
$id,
Expand All @@ -61,8 +61,6 @@ protected static function handleByIdRelationships(
$primaryDataParameters = [],
$relationshipParameters = []
) {
$id = Request::requireId($params);

$relationship = Filter::string($relationship);

//Check if relationship exists
Expand Down

0 comments on commit c850598

Please sign in to comment.