CourseRepository   A
last analyzed

Complexity

Total Complexity 9

Size/Duplication

Total Lines 99
Duplicated Lines 0 %

Coupling/Cohesion

Components 1
Dependencies 6

Test Coverage

Coverage 100%

Importance

Changes 0
Metric Value
dl 0
loc 99
ccs 34
cts 34
cp 1
rs 10
c 0
b 0
f 0
wmc 9
lcom 1
cbo 6

7 Methods

Rating   Name   Duplication   Size   Complexity  
A fromPersistence() 0 8 1
A getTable() 0 4 1
A isResponsible() 0 4 1
A search() 0 10 1
A searchCount() 0 7 1
A searchResult() 0 21 3
A prepareSearchQuery() 0 7 1
1
<?php
2
3
declare(strict_types=1);
4
5
namespace Chubbyphp\ApiSkeleton\Repository;
6
7
use Chubbyphp\ApiSkeleton\Model\Document;
8
use Chubbyphp\Model\Collection\LazyModelCollection;
9
use Chubbyphp\Model\ModelInterface;
10
use Doctrine\DBAL\Query\QueryBuilder;
11
use Chubbyphp\ApiSkeleton\Model\Course;
12
use Chubbyphp\ApiSkeleton\Search\CourseSearch;
13
14
final class CourseRepository extends AbstractRepository
15
{
16
    /**
17
     * @param array $row
18
     *
19
     * @return ModelInterface
20
     */
21 1
    protected function fromPersistence(array $row): ModelInterface
22
    {
23 1
        $row['documents'] = new LazyModelCollection(
24 1
            $this->resolver, Document::class, 'courseId', $row['id'], ['name' => 'ASC']
25
        );
26
27 1
        return Course::fromPersistence($row);
28
    }
29
30
    /**
31
     * @return string
32
     */
33 1
    protected function getTable(): string
34
    {
35 1
        return 'courses';
36
    }
37
38
    /**
39
     * @param string $modelClass
40
     *
41
     * @return bool
42
     */
43 1
    public function isResponsible(string $modelClass): bool
44
    {
45 1
        return $modelClass === Course::class;
46
    }
47
48
    /**
49
     * @param CourseSearch $courseSearch
50
     *
51
     * @return CourseSearch
52
     */
53 1
    public function search(CourseSearch $courseSearch): CourseSearch
54
    {
55 1
        $count = $this->searchCount();
56
57 1
        $courseSearch->setPages((int) ceil($count / $courseSearch->getPerPage()));
58 1
        $courseSearch->setCount($count);
59 1
        $courseSearch->setCourses($this->searchResult($courseSearch));
60
61 1
        return $courseSearch;
62
    }
63
64
    /**
65
     * @return int
66
     */
67 1
    private function searchCount(): int
68
    {
69 1
        $qb = $this->prepareSearchQuery();
70 1
        $qb->select('COUNT(id) AS rowCount');
71
72 1
        return (int) $qb->execute()->fetch(\PDO::FETCH_COLUMN);
73
    }
74
75
    /**
76
     * @param CourseSearch $courseSearch
77
     *
78
     * @return array
79
     */
80 1
    private function searchResult(CourseSearch $courseSearch): array
81
    {
82 1
        $qb = $this->prepareSearchQuery();
83
84 1
        $perPage = $courseSearch->getPerPage();
85
86 1
        $qb->select('*');
87 1
        $qb->setFirstResult($courseSearch->getPage() * $perPage - $perPage);
88 1
        $qb->setMaxResults($perPage);
89
90 1
        if (null !== $sort = $courseSearch->getSort()) {
91 1
            $qb->orderBy($sort, $courseSearch->getOrder());
92
        }
93
94 1
        $courses = [];
95 1
        foreach ($qb->execute()->fetchAll(\PDO::FETCH_ASSOC) as $row) {
96 1
            $courses[] = $this->fromPersistence($row);
97
        }
98
99 1
        return $courses;
100
    }
101
102
    /**
103
     * @return QueryBuilder
104
     */
105 1
    private function prepareSearchQuery(): QueryBuilder
106
    {
107 1
        $qb = $this->connection->createQueryBuilder();
108 1
        $qb->from($this->getTable());
109
110 1
        return $qb;
111
    }
112
}
113