Rating   A
last analyzed

Complexity

Total Complexity 10

Size/Duplication

Total Lines 42
Duplicated Lines 0 %

Coupling/Cohesion

Components 0
Dependencies 2

Test Coverage

Coverage 90%

Importance

Changes 0
Metric Value
wmc 10
lcom 0
cbo 2
dl 0
loc 42
ccs 18
cts 20
cp 0.9
rs 10
c 0
b 0
f 0

2 Methods

Rating   Name   Duplication   Size   Complexity  
A isValid() 0 4 2
B handle() 0 34 8
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?rf=5&rt=6 => Will display all movies with average tmdb rating.
11
 */
12
class Rating implements Filter
13
{
14 34
    public function handle(ParameterBag $params, QueryBuilder $qb): QueryBuilder
15
    {
16 34
        $rating = (int) $params->get('r');
17 34
        $ratingFrom = (int) $params->get('rf');
18 34
        $ratingTo = (int) $params->get('rt');
19
20 34
        if ($ratingTo && $ratingFrom > $ratingTo) {
21
            return $qb;
22
        }
23
24 34
        if ($ratingFrom && $ratingFrom === $ratingTo) {
25
            $rating = $ratingFrom;
26
        }
27
28 34
        if ($this->isValid($rating)) {
29
            return $qb
30 1
                ->andWhere('m.tmdb.voteAverage = :filter_rating')
31 1
                ->setParameter('filter_rating', $rating);
32
        }
33
34 33
        if ($this->isValid($ratingFrom)) {
35
            $qb
36 4
                ->andWhere('m.tmdb.voteAverage >= :filter_rating_from')
37 4
                ->setParameter('filter_rating_from', $ratingFrom);
38
        }
39
40 33
        if ($this->isValid($ratingTo)) {
41
            $qb
42 3
                ->andWhere('m.tmdb.voteAverage <= :filter_rating_to')
43 3
                ->setParameter('filter_rating_to', $ratingTo);
44
        }
45
46 33
        return $qb;
47
    }
48
49 34
    private function isValid(int $rating): bool
50
    {
51 34
        return !($rating < 1 || $rating > 10);
52
    }
53
}
54