CriteriaBuilder::__invoke()   B
last analyzed

Complexity

Conditions 7
Paths 24

Size

Total Lines 26

Duplication

Lines 0
Ratio 0 %

Code Coverage

Tests 15
CRAP Score 7.0119

Importance

Changes 0
Metric Value
dl 0
loc 26
ccs 15
cts 16
cp 0.9375
rs 8.5706
c 0
b 0
f 0
cc 7
nc 24
nop 1
crap 7.0119
1
<?php
2
declare(strict_types=1);
3
4
namespace SlayerBirden\DataFlowServer\Doctrine\Collection;
5
6
use Doctrine\Common\Collections\Criteria;
7
8
final class CriteriaBuilder
9
{
10
    const FILTERS = 'f';
11
    const PAGE = 'p';
12
    const SORTING = 's';
13
    const LIMIT = 'l';
14
15
    /**
16
     * Build Criteria based on query params
17
     *
18
     * @param array $data
19
     * @return Criteria
20
     */
21 24
    public function __invoke(
22
        array $data
23
    ): Criteria {
24 24
        $page = isset($data[self::PAGE]) ? abs($data[self::PAGE]) : 1;
25 24
        $limit = isset($data[self::LIMIT]) ? abs($data[self::LIMIT]) : 10;
26 24
        $filters = $data[self::FILTERS] ?? [];
27 24
        $sorting = $data[self::SORTING] ?? [];
28
29 24
        $criteria = Criteria::create();
30 24
        $criteria->setFirstResult(($page - 1) * $limit)
31 24
            ->setMaxResults($limit);
32 24
        foreach ($filters as $key => $value) {
33 10
            if (is_string($value)) {
34 10
                $criteria->andWhere(Criteria::expr()->contains($key, $value));
35
            } else {
36
                $criteria->andWhere(Criteria::expr()->eq($key, $value));
37
            }
38
        }
39 24
        if (!empty($sorting)) {
40 4
            foreach ($sorting as $key => $dir) {
41 4
                $criteria->orderBy($sorting);
42
            }
43
        }
44
45 24
        return $criteria;
46
    }
47
}
48