Skip to content

Commit

Permalink
Prepare filter - breaks tests
Browse files Browse the repository at this point in the history
  • Loading branch information
nohponex committed May 30, 2016
1 parent 72b0781 commit 014498c
Show file tree
Hide file tree
Showing 14 changed files with 856 additions and 424 deletions.
9 changes: 7 additions & 2 deletions src/DataSource/DatabaseDataSource.php
Original file line number Diff line number Diff line change
Expand Up @@ -16,6 +16,7 @@
*/
namespace Phramework\JSONAPI\DataSource;

use Phramework\Database\Database;
use Phramework\Database\Operations\Create;
use Phramework\Database\Operations\Delete;
use Phramework\Database\Operations\Update;
Expand Down Expand Up @@ -72,13 +73,17 @@ public function get(
{{sort}}
{{page}}';

$records = $this->handleGet(
$query = $this->handleGet(
$query,
false,
$directives
);

//todo call prepare records method from model
$records = Database::executeAndFetchAll(
$query
);

array_walk($records, $this->prepareRecords);

return $this->model->collection($records, $directives);
}
Expand Down
2 changes: 1 addition & 1 deletion src/Fields.php
Original file line number Diff line number Diff line change
Expand Up @@ -192,7 +192,7 @@ public static function parseFromParameters(

$allowedFields = $modelClass::getFields();

//Validate parsedFields (allowed in $modelClass)
//Validate parsedFields (allowed in $model)
foreach ($parsedFields as $parsedField) {
if (!in_array($parsedField, $allowedFields)) {
throw new IncorrectParametersException(
Expand Down
91 changes: 46 additions & 45 deletions src/Filter.php
Original file line number Diff line number Diff line change
Expand Up @@ -45,7 +45,7 @@ class Filter implements IDirective
protected $primary;

/**
* @var object
* @var \stdClass
* @example
* ```php
* (object) [
Expand All @@ -58,15 +58,15 @@ class Filter implements IDirective
protected $relationships;

/**
* @var FilterAttribute[]|FilterJSONAttribute[]
* @var (FilterAttributeFilterJSONAttribute)[]
*/
protected $attributes;

/**
* Filter constructor.
* @param string[] $primary
* @param \stdClass|null $relationships
* @param FilterAttribute[]|FilterJSONAttribute[] $filterAttributes
* @param \stdClass $relationships null wil be interpreted as empty object
* @param (FilterAttribute|FilterJSONAttribute)[] $filterAttributes
* @throws \Exception
* @throws \InvalidArgumentException
* @example
Expand Down Expand Up @@ -135,7 +135,7 @@ public function __construct(

/**
* Validate against a resource model class
* @param string $modelClass Resource model class
* @param InternalModel $model
* @throws RequestException
* @throws \Exception
* @throws IncorrectParametersException When filter for primary id attribute is incorrect
Expand All @@ -148,20 +148,20 @@ public function __construct(
* ```
* @todo add relationship idAttribute validators
*/
public function validate(InternalModel $modelClass)
public function validate(InternalModel $model)
{
$idAttribute = $modelClass::getIdAttribute();
$filterValidationModel = $modelClass::getFilterValidationModel();
$validationModel = $modelClass::getValidationModel();
$idAttribute = $model->getIdAttribute();
$filterValidator = $model->getFilterValidator();
$validationModel = $model->getValidationModel();

/**
* Validate primary
*/

//Use filterValidator for idAttribute if set else use unsigned integer validator to parse filtered values
$idAttributeValidator = (
!empty($filterValidationModel) && isset($filterValidationModel->properties->{$idAttribute})
? [$filterValidationModel->properties->{$idAttribute}, 'parse']
!empty($filterValidator) && isset($filterValidator->properties->{$idAttribute})
? [$filterValidator->properties->{$idAttribute}, 'parse']
: [UnsignedIntegerValidator::class, 'parseStatic']
);

Expand All @@ -175,8 +175,8 @@ public function validate(InternalModel $modelClass)
*/

if ($this->relationships !== null) {
foreach ($this->relationships as $relationshipKey => $relationshipValue) {
if (!$modelClass::relationshipExists($relationshipKey)) {
foreach ($this->getRelationships() as $relationshipKey => $relationshipValue) {
if (!$model->issetRelationship($relationshipKey)) {
throw new RequestException(sprintf(
'Not a valid relationship for filter relationship "%"',
$relationshipKey
Expand All @@ -187,8 +187,8 @@ public function validate(InternalModel $modelClass)
continue;
}

$relationshipObject = $modelClass::getRelationship($relationshipKey);
$relationshipObjectModelClass = $relationshipObject->modelClass;
$relationshipObject = $model->getRelationship($relationshipKey);
$relationshipObjectModelClass = $relationshipObject->getModel();
$relationshipValidationModel = $relationshipObjectModelClass::getValidationModel();
$relationshipFilterValidationModel = $relationshipObjectModelClass::getValidationModel();

Expand Down Expand Up @@ -220,7 +220,7 @@ public function validate(InternalModel $modelClass)
* Validate attributes
*/

$filterable = $modelClass::getFilterable();
$filterable = $model->getFilterableAttributes();

foreach ($this->attributes as $filterAttribute) {
$isJSONFilter = ($filterAttribute instanceof FilterJSONAttribute);
Expand All @@ -235,15 +235,16 @@ public function validate(InternalModel $modelClass)
$attributeValidator = null;

//Attempt to use filter validation model first
if ($filterValidationModel
//&& isset($filterValidationModel)
&& isset($filterValidationModel->properties->{$filterAttribute->attribute})
if ($filterValidator
//&& isset($filterValidator)
&& isset($filterValidator->properties->{$filterAttribute->attribute})
) {
$attributeValidator =
$filterValidationModel->properties->{$filterAttribute->attribute};
$filterValidator->properties->{$filterAttribute->attribute};
} elseif ($validationModel
&& isset($validationModel->attributes)
&& isset($validationModel->attributes->properties->{$filterAttribute->attribute})
&& isset(
$validationModel->attributes,
$validationModel->attributes->properties->{$filterAttribute->attribute})
) { //Then attempt to use attribute validation model first
$attributeValidator =
$validationModel->attributes->properties->{$filterAttribute->attribute};
Expand Down Expand Up @@ -279,12 +280,12 @@ public function validate(InternalModel $modelClass)
if (!in_array($filterAttribute->operator, Operator::getNullableOperators())) {
if ($isJSONFilter) {
//If filter validator is set for dereference JSON object property
if ($filterValidationModel
&& isset($filterValidationModel->properties->{$filterAttribute->attribute})
&& isset($filterValidationModel->properties->{$filterAttribute->attribute}
if ($filterValidator
&& isset($filterValidator->properties->{$filterAttribute->attribute})
&& isset($filterValidator->properties->{$filterAttribute->attribute}
->properties->{$filterAttribute->key})
) {
$attributePropertyValidator = $filterValidationModel->properties
$attributePropertyValidator = $filterValidator->properties
->{$filterAttribute->attribute}->properties->{$filterAttribute->key};

$attributePropertyValidator->parse($filterAttribute->operand);
Expand All @@ -301,7 +302,7 @@ public function validate(InternalModel $modelClass)

/**
* @param \stdClass $parameters Request parameters
* @param string $model
* @param InternalModel $model
* @return Filter|null
* @todo allow strings and integers as id
* @todo Todo use filterValidation model for relationships
Expand Down Expand Up @@ -350,15 +351,15 @@ public static function parseFromRequest(
return null;
}

$filterValidationModel = $model->getFilterValidationModel();
$idAttribute = $model->getIdAttribute();
$filterValidator = $model->getFilterValidator();
$idAttribute = $model->getIdAttribute();

$filterPrimary = [];
$filterRelationships = new \stdClass();
$filterAttributes = [];

foreach ($parameters->filter as $filterKey => $filterValue) {
if ($filterKey === $model::getType()) { //Filter primary data
if ($filterKey === $model->getResourceType()) { //Filter primary data
//Check filter value type
if (!is_string($filterValue) && !is_int($filterValue)) {
throw new IncorrectParametersException(sprintf(
Expand All @@ -369,8 +370,8 @@ public static function parseFromRequest(

//Use filterValidator for idAttribute if set else use intval to parse filtered values
//$function = (
// !empty($filterValidationModel) && isset($filterValidationModel->properties->{$idAttribute})
// ? [$filterValidationModel->properties->{$idAttribute}, 'parse']
// !empty($filterValidator) && isset($filterValidator->properties->{$idAttribute})
// ? [$filterValidator->properties->{$idAttribute}, 'parse']
// : 'intval'
//);

Expand All @@ -385,7 +386,7 @@ public static function parseFromRequest(
);

$filterPrimary = $values;
} elseif ($model::relationshipExists($filterKey)) { //Filter relationship data
} elseif ($model->issetRelationship($filterKey)) { //Filter relationship data

//Check filter value type
if (!is_string($filterValue) && !is_int($filterValue)) {
Expand Down Expand Up @@ -460,16 +461,16 @@ public static function merge(Filter $first = null, Filter $second = null) {

return new Filter(
array_merge(
$first->primary,
$second->primary
$first->getPrimary(),
$second->getPrimary()
),
(object) array_merge_recursive(
(array) $first->relationships,
(array) $second->relationships
(array) $first->getRelationships(),
(array) $second->getRelationships()
),
array_merge(
$first->attributes,
$second->attributes
$first->getAttributes(),
$second->getAttributes()
)
);
}
Expand All @@ -492,25 +493,25 @@ public function __get($name)
}

/**
* @return \string[]
* @return string[]
*/
public function getPrimary()
public function getPrimary() : array
{
return $this->primary;
}

/**
* @return object
* @return \stdClass
*/
public function getRelationships()
public function getRelationships() : \stdClass
{
return $this->relationships;
}

/**
* @return FilterAttribute[]|FilterJSONAttribute[]
* @return (FilterAttribute|FilterJSONAttribute)[]
*/
public function getAttributes()
public function getAttributes() : array
{
return $this->attributes;
}
Expand Down
11 changes: 4 additions & 7 deletions src/InternalModel.php
Original file line number Diff line number Diff line change
Expand Up @@ -19,6 +19,7 @@
use Phramework\JSONAPI\DataSource\DatabaseDataSource;
use Phramework\JSONAPI\Model\DataSource;
use Phramework\JSONAPI\Model\Directives;
use Phramework\JSONAPI\Model\Relationships;
use Phramework\JSONAPI\Model\Settings;
use Phramework\Validate\ObjectValidator;

Expand All @@ -40,6 +41,7 @@ class InternalModel
use Directives;
use Settings;
use DataSource;
use Relationships;

/**
* @var string
Expand All @@ -51,11 +53,6 @@ class InternalModel
*/
protected $idAttribute = 'id';

/**
* @var \stdClass
*/
protected $relationships;

/**
* @var \stdClass
*/
Expand Down Expand Up @@ -83,11 +80,11 @@ public function __construct($resourceType)
$this->filterableAttributes = new \stdClass();

$this->settings = new \stdClass();

$model = $this; //alias

$this->prepareRecords = function (array &$records) {

};

$dataSource = $this->dataSource = new DatabaseDataSource(
Expand Down
Loading

0 comments on commit 014498c

Please sign in to comment.