Skip to content

Commit 74b2cf5

Browse files
authored
Feature/Add Paginator Support. (#7)
1 parent 1182d34 commit 74b2cf5

File tree

4 files changed

+32
-14
lines changed

4 files changed

+32
-14
lines changed

src/Infrastructure/Laravel/Persistence/Contracts/IlluminateCriteriaParser.php

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -6,6 +6,7 @@
66

77
use ComplexHeart\Domain\Criteria\Criteria;
88
use Illuminate\Contracts\Database\Query\Builder;
9+
use Illuminate\Contracts\Pagination\LengthAwarePaginator;
910

1011
/**
1112
* Interface IlluminateCriteriaParser
@@ -20,7 +21,7 @@ interface IlluminateCriteriaParser
2021
*
2122
* @param Builder $builder
2223
* @param Criteria $criteria
23-
* @return Builder
24+
* @return Builder|LengthAwarePaginator
2425
*/
25-
public function applyCriteria(Builder $builder, Criteria $criteria): Builder;
26+
public function applyCriteria(Builder $builder, Criteria $criteria): Builder|LengthAwarePaginator;
2627
}

src/Infrastructure/Laravel/Persistence/EloquentCriteriaParser.php

Lines changed: 17 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -12,22 +12,25 @@
1212
use ComplexHeart\Domain\Criteria\Page;
1313
use ComplexHeart\Infrastructure\Laravel\Persistence\Contracts\IlluminateCriteriaParser;
1414
use Illuminate\Contracts\Database\Query\Builder;
15+
use Illuminate\Contracts\Pagination\LengthAwarePaginator;
1516

1617
/**
1718
* Class EloquentCriteriaParser
1819
*
1920
* @author Unay Santisteban <[email protected]>
2021
* @package ComplexHeart\Infrastructure\Laravel\Persistence
2122
*/
22-
class EloquentCriteriaParser implements IlluminateCriteriaParser
23+
readonly class EloquentCriteriaParser implements IlluminateCriteriaParser
2324
{
2425
/**
2526
* DefaultCriteriaParser constructor.
2627
*
2728
* @param array<string, string> $filterAttributes
2829
*/
29-
public function __construct(private readonly array $filterAttributes = [])
30-
{
30+
public function __construct(
31+
private array $filterAttributes = [],
32+
private bool $paginator = false
33+
) {
3134
}
3235

3336
/**
@@ -63,9 +66,9 @@ private function filterAttribute(string $fieldAttribute): string
6366
*
6467
* @param Builder $builder
6568
* @param Criteria $criteria
66-
* @return Builder
69+
* @return Builder|LengthAwarePaginator
6770
*/
68-
public function applyCriteria(Builder $builder, Criteria $criteria): Builder
71+
public function applyCriteria(Builder $builder, Criteria $criteria): Builder|LengthAwarePaginator
6972
{
7073
$builder = $this->applyFilterGroups($builder, $criteria->groups());
7174
$builder = $this->applyOrdering($builder, $criteria->order());
@@ -144,10 +147,6 @@ private function applyFilter(Builder $builder, Filter $filter): Builder
144147

145148
/**
146149
* Apply the ordering settings into the given QueryBuilder.
147-
*
148-
* @param Builder $builder
149-
* @param Order $ordering
150-
* @return Builder
151150
*/
152151
private function applyOrdering(Builder $builder, Order $ordering): Builder
153152
{
@@ -167,11 +166,18 @@ private function applyOrdering(Builder $builder, Order $ordering): Builder
167166
*
168167
* @param Builder $builder
169168
* @param Page $page
170-
* @return Builder
169+
* @return Builder|LengthAwarePaginator
171170
*/
172-
private function applyPage(Builder $builder, Page $page): Builder
171+
private function applyPage(Builder $builder, Page $page): Builder|LengthAwarePaginator
173172
{
174173
if ($page->limit() > 0) {
174+
if ($this->paginator) {
175+
return $builder->paginate(
176+
perPage: $page->limit(),
177+
page: ($page->offset() / $page->limit()) + 1,
178+
);
179+
}
180+
175181
$builder = $builder->limit($page->limit());
176182
$builder = $builder->offset($page->offset());
177183
}

tests/Integration/EloquentCriteriaParserTest.php

Lines changed: 11 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -6,6 +6,7 @@
66
use ComplexHeart\Domain\Criteria\FilterGroup;
77
use ComplexHeart\Infrastructure\Laravel\Persistence\EloquentCriteriaParser;
88
use ComplexHeart\Tests\Fixtures\Infrastructure\Persistence\Laravel\Sources\UserDatabaseSource;
9+
use Illuminate\Pagination\LengthAwarePaginator;
910

1011
beforeEach(function () {
1112
$this->createApplication();
@@ -252,4 +253,14 @@
252253

253254
expect($builder->toRawSql())
254255
->toBe('select * from "users"');
256+
});
257+
258+
test('EloquentCriteriaParser should return a LengthAwarePaginator object if option is true.', function () {
259+
$parser = new EloquentCriteriaParser([], true);
260+
261+
$criteria = Criteria::default()
262+
->withPageNumber(2, 25);
263+
$page = $parser->applyCriteria(UserDatabaseSource::query(), $criteria);
264+
265+
expect($page)->toBeInstanceOf(LengthAwarePaginator::class);
255266
});

tests/Integration/EloquentRepositoryWithCriteriaParserTest.php

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -40,7 +40,7 @@
4040
->withFilterGroup(FilterGroup::create()
4141
->addFilterEqual('name', 'Vincent'));
4242

43-
$repo = new UsersEloquentRepository();
43+
$repo = new UsersEloquentRepository();
4444
$users = $repo->match($criteria);
4545

4646
expect($users)->toHaveCount(1);

0 commit comments

Comments
 (0)