Passed
Push — master ( 49d6fc...f737dc )
by Julito
08:44
created

CQuizRepository::addCategoryQueryBuilder()   A

Complexity

Conditions 2
Paths 2

Size

Total Lines 12
Code Lines 6

Duplication

Lines 0
Ratio 0 %

Importance

Changes 1
Bugs 0 Features 0
Metric Value
cc 2
eloc 6
c 1
b 0
f 0
nc 2
nop 2
dl 0
loc 12
rs 10
1
<?php
2
3
declare(strict_types=1);
4
5
/* For licensing terms, see /license.txt */
6
7
namespace Chamilo\CourseBundle\Repository;
8
9
use Chamilo\CoreBundle\Entity\Course;
10
use Chamilo\CoreBundle\Entity\ResourceInterface;
11
use Chamilo\CoreBundle\Entity\Session;
12
use Chamilo\CoreBundle\Repository\ResourceRepository;
13
use Chamilo\CoreBundle\Repository\ResourceWithLinkInterface;
14
use Chamilo\CourseBundle\Entity\CQuiz;
15
use DateTime;
16
use Doctrine\ORM\QueryBuilder;
17
use Doctrine\Persistence\ManagerRegistry;
18
use Symfony\Component\Routing\RouterInterface;
19
20
final class CQuizRepository extends ResourceRepository implements ResourceWithLinkInterface
21
{
22
    public function __construct(ManagerRegistry $registry)
23
    {
24
        parent::__construct($registry, CQuiz::class);
25
    }
26
27
    public function findAllByCourse(
28
        Course $course,
29
        Session $session = null,
30
        ?string $title = null,
31
        ?int $active = null,
32
        bool $onlyPublished = true,
33
        ?int $categoryId = null
34
    ): QueryBuilder {
35
        $qb = $this->getResourcesByCourse($course, $session);
36
37
        if ($onlyPublished) {
38
            $this->addDateFilterQueryBuilder(new DateTime(), $qb);
39
        }
40
        $this->addCategoryQueryBuilder($categoryId, $qb);
41
        $this->addActiveQueryBuilder($active, $qb);
42
        $this->addNotDeletedQueryBuilder($qb);
43
        $this->addTitleQueryBuilder($title, $qb);
44
45
        return $qb;
46
    }
47
48
    public function getLink(ResourceInterface $resource, RouterInterface $router, array $extraParams = []): string
49
    {
50
        $params = [
51
            'name' => 'exercise/overview.php',
52
            'exerciseId' => $resource->getResourceIdentifier(),
53
        ];
54
        if (!empty($extraParams)) {
55
            $params = array_merge($params, $extraParams);
56
        }
57
58
        return $router->generate('legacy_main', $params);
59
    }
60
61
    public function deleteAllByCourse(Course $course): void
62
    {
63
        $qb = $this->getResourcesByCourse($course);
64
        $resources = $qb->getQuery()->getResult();
65
        $em = $this->getEntityManager();
66
67
        /*foreach ($resources as $quiz) {
68
            $questions = $quiz->getQuestions();
69
            foreach ($questions as $question) {
70
                //$em->remove($question);
71
            }
72
            $em->remove($quiz);
73
        }*/
74
        //$em->flush();
75
    }
76
77
    private function addDateFilterQueryBuilder(DateTime $dateTime, QueryBuilder $qb = null): QueryBuilder
78
    {
79
        $qb = $this->getOrCreateQueryBuilder($qb);
80
        $qb
81
            ->andWhere("(
82
                (
83
                    resource.startTime <> '' AND
84
                    resource.startTime < :date AND
85
                    resource.endTime <> '' AND
86
                    resource.endTime > :date
87
                )  OR
88
                (resource.startTime <> '' AND resource.startTime < :date AND resource.endTime IS NULL) OR
89
                (resource.startTime IS NULL AND resource.endTime <> '' AND resource.endTime > :date) OR
90
                (resource.startTime IS NULL AND resource.endTime IS NULL)
91
                )
92
            ")
93
            ->setParameter('date', $dateTime)
94
        ;
95
96
        return $qb;
97
    }
98
99
    private function addNotDeletedQueryBuilder(QueryBuilder $qb = null): QueryBuilder
100
    {
101
        $qb = $this->getOrCreateQueryBuilder($qb);
102
103
        $qb->andWhere('resource.active <> -1');
104
105
        return $qb;
106
    }
107
108
    private function addCategoryQueryBuilder(?int $categoryId = null, QueryBuilder $qb = null): QueryBuilder
109
    {
110
        $qb = $this->getOrCreateQueryBuilder($qb);
111
112
        if (null !== $categoryId) {
113
            $qb
114
                ->andWhere('resource.exerciseCategory = :category_id')
115
                ->setParameter('category_id', $categoryId)
116
            ;
117
        }
118
119
        return $qb;
120
    }
121
122
    /**
123
     * @param int|null $active
124
     *                         null = no filter
125
     *                         -1 = deleted exercises
126
     *                         0 = inactive exercises
127
     *                         1 = active exercises
128
     *                         2 = all exercises (active and inactive)
129
     */
130
    private function addActiveQueryBuilder(?int $active = null, QueryBuilder $qb = null): QueryBuilder
131
    {
132
        $qb = $this->getOrCreateQueryBuilder($qb);
133
134
        if (null !== $active) {
135
            if (2 === $active) {
136
                $qb
137
                    ->andWhere('resource.active = 1 OR resource.active = 0')
138
                ;
139
            } else {
140
                $qb
141
                    ->andWhere('resource.active = :active')
142
                    ->setParameter('active', $active)
143
                ;
144
            }
145
        }
146
147
        return $qb;
148
    }
149
}
150