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 — 2.3 ( 09761f...c8b98c )
by Simone
05:40 queued 02:33
created

BaseRepository::getRequest()   A

Complexity

Conditions 1
Paths 1

Size

Total Lines 3
Code Lines 1

Duplication

Lines 0
Ratio 0 %

Code Coverage

Tests 0
CRAP Score 2

Importance

Changes 0
Metric Value
cc 1
eloc 1
nc 1
nop 0
dl 0
loc 3
ccs 0
cts 2
cp 0
crap 2
rs 10
c 0
b 0
f 0
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\Exceptions\InvalidFiltersException;
9
use Mado\QueryBundle\Objects\MetaDataAdapter;
10
use Mado\QueryBundle\Queries\QueryBuilderFactory;
11
use Mado\QueryBundle\Queries\QueryBuilderOptions;
12
use Mado\QueryBundle\Services\Router;
13
use Pagerfanta\Adapter\DoctrineORMAdapter;
14
use Pagerfanta\Pagerfanta;
15
use Symfony\Component\HttpFoundation\Request;
16
17
class BaseRepository extends EntityRepository
18
{
19
    protected $request;
20
21
    protected $use_result_cache = false;
22
23
    protected $route_name;
24
25
    protected $currentEntityAlias;
26
27
    protected $embeddedFields;
28
29
    protected $joins = [];
30
31
    protected $queryBuilderFactory;
32
33
    protected $queryOptions;
34
35
    protected $metadata;
36
37
    public function __construct($manager, $class)
38
    {
39
        parent::__construct($manager, $class);
40
41
        $this->metadata = new MetaDataAdapter();
42
        $this->metadata->setClassMetadata($this->getClassMetadata());
43
        $this->metadata->setEntityName($this->getEntityName());
44
45
        $this->queryBuilderFactory = new QueryBuilderFactory($this->getEntityManager());
46
    }
47
48
    public function initFromQueryBuilderOptions(QueryBuilderOptions $options)
49
    {
50
        $this->queryBuilderFactory->createQueryBuilder(
51
            $this->getEntityName(),
52
            $this->metadata->getEntityAlias()
53
        );
54
55
        $this->queryBuilderFactory->loadMetadataAndOptions(
56
            $this->metadata,
57
            $options
58
        );
59
    }
60
61
    public function getQueryBuilderFactory()
62
    {
63
        $this->initFromQueryBuilderOptions($this->queryOptions);
64
65
        return $this->queryBuilderFactory;
66
    }
67
68
    public function useResultCache($bool)
69
    {
70
        $this->use_result_cache = $bool;
71
    }
72
73
    public function setRequest(Request $request)
74
    {
75
        return $this->setQueryOptionsFromRequest($request);
76
    }
77
78
    public function setRequestWithFilter(Request $request, $filter)
79
    {
80
        return $this->setQueryOptionsFromRequestWithCustomFilter($request, $filter);
81
    }
82
83
    public function setRequestWithOrFilter(Request $request, $orFilter)
84
    {
85
        return $this->setQueryOptionsFromRequestWithCustomOrFilter($request, $orFilter);
86
    }
87
88
    public function setQueryOptions(QueryBuilderOptions $options)
89
    {
90
        $this->queryOptions = $options;
91
    }
92
93
    public function setQueryOptionsFromRequest(Request $request = null)
94
    {
95
        $requestAttributes = [];
96
        foreach ($request->attributes->all() as $attributeName => $attributeValue) {
97
            $requestAttributes[$attributeName] = $request->attributes->get(
98
                $attributeName,
99
                $attributeValue
100
            );
101
        }
102
103
        $filters     = $request->query->get('filtering', []);
104
        $orFilters   = $request->query->get('filtering_or', []);
105
        $sorting     = $request->query->get('sorting', []);
106
        $printing    = $request->query->get('printing', []);
107
        $rel         = $request->query->get('rel', '');
108
        $page        = $request->query->get('page', '');
109
        $select      = $request->query->get('select', $this->metadata->getEntityAlias());
110
        $filtering   = $request->query->get('filtering', '');
111
        $limit       = $request->query->get('limit', '');
112
113
        $filterOrCorrected = [];
114
115
        $count = 0;
116
        foreach ($orFilters as $key => $filter) {
117
            if (is_array($filter)) {
118
                foreach ($filter as $keyInternal => $internal) {
119
                    $filterOrCorrected[$keyInternal . '|' . $count] = $internal;
120
                    $count += 1;
121
                }
122
            } else {
123
                $filterOrCorrected[$key] = $filter;
124
            }
125
        }
126
127
        $requestProperties = [
128
            'filtering'   => $filtering,
129
            'orFiltering' => $filterOrCorrected,
130
            'limit'       => $limit,
131
            'page'        => $page,
132
            'filters'     => $filters,
133
            'orFilters'   => $filterOrCorrected,
134
            'sorting'     => $sorting,
135
            'rel'         => $rel,
136
            'printing'    => $printing,
137
            'select'      => $select,
138
        ];
139
140
        $options = array_merge(
141
            $requestAttributes,
142
            $requestProperties
143
        );
144
145
        $this->queryOptions = QueryBuilderOptions::fromArray($options);
146
147
        return $this;
148
    }
149
150
    private function ensureFilterIsValid($filters)
151
    {
152
        if (!is_array($filters)) {
153
154
            $message = "Wrong query string exception: ";
155
            $message .= var_export($filters, true) . "\n";
156
            $message .= "Please check query string should be something like " .
157
                "http://127.0.0.1:8000/?filtering[status]=todo";
158
159
            throw new InvalidFiltersException($message);
160
        }
161
    }
162
163
    public function setQueryOptionsFromRequestWithCustomFilter(Request $request = null, $filter)
164
    {
165
        $filters = $request->query->get('filtering', []);
166
        $orFilters = $request->query->get('filtering_or', []);
167
        $sorting = $request->query->get('sorting', []);
168
        $printing = $request->query->get('printing', []);
169
        $rel = $request->query->get('rel', '');
170
        $page = $request->query->get('page', '');
171
        $select = $request->query->get('select', $this->metadata->getEntityAlias());
172
        $filtering = $request->query->get('filtering', '');
173
        $limit = $request->query->get('limit', '');
174
175
        $this->ensureFilterIsValid($filters);
176
        $filters = array_merge($filters, $filter);
177
178
        $filterOrCorrected = [];
179
180
        $count = 0;
181
        foreach ($orFilters as $key => $filterValue) {
182
            if (is_array($filterValue)) {
183
                foreach ($filterValue as $keyInternal => $internal) {
184
                    $filterOrCorrected[$keyInternal . '|' . $count] = $internal;
185
                    $count += 1;
186
                }
187
            } else {
188
                $filterOrCorrected[$key] = $filterValue;
189
            }
190
        }
191
192
        $this->queryOptions = QueryBuilderOptions::fromArray([
193
            '_route' => $request->attributes->get('_route'),
194
            '_route_params' => $request->attributes->get('_route_params', []),
195
            'id' => $request->attributes->get('id'),
196
            'filtering' => $filtering,
197
            'limit' => $limit,
198
            'page' => $page,
199
            'filters' => $filters,
200
            'orFilters' => $filterOrCorrected,
201
            'sorting' => $sorting,
202
            'rel' => $rel,
203
            'printing' => $printing,
204
            'select' => $select,
205
        ]);
206
207
        return $this;
208
    }
209
210
    public function setQueryOptionsFromRequestWithCustomOrFilter(Request $request = null, $orFilter)
211
    {
212
        $filters = $request->query->get('filtering', []);
213
        $orFilters = $request->query->get('filtering_or', []);
214
        $sorting = $request->query->get('sorting', []);
215
        $printing = $request->query->get('printing', []);
216
        $rel = $request->query->get('rel', '');
217
        $page = $request->query->get('page', '');
218
        $select = $request->query->get('select', $this->metadata->getEntityAlias());
219
        $filtering = $request->query->get('filtering', '');
220
        $limit = $request->query->get('limit', '');
221
222
        $orFilters = array_merge($orFilters, $orFilter);
223
224
        $filterOrCorrected = [];
225
226
        $count = 0;
227
        foreach ($orFilters as $key => $filter) {
228
            if (is_array($filter)) {
229
                foreach ($filter as $keyInternal => $internal) {
230
                    $filterOrCorrected[$keyInternal . '|' . $count] = $internal;
231
                    $count += 1;
232
                }
233
            } else {
234
                $filterOrCorrected[$key] = $filter;
235
            }
236
        }
237
238
        $this->queryOptions = QueryBuilderOptions::fromArray([
239
            '_route' => $request->attributes->get('_route'),
240
            '_route_params' => $request->attributes->get('_route_params', []),
241
            'id' => $request->attributes->get('id'),
242
            'filtering' => $filtering,
243
            'limit' => $limit,
244
            'page' => $page,
245
            'filters' => $filters,
246
            'orFilters' => $filterOrCorrected,
247
            'sorting' => $sorting,
248
            'rel' => $rel,
249
            'printing' => $printing,
250
            'select' => $select,
251
        ]);
252
253
        return $this;
254
    }
255
256
    public function getRequest()
257
    {
258
        return $this->request;
259
    }
260
261
    public function setRouteName($route_name = '')
262
    {
263
        $this->route_name = $route_name;
264
        return $this;
265
    }
266
267
    public function findAllPaginated()
268
    {
269
        $this->initFromQueryBuilderOptions($this->queryOptions);
270
271
        $this->queryBuilderFactory->filter();
272
        $this->queryBuilderFactory->sort();
273
274
        $queryBuilder = $this->queryBuilderFactory->getQueryBuilder();
275
276
        $this->lastQuery = $queryBuilder->getQuery()->getSql();
0 ignored issues
show
Bug Best Practice introduced by
The property lastQuery does not exist. Although not strictly required by PHP, it is generally a best practice to declare properties explicitly.
Loading history...
277
        $this->lastParameters = $queryBuilder->getQuery()->getParameters();
0 ignored issues
show
Bug Best Practice introduced by
The property lastParameters does not exist. Although not strictly required by PHP, it is generally a best practice to declare properties explicitly.
Loading history...
278
279
        return $this->paginateResults($queryBuilder);
280
    }
281
282
    public function getLastQuery()
283
    {
284
        return [
285
            'query' => $this->lastQuery,
286
            'params' =>  $this->lastParameters,
287
        ];
288
    }
289
290
    protected function paginateResults(QueryBuilder $queryBuilder) {
291
        $limit = $this->queryOptions->get('limit', 10);
292
        $page = $this->queryOptions->get('page', 1);
293
294
        $pagerAdapter = new DoctrineORMAdapter($queryBuilder);
295
296
        $query = $pagerAdapter->getQuery();
297
        if (isset($this->use_result_cache) and $this->use_result_cache) {
298
            $query->useResultCache(true, 600);
299
        }
300
301
        $pager = new Pagerfanta($pagerAdapter);
302
        $pager->setNormalizeOutOfRangePages(true);
303
        $pager->setMaxPerPage($limit);
304
        $pager->setCurrentPage($page);
305
306
        $pagerFactory = new PagerfantaFactory();
307
308
        $router = new Router();
309
        $route = $router->createRouter($this->queryOptions, $this->route_name);
310
311
        return $pagerFactory->createRepresentation($pager, $route);
312
    }
313
314
    /** @deprecated since 2.3 */
315
    protected function customQueryStringValues()
316
    {
317
        return [];
318
    }
319
320
    protected function getCurrentEntityAlias() : string
321
    {
322
        return $this->currentEntityAlias;
323
    }
324
325
    protected function setCurrentEntityAlias(string $currentEntityAlias)
326
    {
327
        $this->currentEntityAlias = $currentEntityAlias;
328
    }
329
330
    protected function getEmbeddedFields() : array
331
    {
332
        return $this->embeddedFields;
333
    }
334
335
    protected function setEmbeddedFields(array $embeddedFields)
336
    {
337
        $this->embeddedFields = $embeddedFields;
338
    }
339
340
    public function getEntityAlias() : string
341
    {
342
        return $this->metadata->getEntityAlias();
343
    }
344
345
    protected function relationship($queryBuilder)
346
    {
347
        return $queryBuilder;
348
    }
349
350
    public function getQueryBuilderFactoryWithoutInitialization()
351
    {
352
        return $this->queryBuilderFactory;
353
    }
354
}
355