-
Notifications
You must be signed in to change notification settings - Fork 6
/
Copy pathJsonQuery.php
128 lines (111 loc) · 3.42 KB
/
JsonQuery.php
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
<?php
declare(strict_types=1);
namespace Asseco\JsonQueryBuilder;
use Asseco\JsonQueryBuilder\Config\ModelConfig;
use Asseco\JsonQueryBuilder\Config\RequestParametersConfig;
use Asseco\JsonQueryBuilder\Exceptions\JsonQueryBuilderException;
use Asseco\JsonQueryBuilder\RequestParameters\AbstractParameter;
use Illuminate\Database\Eloquent\Builder;
use Illuminate\Support\Arr;
class JsonQuery
{
protected Builder $builder;
protected array $input;
protected ModelConfig $modelConfig;
protected array $registeredParameters;
/**
* JsonQuery constructor.
*
* @param Builder $builder
* @param array $input
*
* @throws JsonQueryBuilderException
*/
public function __construct(Builder $builder, array $input)
{
$this->builder = $builder;
$this->input = $input;
$this->forbidForExistingModels();
$this->modelConfig = new ModelConfig($this->builder->getModel());
$this->registeredParameters = (new RequestParametersConfig())->registered;
}
/**
* @throws JsonQueryBuilderException
*/
protected function forbidForExistingModels(): void
{
if ($this->builder->getModel()->exists) {
throw new JsonQueryBuilderException('Searching is not allowed on already loaded models.');
}
}
/**
* Perform the search.
*
* @throws Exceptions\JsonQueryBuilderException
*/
public function search(): void
{
$this->appendParameterQueries();
$this->appendConfigQueries();
}
/**
* Append all queries from registered parameters.
*
* @throws Exceptions\JsonQueryBuilderException
*/
protected function appendParameterQueries(): void
{
foreach ($this->registeredParameters as $requestParameter) {
if (!$this->parameterExists($requestParameter)) {
// TODO: append config query?
continue;
}
$this->instantiateRequestParameter($requestParameter)
->run();
}
}
/**
* Append all queries from config.
*/
protected function appendConfigQueries(): void
{
// TODO: implement...or not
}
/**
* @param string $requestParameter
* @return bool
*/
protected function parameterExists(string $requestParameter): bool
{
/**
* @var AbstractParameter $requestParameter
*/
return Arr::has($this->input, $requestParameter::getParameterName());
}
/**
* @param $requestParameter
* @return AbstractParameter
*
* @throws JsonQueryBuilderException
*/
protected function instantiateRequestParameter(string $requestParameter): AbstractParameter
{
if (!is_subclass_of($requestParameter, AbstractParameter::class)) {
throw new JsonQueryBuilderException("$requestParameter must extend " . AbstractParameter::class);
}
$input = $this->wrapInput($requestParameter::getParameterName());
return new $requestParameter($input, $this->builder, $this->modelConfig);
}
/**
* Get input for given parameter name and wrap it as an array if it's not already an array.
*
* @param string $parameterName
* @return array
*/
protected function wrapInput(string $parameterName): array
{
return Arr::wrap(
Arr::get($this->input, $parameterName)
);
}
}