Completed
Push — master ( 0b4911...4851fa )
by Valentyn
04:19 queued 11s
created

YearRange::handle()   B

Complexity

Conditions 7
Paths 11

Size

Total Lines 34

Duplication

Lines 0
Ratio 0 %

Code Coverage

Tests 17
CRAP Score 7.0084

Importance

Changes 0
Metric Value
dl 0
loc 34
c 0
b 0
f 0
ccs 17
cts 18
cp 0.9444
rs 8.4426
cc 7
nc 11
nop 2
crap 7.0084
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 31
    public function handle(ParameterBag $params, QueryBuilder $qb): QueryBuilder
15
    {
16 31
        $yearFrom = (int)$params->get('yf');
17 31
        $yearTo = (int)$params->get('yt');
18 31
        $year = (int)$params->get('y');
19
20 31
        if ($yearFrom > $yearTo) {
21 1
            return $qb;
22
        }
23
24 30
        if ($yearFrom && $yearFrom === $yearTo) {
25
            $year = $yearFrom;
26
        }
27
28 30
        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 29
        if ($this->isValid($yearFrom)) {
35
            $qb
36 3
                ->andWhere("DATE_PART('year', m.releaseDate) >= :filter_year_from")
37 3
                ->setParameter('filter_year_from', $yearFrom);
38
        }
39
40 29
        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 29
        return $qb;
47
    }
48
49 30
    private function isValid(int $year): bool
50
    {
51 30
        return !($year < 1878 || $year > 2050);
52
    }
53
}