YearRange::handle()   B
last analyzed

Complexity

Conditions 8
Paths 11

Size

Total Lines 34

Duplication

Lines 0
Ratio 0 %

Code Coverage

Tests 16
CRAP Score 8.0877

Importance

Changes 0
Metric Value
dl 0
loc 34
ccs 16
cts 18
cp 0.8889
rs 8.1315
c 0
b 0
f 0
cc 8
nc 11
nop 2
crap 8.0877
1
<?php
2
3
namespace App\Filters\Movie;
4
5
use App\Filters\Filter;
6
use Doctrine\ORM\QueryBuilder;
7
use Symfony\Component\HttpFoundation\ParameterBag;
8
9
/**
10
 * /api/movies?yf=2000&yt=2010 => Will display all movies with release date between 2000-2010.
11
 */
12
class YearRange implements Filter
13
{
14 34
    public function handle(ParameterBag $params, QueryBuilder $qb): QueryBuilder
15
    {
16 34
        $yearFrom = (int) $params->get('yf');
17 34
        $yearTo = (int) $params->get('yt');
18 34
        $year = (int) $params->get('y');
19
20 34
        if ($yearTo && $yearFrom > $yearTo) {
21
            return $qb;
22
        }
23
24 34
        if ($yearFrom && $yearFrom === $yearTo) {
25
            $year = $yearFrom;
26
        }
27
28 34
        if ($this->isValid($year)) {
29
            return $qb
30 1
                ->andWhere("DATE_PART('year', m.releaseDate) = :filter_year")
31 1
                ->setParameter('filter_year', $year);
32
        }
33
34 33
        if ($this->isValid($yearFrom)) {
35
            $qb
36 4
                ->andWhere("DATE_PART('year', m.releaseDate) >= :filter_year_from")
37 4
                ->setParameter('filter_year_from', $yearFrom);
38
        }
39
40 33
        if ($this->isValid($yearTo)) {
41
            $qb
42 4
                ->andWhere("DATE_PART('year', m.releaseDate) <= :filter_year_to")
43 4
                ->setParameter('filter_year_to', $yearTo);
44
        }
45
46 33
        return $qb;
47
    }
48
49 34
    private function isValid(int $year): bool
50
    {
51 34
        return !($year < 1878 || $year > 2050);
52
    }
53
}
54