GitHub Access Token became invalid

It seems like the GitHub access token used for retrieving details about this repository from GitHub became invalid. This might prevent certain types of inspections from being run (in particular, everything related to pull requests).
Please ask an admin of your repository to re-new the access token on this website.
Passed
Push — feature/get_route_params ( e49c41...fd8772 )
by Alessandro
07:03
created

BaseRepository   A

Complexity

Total Complexity 35

Size/Duplication

Total Lines 320
Duplicated Lines 0 %

Test Coverage

Coverage 0%

Importance

Changes 0
Metric Value
wmc 35
dl 0
loc 320
ccs 0
cts 186
cp 0
rs 9
c 0
b 0
f 0

23 Methods

Rating   Name   Duplication   Size   Complexity  
A initFromQueryBuilderOptions() 0 14 1
A setQueryOptions() 0 3 1
A useResultCache() 0 3 1
B setQueryOptionsFromRequestWithCustomFilter() 0 45 4
A findAllPaginated() 0 8 1
B setQueryOptionsFromRequestWithCustomOrFilter() 0 45 4
A getRequest() 0 3 1
A setRouteName() 0 4 1
A getQueryBuilderFactory() 0 5 1
A setRequestWithOrFilter() 0 3 1
B setQueryOptionsFromRequest() 0 55 5
A setRequest() 0 3 1
A setRequestWithFilter() 0 3 1
A __construct() 0 12 1
A getEntityAlias() 0 4 1
A getCurrentEntityAlias() 0 3 1
A setCurrentEntityAlias() 0 3 1
A paginateResults() 0 22 3
A relationship() 0 3 1
A customQueryStringValues() 0 3 1
A getQueryBuilderFactoryWithoutInitialization() 0 3 1
A getEmbeddedFields() 0 3 1
A setEmbeddedFields() 0 3 1
1
<?php
2
3
namespace Mado\QueryBundle\Repositories;
4
5
use Doctrine\ORM\EntityRepository;
6
use Doctrine\ORM\QueryBuilder;
7
use Hateoas\Representation\Factory\PagerfantaFactory;
8
use Mado\QueryBundle\Queries\QueryBuilderFactory;
9
use Mado\QueryBundle\Queries\QueryBuilderOptions;
10
use Mado\QueryBundle\Services\Router;
11
use Pagerfanta\Adapter\DoctrineORMAdapter;
12
use Pagerfanta\Pagerfanta;
13
use Symfony\Component\HttpFoundation\Request;
14
15
class BaseRepository extends EntityRepository
16
{
17
    protected $fields;
18
19
    protected $request;
20
21
    protected $use_result_cache = false;
22
23
    protected $entityAlias;
24
25
    protected $route_name;
26
27
    protected $currentEntityAlias;
28
29
    protected $embeddedFields;
30
31
    protected $joins = [];
32
33
    protected $queryBuilderFactory;
34
35
    protected $queryOptions;
36
37
    public function __construct($manager, $class)
38
    {
39
        parent::__construct($manager, $class);
40
41
        $this->fields = array_keys($this->getClassMetadata()->fieldMappings);
42
43
        $entityName = explode('\\', strtolower($this->getEntityName()));
44
        $entityName = $entityName[count($entityName) - 1];
45
        $entityAlias = $entityName[0];
46
        $this->entityAlias = $entityAlias;
47
48
        $this->queryBuilderFactory = new QueryBuilderFactory($this->getEntityManager());
49
    }
50
51
    public function initFromQueryBuilderOptions(QueryBuilderOptions $options)
52
    {
53
        $this->queryBuilderFactory->createQueryBuilder($this->getEntityName(), $this->entityAlias);
54
55
        $fieldMappings = $this->getClassMetadata()->fieldMappings;
56
        $this->fields = array_keys($fieldMappings);
57
58
        $this->queryBuilderFactory->setFields($this->fields ?? []);
59
        $this->queryBuilderFactory->setAndFilters($options->getAndFilters());
60
        $this->queryBuilderFactory->setOrFilters($options->getOrFilters());
61
        $this->queryBuilderFactory->setSorting($options->getSorting());
62
        $this->queryBuilderFactory->setRel($options->getRel());
63
        $this->queryBuilderFactory->setPrinting($options->getPrinting());
64
        $this->queryBuilderFactory->setSelect($options->getSelect());
65
    }
66
67
    public function getQueryBuilderFactory()
68
    {
69
        $this->initFromQueryBuilderOptions($this->queryOptions);
70
71
        return $this->queryBuilderFactory;
72
    }
73
74
    public function useResultCache($bool)
75
    {
76
        $this->use_result_cache = $bool;
77
    }
78
79
    public function setRequest(Request $request)
80
    {
81
        return $this->setQueryOptionsFromRequest($request);
82
    }
83
84
    public function setRequestWithFilter(Request $request, $filter)
85
    {
86
        return $this->setQueryOptionsFromRequestWithCustomFilter($request, $filter);
87
    }
88
89
    public function setRequestWithOrFilter(Request $request, $orFilter)
90
    {
91
        return $this->setQueryOptionsFromRequestWithCustomOrFilter($request, $orFilter);
92
    }
93
94
    public function setQueryOptions(QueryBuilderOptions $options)
95
    {
96
        $this->queryOptions = $options;
97
    }
98
99
    public function setQueryOptionsFromRequest(Request $request = null)
100
    {
101
        $requestAttributes = [];
102
        foreach ($request->attributes->all() as $attributeName => $attributeValue) {
103
            $requestAttributes[$attributeName] = $request->attributes->get(
104
                $attributeName,
105
                $attributeValue
106
            );
107
        }
108
109
        $filters     = $request->query->get('filtering', []);
110
        $orFilters   = $request->query->get('filtering_or', []);
111
        $sorting     = $request->query->get('sorting', []);
112
        $printing    = $request->query->get('printing', []);
113
        $rel         = $request->query->get('rel', '');
114
        $page        = $request->query->get('page', '');
115
        $select      = $request->query->get('select', $this->entityAlias);
116
        $filtering   = $request->query->get('filtering', '');
117
        $limit       = $request->query->get('limit', '');
118
119
        $filterOrCorrected = [];
120
121
        $count = 0;
122
        foreach ($orFilters as $key => $filter) {
123
            if (is_array($filter)) {
124
                foreach ($filter as $keyInternal => $internal) {
125
                    $filterOrCorrected[$keyInternal . '|' . $count] = $internal;
126
                    $count += 1;
127
                }
128
            } else {
129
                $filterOrCorrected[$key] = $filter;
130
            }
131
        }
132
133
        $requestProperties = [
134
            'filtering'   => $filtering,
135
            'orFiltering' => $filterOrCorrected,
136
            'limit'       => $limit,
137
            'page'        => $page,
138
            'filters'     => $filters,
139
            'orFilters'   => $filterOrCorrected,
140
            'sorting'     => $sorting,
141
            'rel'         => $rel,
142
            'printing'    => $printing,
143
            'select'      => $select,
144
        ];
145
146
        $options = array_merge(
147
            $requestAttributes,
148
            $requestProperties
149
        );
150
151
        $this->queryOptions = QueryBuilderOptions::fromArray($options);
152
153
        return $this;
154
    }
155
156
    public function setQueryOptionsFromRequestWithCustomFilter(Request $request = null, $filter)
157
    {
158
        $filters = $request->query->get('filtering', []);
159
        $orFilters = $request->query->get('filtering_or', []);
160
        $sorting = $request->query->get('sorting', []);
161
        $printing = $request->query->get('printing', []);
162
        $rel = $request->query->get('rel', '');
163
        $page = $request->query->get('page', '');
164
        $select = $request->query->get('select', $this->entityAlias);
165
        $filtering = $request->query->get('filtering', '');
166
        $limit = $request->query->get('limit', '');
167
168
        $filters = array_merge($filters, $filter);
169
170
        $filterOrCorrected = [];
171
172
        $count = 0;
173
        foreach ($orFilters as $key => $filterValue) {
174
            if (is_array($filterValue)) {
175
                foreach ($filterValue as $keyInternal => $internal) {
176
                    $filterOrCorrected[$keyInternal . '|' . $count] = $internal;
177
                    $count += 1;
178
                }
179
            } else {
180
                $filterOrCorrected[$key] = $filterValue;
181
            }
182
        }
183
184
        $this->queryOptions = QueryBuilderOptions::fromArray([
185
            '_route' => $request->attributes->get('_route'),
186
            '_route_params' => $request->attributes->get('_route_params'),
187
            'customer_id' => $request->attributes->get('customer_id'),
188
            'id' => $request->attributes->get('id'),
189
            'filtering' => $filtering,
190
            'limit' => $limit,
191
            'page' => $page,
192
            'filters' => $filters,
193
            'orFilters' => $filterOrCorrected,
194
            'sorting' => $sorting,
195
            'rel' => $rel,
196
            'printing' => $printing,
197
            'select' => $select,
198
        ]);
199
200
        return $this;
201
    }
202
203
    public function setQueryOptionsFromRequestWithCustomOrFilter(Request $request = null, $orFilter)
204
    {
205
        $filters = $request->query->get('filtering', []);
206
        $orFilters = $request->query->get('filtering_or', []);
207
        $sorting = $request->query->get('sorting', []);
208
        $printing = $request->query->get('printing', []);
209
        $rel = $request->query->get('rel', '');
210
        $page = $request->query->get('page', '');
211
        $select = $request->query->get('select', $this->entityAlias);
212
        $filtering = $request->query->get('filtering', '');
213
        $limit = $request->query->get('limit', '');
214
215
        $orFilters = array_merge($orFilters, $orFilter);
216
217
        $filterOrCorrected = [];
218
219
        $count = 0;
220
        foreach ($orFilters as $key => $filter) {
221
            if (is_array($filter)) {
222
                foreach ($filter as $keyInternal => $internal) {
223
                    $filterOrCorrected[$keyInternal . '|' . $count] = $internal;
224
                    $count += 1;
225
                }
226
            } else {
227
                $filterOrCorrected[$key] = $filter;
228
            }
229
        }
230
231
        $this->queryOptions = QueryBuilderOptions::fromArray([
232
            '_route' => $request->attributes->get('_route'),
233
            '_route_params' => $request->attributes->get('_route_params'),
234
            'customer_id' => $request->attributes->get('customer_id'),
235
            'id' => $request->attributes->get('id'),
236
            'filtering' => $filtering,
237
            'limit' => $limit,
238
            'page' => $page,
239
            'filters' => $filters,
240
            'orFilters' => $filterOrCorrected,
241
            'sorting' => $sorting,
242
            'rel' => $rel,
243
            'printing' => $printing,
244
            'select' => $select,
245
        ]);
246
247
        return $this;
248
    }
249
250
    public function getRequest()
251
    {
252
        return $this->request;
253
    }
254
255
    public function setRouteName($route_name = '')
256
    {
257
        $this->route_name = $route_name;
258
        return $this;
259
    }
260
261
    public function findAllPaginated()
262
    {
263
        $this->initFromQueryBuilderOptions($this->queryOptions);
264
265
        $this->queryBuilderFactory->filter();
266
        $this->queryBuilderFactory->sort();
267
268
        return $this->paginateResults($this->queryBuilderFactory->getQueryBuilder());
269
    }
270
271
    protected function paginateResults(QueryBuilder $queryBuilder) {
272
        $limit = $this->queryOptions->get('limit', 10);
273
        $page = $this->queryOptions->get('page', 1);
274
275
        $pagerAdapter = new DoctrineORMAdapter($queryBuilder);
276
277
        $query = $pagerAdapter->getQuery();
278
        if (isset($this->use_result_cache) and $this->use_result_cache) {
279
            $query->useResultCache(true, 600);
280
        }
281
282
        $pager = new Pagerfanta($pagerAdapter);
283
        $pager->setNormalizeOutOfRangePages(true);
284
        $pager->setMaxPerPage($limit);
285
        $pager->setCurrentPage($page);
286
287
        $pagerFactory = new PagerfantaFactory();
288
289
        $router = new Router();
290
        $router->createRouter($this->queryOptions, $this->route_name);
291
292
        return $pagerFactory->createRepresentation($pager, $router);
0 ignored issues
show
Bug introduced by
$router of type Mado\QueryBundle\Services\Router is incompatible with the type Hateoas\Configuration\Route expected by parameter $route of Hateoas\Representation\F...:createRepresentation(). ( Ignorable by Annotation )

If this is a false-positive, you can also ignore this issue in your code via the ignore-type  annotation

292
        return $pagerFactory->createRepresentation($pager, /** @scrutinizer ignore-type */ $router);
Loading history...
293
    }
294
295
    /** @deprecated since 2.3 */
296
    protected function customQueryStringValues()
297
    {
298
        return [];
299
    }
300
301
    protected function getCurrentEntityAlias() : string
302
    {
303
        return $this->currentEntityAlias;
304
    }
305
306
    protected function setCurrentEntityAlias(string $currentEntityAlias) 
307
    {
308
        $this->currentEntityAlias = $currentEntityAlias;
309
    }
310
311
    protected function getEmbeddedFields() : array
312
    {
313
        return $this->embeddedFields;
314
    }
315
316
    protected function setEmbeddedFields(array $embeddedFields) 
317
    {
318
        $this->embeddedFields = $embeddedFields;
319
    }
320
321
    public function getEntityAlias(string $entityName) : string
322
    {
323
        $arrayEntityName = explode('\\', strtolower($entityName));
324
        return $arrayEntityName[count($arrayEntityName) - 1];
325
    }
326
327
    protected function relationship($queryBuilder)
328
    {
329
        return $queryBuilder;
330
    }
331
332
    public function getQueryBuilderFactoryWithoutInitialization()
333
    {
334
        return $this->queryBuilderFactory;
335
    }
336
}
337