Skip to content

Commit d628395

Browse files
committed
wip
1 parent 803dc0b commit d628395

13 files changed

+145
-68
lines changed

docs/stategies.md

Whitespace-only changes.

src/FilterBuilder.php

Lines changed: 35 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -5,14 +5,18 @@
55
use Illuminate\Database\Eloquent\Builder;
66
use Illuminate\Database\Eloquent\Model;
77
use Illuminate\Http\Request;
8+
use Illuminate\Pagination\LengthAwarePaginator;
89
use Myerscode\Laravel\QueryStrategies\Exceptions\BuilderNotFoundException;
910
use Myerscode\Laravel\QueryStrategies\Exceptions\BuilderNotSetException;
1011
use Myerscode\Laravel\QueryStrategies\Exceptions\FilterStrategyNotFoundException;
1112
use Myerscode\Laravel\QueryStrategies\Exceptions\InvalidStrategyException;
13+
use Myerscode\Laravel\QueryStrategies\Strategies\DefaultModelStrategy;
14+
use Myerscode\Laravel\QueryStrategies\Strategies\StrategyInterface;
1215

1316
class FilterBuilder
1417
{
1518

19+
private ?Model $model = null;
1620
private ?Builder $builder = null;
1721

1822

@@ -32,10 +36,12 @@ private function setBuilder($builderOrModel): void
3236
if (empty($builderOrModel)) {
3337
throw new BuilderNotSetException();
3438
}
39+
dd("$builderOrModel instanceof Model");
3540

3641
if ($builderOrModel instanceof Builder) {
3742
$this->builder = $builderOrModel;
3843
} elseif ($builderOrModel instanceof Model) {
44+
$this->model = $builderOrModel;
3945
$this->builder = $builderOrModel->newQuery();
4046
} elseif (is_string($builderOrModel) && class_exists($builderOrModel) && ($model = app($builderOrModel)) instanceof Model) {
4147
$this->builder = $model->query();
@@ -66,12 +72,14 @@ public function filter($builderOrModel): FilterBuilder
6672
/**
6773
* Apply a possible strategy by name or a given class
6874
*
69-
* @param $possibleStrategy
75+
* @param string|StrategyInterface|null $possibleStrategy
76+
*
77+
* @return Filter
78+
* @throws BuilderNotSetException
7079
* @throws FilterStrategyNotFoundException
7180
* @throws InvalidStrategyException
72-
* @throws BuilderNotSetException
7381
*/
74-
public function with($possibleStrategy): Filter
82+
public function with(string|StrategyInterface|array $possibleStrategy): Filter
7583
{
7684
if (!$this->builder instanceof Builder) {
7785
throw new BuilderNotSetException();
@@ -81,6 +89,30 @@ public function with($possibleStrategy): Filter
8189
return new Filter($this->builder, $strategy, $this->request->query->all(), $this->config());
8290
}
8391

92+
protected function hasFilterTrait(): bool
93+
{
94+
$usedTraits = class_uses($this->model);
95+
96+
return $usedTraits && in_array(IsFilterableTrait::class, $usedTraits);
97+
}
98+
99+
/**
100+
* @throws BuilderNotSetException
101+
* @throws FilterStrategyNotFoundException
102+
* @throws InvalidStrategyException
103+
*/
104+
public function results(string|StrategyInterface|array|null $possibleStrategy = null): LengthAwarePaginator
105+
{
106+
dd( ($this->model instanceof Model) );
107+
dd($this->model->strategyConfig);
108+
109+
if (is_null($possibleStrategy) && ($this->model instanceof Model) && isset($this->model->strategyConfig)) {
110+
$possibleStrategy = DefaultModelStrategy::fromConfig($this->model->strategyConfig);
111+
}
112+
113+
return $this->with($possibleStrategy)->apply();
114+
}
115+
84116
/**
85117
* The config the will be built eiyh
86118
* @return array{order: mixed, sort: mixed, limit: mixed, page: mixed, with: mixed}
Lines changed: 19 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,19 @@
1+
<?php
2+
3+
namespace Myerscode\Laravel\QueryStrategies\Strategies;
4+
5+
use Illuminate\Database\Eloquent\Model;
6+
7+
class DefaultModelStrategy extends Strategy
8+
{
9+
10+
public function __construct(protected array $parameters)
11+
{
12+
parent::__construct();
13+
}
14+
15+
public static function fromConfig(array $config): DefaultModelStrategy
16+
{
17+
return new self($config);
18+
}
19+
}

src/Strategies/Strategy.php

Lines changed: 6 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -23,7 +23,7 @@ class Strategy implements StrategyInterface
2323
*
2424
* @var []
2525
*/
26-
protected $config = [
26+
protected array $config = [
2727
//
2828
];
2929

@@ -32,7 +32,7 @@ class Strategy implements StrategyInterface
3232
*
3333
* @var Parameter[]
3434
*/
35-
protected $parameters = [
35+
protected array $parameters = [
3636
//
3737
];
3838

@@ -41,7 +41,7 @@ class Strategy implements StrategyInterface
4141
*
4242
* @var array
4343
*/
44-
protected $defaultMethods = [
44+
protected array $defaultMethods = [
4545
BeginsWithClause::class => ['beginsWith', '*%'],
4646
ContainsClause::class => ['contains', '%%'],
4747
EndsWithClause::class => ['endsWith', '%*'],
@@ -61,21 +61,21 @@ class Strategy implements StrategyInterface
6161
*
6262
* @var int
6363
*/
64-
protected $limitTo = 50;
64+
protected int $limitTo = 50;
6565

6666
/**
6767
* Maximum number of records a api response can have
6868
*
6969
* @var int
7070
*/
71-
protected $maxLimit = 150;
71+
protected int $maxLimit = 150;
7272

7373
/**
7474
* The model which to apply this strategy to
7575
*
7676
* @var []
7777
*/
78-
protected $canOrderBy = [
78+
protected array $canOrderBy = [
7979
'id',
8080
];
8181

src/StrategyManager.php

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

33
namespace Myerscode\Laravel\QueryStrategies;
44

5+
use Illuminate\Database\Eloquent\Model;
56
use Myerscode\Laravel\QueryStrategies\Exceptions\FilterStrategyNotFoundException;
67
use Myerscode\Laravel\QueryStrategies\Exceptions\InvalidStrategyException;
78
use Myerscode\Laravel\QueryStrategies\Strategies\StrategyInterface;
@@ -14,11 +15,13 @@ class StrategyManager
1415
private array $cache = [];
1516

1617
/**
17-
* @param $possibleStrategy
18+
* @param string|StrategyInterface|Model $possibleStrategy
19+
*
20+
* @return StrategyInterface
1821
* @throws FilterStrategyNotFoundException
1922
* @throws InvalidStrategyException
2023
*/
21-
public function findStrategy($possibleStrategy): StrategyInterface
24+
public function findStrategy(string|StrategyInterface|Model $possibleStrategy): StrategyInterface
2225
{
2326
$possibleStrategyName = is_object($possibleStrategy) ? $possibleStrategy::class : $possibleStrategy;
2427

@@ -39,6 +42,11 @@ public function findStrategy($possibleStrategy): StrategyInterface
3942
return $this->cache[$cacheName];
4043
}
4144

45+
public function buildDefaultStrategy(string $strategy): StrategyInterface
46+
{
47+
48+
}
49+
4250
/**
4351
* Create a safe slug for caching the strategy
4452
*

tests/FilterBuilderTest.php

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -11,6 +11,7 @@
1111
use Myerscode\Laravel\QueryStrategies\FilterBuilder;
1212
use Myerscode\Laravel\QueryStrategies\StrategyManager;
1313
use Tests\Support\Models\Item;
14+
use Tests\Support\Models\Record;
1415
use Tests\Support\Models\Register;
1516
use Tests\Support\Models\TodoList;
1617
use Tests\Support\Strategies\ComplexConfigQueryStrategy;
@@ -80,6 +81,11 @@ public function testCanFindBuilderFromBuilder(): void
8081
$this->assertInstanceOf(Builder::class, $filterBuilder->builder());
8182
}
8283

84+
public function testCanFilterUsingModelConfigForStrategy(): void
85+
{
86+
filter(Record::class)->results();
87+
}
88+
8389
public function testFilterWithReturnsInstanceOfFilter(): void
8490
{
8591
$filterBuilder = new FilterBuilder( new Request(), new StrategyManager());

0 commit comments

Comments
 (0)