Skip to content

Commit bc82057

Browse files
authored
Merge pull request #100 from ThanhSonITNIC/master
Optimize filters
2 parents 3e7667e + 94725d8 commit bc82057

File tree

4 files changed

+62
-33
lines changed

4 files changed

+62
-33
lines changed

config/rest.php

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,6 @@
11
<?php
22

33
return [
4-
54
/*
65
|--------------------------------------------------------------------------
76
| Rest Gates

src/Concerns/Resource/ConfiguresRestParameters.php

Lines changed: 15 additions & 31 deletions
Original file line numberDiff line numberDiff line change
@@ -2,7 +2,10 @@
22

33
namespace Lomkit\Rest\Concerns\Resource;
44

5+
use Illuminate\Support\Facades\App;
6+
use Illuminate\Support\Str;
57
use Lomkit\Rest\Http\Requests\RestRequest;
8+
use Lomkit\Rest\Relations\Relation;
69

710
trait ConfiguresRestParameters
811
{
@@ -38,45 +41,26 @@ public function getFields(\Lomkit\Rest\Http\Requests\RestRequest $request): arra
3841
}
3942

4043
/**
41-
* Get nested fields by prefixing them with a given prefix.
44+
* Verify the field is correct including nested relations.
4245
*
43-
* @param RestRequest $request
44-
* @param string $prefix
45-
* @param array $loadedRelations
46+
* @param string $field
4647
*
47-
* @return array
48+
* @return bool
4849
*/
49-
public function getNestedFields(RestRequest $request, string $prefix = '', array $loadedRelations = [])
50+
public function isNestedField(string $field, Relation $relation = null)
5051
{
51-
if ($prefix !== '') {
52-
$prefix = $prefix.'.';
53-
}
52+
if (Str::contains($field, '.')) {
53+
// In case we are on a pivot we look for the relation pivot fields
54+
if (Str::before($field, '.') === 'pivot') {
55+
return method_exists($relation, 'getPivotFields') && in_array(Str::after($field, '.'), $relation->getPivotFields());
56+
}
5457

55-
$fields = array_map(
56-
function ($field) use ($prefix) {
57-
return $prefix.$field;
58-
},
59-
$this->getFields($request)
60-
);
58+
$fieldRelation = $this->relation(Str::before($field, '.'));
6159

62-
foreach (
63-
collect($this->getRelations($request))
64-
->filter(function ($relation) use ($loadedRelations) {
65-
return !in_array($relation->relation, $loadedRelations);
66-
})
67-
as $relation
68-
) {
69-
$loadedRelations[] = $relation->relation;
70-
array_push(
71-
$fields,
72-
...$relation->resource()->getNestedFields($request, $prefix.$relation->relation, $loadedRelations),
73-
// We push the pivot fields if they exists
74-
...collect(method_exists($relation, 'getPivotFields') ? $relation->getPivotFields() : [])
75-
->map(function ($field) use ($relation, $prefix) { return $prefix.$relation->relation.'.pivot.'.$field; })
76-
);
60+
return $fieldRelation->resource()->isNestedField(Str::after($field, '.'), $fieldRelation);
7761
}
7862

79-
return $fields;
63+
return in_array($field, $this->getFields(App::make(RestRequest::class)));
8064
}
8165

8266
/**

src/Rules/IsNestedField.php

Lines changed: 46 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,46 @@
1+
<?php
2+
3+
namespace Lomkit\Rest\Rules;
4+
5+
use Closure;
6+
use Illuminate\Contracts\Validation\ValidationRule;
7+
use Illuminate\Validation\Validator;
8+
use Lomkit\Rest\Http\Requests\RestRequest;
9+
use Lomkit\Rest\Http\Resource;
10+
11+
class IsNestedField implements ValidationRule
12+
{
13+
/**
14+
* The validator instance.
15+
*
16+
* @var \Illuminate\Validation\Validator
17+
*/
18+
protected $validator;
19+
20+
/**
21+
* The resource instance.
22+
*
23+
* @var resource
24+
*/
25+
protected Resource $resource;
26+
27+
/**
28+
* The request instance.
29+
*
30+
* @var RestRequest
31+
*/
32+
protected RestRequest $request;
33+
34+
public function __construct(\Lomkit\Rest\Http\Resource $resource, RestRequest $request)
35+
{
36+
$this->resource = $resource;
37+
$this->request = $request;
38+
}
39+
40+
public function validate(string $attribute, mixed $value, Closure $fail): void
41+
{
42+
if (!$this->resource->isNestedField($value)) {
43+
$fail('The '.$attribute.' field is not valid.');
44+
}
45+
}
46+
}

src/Rules/SearchRules.php

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -111,7 +111,7 @@ public function filtersRules(\Lomkit\Rest\Http\Resource $resource, string $prefi
111111
$rules = array_merge(
112112
[
113113
$prefix.'.*.field' => [
114-
Rule::in($resource->getNestedFields($this->request)),
114+
new IsNestedField($resource, $this->request),
115115
"required_without:$prefix.*.nested",
116116
'string',
117117
],

0 commit comments

Comments
 (0)