From bbfd7c02b4bb6ca7aeb75c23526c312a8459e58b Mon Sep 17 00:00:00 2001 From: Dave Mc Nicoll Date: Tue, 4 Jun 2024 13:33:48 +0000 Subject: [PATCH] - WIP on SearchAttributes supporting Request's attributes --- src/Common/EntityResolver.php | 2 +- .../Attribute/PropertyValueSource.php | 14 ++++++ src/SearchRequest/Attribute/SearchLike.php | 1 + .../Attribute/SearchParameter.php | 12 ++++- src/SearchRequest/Attribute/SearchWhere.php | 1 + .../SearchRequestFromRequestTrait.php | 49 ++++++++++++++++--- 6 files changed, 70 insertions(+), 9 deletions(-) create mode 100644 src/SearchRequest/Attribute/PropertyValueSource.php diff --git a/src/Common/EntityResolver.php b/src/Common/EntityResolver.php index 2dfb063..91cf874 100644 --- a/src/Common/EntityResolver.php +++ b/src/Common/EntityResolver.php @@ -237,7 +237,7 @@ class EntityResolver { public function getAttributeImplementing(string $interface) : null|object { - foreach (array_reverse($this->reflectedClass->getAttributes(true)) as $item) { + foreach ($this->reflectedClass->getAttributes(true) as $item) { if ($item->object instanceof $interface) { return $item->object; } diff --git a/src/SearchRequest/Attribute/PropertyValueSource.php b/src/SearchRequest/Attribute/PropertyValueSource.php new file mode 100644 index 0000000..d3f2bdf --- /dev/null +++ b/src/SearchRequest/Attribute/PropertyValueSource.php @@ -0,0 +1,14 @@ +source) ? $this->source : [ $this->source ]; + } } \ No newline at end of file diff --git a/src/SearchRequest/Attribute/SearchWhere.php b/src/SearchRequest/Attribute/SearchWhere.php index a777c11..b14a83e 100644 --- a/src/SearchRequest/Attribute/SearchWhere.php +++ b/src/SearchRequest/Attribute/SearchWhere.php @@ -13,5 +13,6 @@ class SearchWhere extends SearchParameter public bool $toggle = false, public SearchMethodEnum $method = SearchMethodEnum::Where, public string $description = "", + public PropertyValueSource|array $source = PropertyValueSource::QueryParams, ) {} } \ No newline at end of file diff --git a/src/SearchRequest/SearchRequestFromRequestTrait.php b/src/SearchRequest/SearchRequestFromRequestTrait.php index 3d67862..457f324 100644 --- a/src/SearchRequest/SearchRequestFromRequestTrait.php +++ b/src/SearchRequest/SearchRequestFromRequestTrait.php @@ -2,9 +2,16 @@ namespace Ulmus\SearchRequest; +use Psr\Http\Message\RequestInterface; use Psr\Http\Message\ServerRequestInterface; -use Ulmus\SearchRequest\Attribute\{ SearchParameter, SearchWhere, SearchLike, SearchOrderBy, SearchGroupBy, SearchRequestParameter, }; +use Ulmus\SearchRequest\Attribute\{PropertyValueSource, + SearchParameter, + SearchWhere, + SearchLike, + SearchOrderBy, + SearchGroupBy, + SearchRequestParameter}; trait SearchRequestFromRequestTrait { @@ -30,15 +37,12 @@ trait SearchRequestFromRequestTrait foreach($classReflection->getProperties() as $property) { $attributeList = $property->getAttributes(); - $attributeReflection = array_filter($attributeList, fn($e) => $e->newInstance() instanceof Attribute\SearchParameter); if ($attributeReflection) { $attribute = $attributeReflection[0]->newInstance(); - $propertyName = $property->getName(); $fieldName = $attribute->field ?? $propertyName; - $queryParamName = $attribute->parameter ?? $propertyName; # Field could be defined for another entity class if (is_array($fieldName)) { @@ -55,11 +59,15 @@ trait SearchRequestFromRequestTrait $field = $fieldName; } - $value = $queryParams->offsetExists($queryParamName) ? $this->transformValue($attributeList, $queryParams[$queryParamName]) : null; + $value = $this->getValueFromSource($request, $propertyName, $attribute); + + if ($value !== null) { + $value = $this->transformValue($attributeList, $value); + } if ($attribute instanceof SearchWhere || $attribute instanceof SearchLike) { if ($attribute->toggle) { - $this->$propertyName = $queryParams->offsetExists($queryParamName); + $this->$propertyName = ! empty($value); } elseif ($value !== null) { $this->$propertyName = $value; @@ -83,6 +91,35 @@ trait SearchRequestFromRequestTrait return $this; } + protected function getValueFromSource(RequestInterface $request, string $propertyName, SearchParameter $attribute) : mixed + { + $queryParamName = $attribute->parameter ?? $propertyName; + + foreach($attribute->getSources() as $source) { + switch($source) { + case PropertyValueSource::QueryParams: + $queryParams = new \ArrayObject(array_filter($request->getQueryParams(), function($i) { return ! is_null($i) && $i !== ""; })); + + if ($queryParams->offsetExists($queryParamName)) { + return $queryParams[$queryParamName]; + } + + break; + + case PropertyValueSource::RequestAttribute: + $fromAttribute = $request->getAttribute($queryParamName, null); + + if ($fromAttribute !== null) { + return $fromAttribute; + } + + break; + } + } + + return null; + } + protected function transformValue(array $attributeList, mixed $value, ) : mixed { $transforms = array_map(function($e) {