Skip to content

Commit 0db1d7d

Browse files
committed
feat: add validation to filters and page paginator
1 parent e5a6490 commit 0db1d7d

File tree

5 files changed

+37
-4
lines changed

5 files changed

+37
-4
lines changed

src/Filters/Scope.php

+2
Original file line numberDiff line numberDiff line change
@@ -15,11 +15,13 @@
1515
use LaravelJsonApi\Eloquent\Contracts\Filter;
1616
use LaravelJsonApi\Eloquent\Filters\Concerns\DeserializesValue;
1717
use LaravelJsonApi\Eloquent\Filters\Concerns\IsSingular;
18+
use LaravelJsonApi\Validation\Filters\ValidatedWithRules;
1819

1920
class Scope implements Filter
2021
{
2122
use DeserializesValue;
2223
use IsSingular;
24+
use ValidatedWithRules;
2325

2426
/**
2527
* @var string

src/Filters/WhereIdIn.php

+11
Original file line numberDiff line numberDiff line change
@@ -11,17 +11,21 @@
1111

1212
namespace LaravelJsonApi\Eloquent\Filters;
1313

14+
use Closure;
1415
use Illuminate\Database\Eloquent\Model;
1516
use LaravelJsonApi\Contracts\Schema\ID;
1617
use LaravelJsonApi\Contracts\Schema\Schema;
1718
use LaravelJsonApi\Core\Schema\IdParser;
1819
use LaravelJsonApi\Eloquent\Contracts\Filter;
1920
use LaravelJsonApi\Eloquent\Filters\Concerns\HasDelimiter;
2021
use LaravelJsonApi\Eloquent\Schema as EloquentSchema;
22+
use LaravelJsonApi\Validation\Filters\ValidatedWithRules;
23+
use LaravelJsonApi\Validation\Rules\ListOfIds;
2124

2225
class WhereIdIn implements Filter
2326
{
2427
use HasDelimiter;
28+
use ValidatedWithRules;
2529

2630
/**
2731
* @var ID
@@ -143,4 +147,11 @@ protected function deserialize($value): array
143147
);
144148
}
145149

150+
/**
151+
* @return array<int, mixed>
152+
*/
153+
protected function defaultRules(): array
154+
{
155+
return [new ListOfIds($this->field, $this->delimiter)];
156+
}
146157
}

src/Filters/WhereIn.php

+2-1
Original file line numberDiff line numberDiff line change
@@ -16,12 +16,14 @@
1616
use LaravelJsonApi\Eloquent\Filters\Concerns\DeserializesValue;
1717
use LaravelJsonApi\Eloquent\Filters\Concerns\HasColumn;
1818
use LaravelJsonApi\Eloquent\Filters\Concerns\HasDelimiter;
19+
use LaravelJsonApi\Validation\Filters\ValidatedWithRules;
1920

2021
class WhereIn implements Filter
2122
{
2223
use DeserializesValue;
2324
use HasColumn;
2425
use HasDelimiter;
26+
use ValidatedWithRules;
2527

2628
/**
2729
* @var string
@@ -103,5 +105,4 @@ private function guessColumn(): string
103105
Str::singular($this->name)
104106
);
105107
}
106-
107108
}

src/Filters/WhereNotIn.php

-1
Original file line numberDiff line numberDiff line change
@@ -13,7 +13,6 @@
1313

1414
class WhereNotIn extends WhereIn
1515
{
16-
1716
/**
1817
* @inheritDoc
1918
*/

src/Pagination/PagePagination.php

+22-2
Original file line numberDiff line numberDiff line change
@@ -20,12 +20,14 @@
2020
use LaravelJsonApi\Core\Pagination\Concerns\HasPageNumbers;
2121
use LaravelJsonApi\Core\Pagination\Page;
2222
use LaravelJsonApi\Eloquent\Contracts\Paginator;
23+
use LaravelJsonApi\Validation\Pagination\IsValidated;
24+
use LaravelJsonApi\Validation\Pagination\Validated;
2325

24-
class PagePagination implements Paginator
26+
class PagePagination implements Paginator, IsValidated
2527
{
26-
2728
use HasPageMeta;
2829
use HasPageNumbers;
30+
use Validated;
2931

3032
/**
3133
* @var array|null
@@ -171,6 +173,24 @@ protected function isSimplePagination(): bool
171173
return (bool) $this->simplePagination;
172174
}
173175

176+
/**
177+
* @return array
178+
*/
179+
protected function defaultRules(): array
180+
{
181+
return [
182+
$this->pageKey => array_filter([
183+
$this->required ? 'required' : null,
184+
'integer',
185+
'min:1',
186+
]),
187+
$this->perPageKey => [
188+
'integer',
189+
$this->maxPerPage > 0 ? 'between:1,' . $this->maxPerPage : 'min:1',
190+
],
191+
];
192+
}
193+
174194
/**
175195
* @param Builder|Relation $query
176196
* @return bool

0 commit comments

Comments
 (0)