Passed
Push — master ( 21d25a...5506f9 )
by Julito
09:46
created

addNotDeletedPublicationQueryBuilder()   A

Complexity

Conditions 1
Paths 1

Size

Total Lines 8
Code Lines 4

Duplication

Lines 0
Ratio 0 %

Importance

Changes 2
Bugs 1 Features 0
Metric Value
cc 1
eloc 4
nc 1
nop 1
dl 0
loc 8
rs 10
c 2
b 1
f 0
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\Session;
11
use Chamilo\CoreBundle\Entity\User;
12
use Chamilo\CoreBundle\Repository\ResourceRepository;
13
use Chamilo\CourseBundle\Entity\CGroup;
14
use Chamilo\CourseBundle\Entity\CStudentPublication;
15
use Chamilo\CourseBundle\Entity\CStudentPublicationAssignment;
16
use Doctrine\Common\Collections\Criteria;
17
use Doctrine\ORM\Query\Expr\Join;
18
use Doctrine\ORM\QueryBuilder;
19
use Doctrine\Persistence\ManagerRegistry;
20
21
final class CStudentPublicationRepository extends ResourceRepository
22
{
23
    public function __construct(ManagerRegistry $registry)
24
    {
25
        parent::__construct($registry, CStudentPublication::class);
26
    }
27
28
    public function findAllByCourse(
29
        Course $course,
30
        Session $session = null,
31
        ?string $title = null,
32
        ?int $active = null,
33
        ?string $fileType = null
34
    ): QueryBuilder {
35
        $qb = $this->getResourcesByCourse($course, $session);
36
37
        $this->addTitleQueryBuilder($title, $qb);
38
        $this->addActiveQueryBuilder($active, $qb);
39
        $this->addFileTypeQueryBuilder($fileType, $qb);
40
41
        return $qb;
42
    }
43
44
    public function getStudentAssignments(
45
        CStudentPublication $publication,
46
        Course $course,
47
        Session $session = null,
48
        CGroup $group = null
49
    ): QueryBuilder {
50
        $qb = $this->getResourcesByCourse($course, $session, $group);
51
52
        $this->addNotDeletedPublicationQueryBuilder($qb);
53
        $qb
54
            ->andWhere('resource.publicationParent =:publicationParent')
55
            ->setParameter('publicationParent', $publication)
56
        ;
57
58
        return $qb;
59
    }
60
61
    public function countUserPublications(User $user, Course $course, Session $session = null, CGroup $group = null)
62
    {
63
        $qb = $this->getResourcesByCourseLinkedToUser($user, $course, $session);
64
65
        $qb->select('count(resource)');
66
67
        return $qb->getQuery()->getSingleScalarResult();
68
    }
69
70
    public function countCoursePublications(Course $course, Session $session = null, CGroup $group = null)
71
    {
72
        $qb = $this->getResourcesByCourse($course, $session, $group);
73
74
        $qb->select('count(resource)');
75
        $this->addNotDeletedPublicationQueryBuilder($qb);
76
77
        return $qb->getQuery()->getSingleScalarResult();
78
    }
79
80
    /**
81
     * Find all the works registered by a teacher.
82
     */
83
    public function findWorksByTeacher(User $user, Course $course, Session $session = null, int $groupId = 0): array
84
    {
85
        $qb = $this->createQueryBuilder('w');
86
87
        return $qb
88
            ->leftJoin(
89
                CStudentPublicationAssignment::class,
90
                'a',
91
                Join::WITH,
92
                'a.publicationId = w.iid AND a.cId = w.cId'
93
            )
94
            ->where(
95
                $qb->expr()->andX(
96
                    $qb->expr()->eq('w.cId', ':course'),
97
                    $qb->expr()->eq('w.session', ':session'),
98
                    $qb->expr()->in('w.active', [0, 1]),
99
                    $qb->expr()->eq('w.parentId', 0),
100
                    $qb->expr()->eq('w.postGroupId', ':group'),
101
                    $qb->expr()->eq('w.userId', ':user')
102
                )
103
            )
104
105
            ->orderBy('w.sentDate', Criteria::ASC)
106
            ->setParameters([
107
                'course' => $course->getId(),
108
                'session' => $session,
109
                'group' => $groupId,
110
                'user' => $user->getId(),
111
            ])
112
            ->getQuery()
113
            ->getResult()
114
        ;
115
    }
116
117
    private function addActiveQueryBuilder(?int $active = null, QueryBuilder $qb = null): QueryBuilder
118
    {
119
        $qb = $this->getOrCreateQueryBuilder($qb);
120
121
        if (null !== $active) {
122
            $qb
123
                ->andWhere('resource.active = :active')
124
                ->setParameter('active', $active)
125
            ;
126
        }
127
128
        return $qb;
129
    }
130
131
    private function addNotDeletedPublicationQueryBuilder(QueryBuilder $qb = null): QueryBuilder
132
    {
133
        $qb = $this->getOrCreateQueryBuilder($qb);
134
        $qb
135
            ->andWhere('resource.active <> 2')
136
        ;
137
138
        return $qb;
139
    }
140
141
    private function addFileTypeQueryBuilder(?string $fileType, QueryBuilder $qb = null): QueryBuilder
142
    {
143
        $qb = $this->getOrCreateQueryBuilder($qb);
144
        if (null === $fileType) {
145
            return $qb;
146
        }
147
148
        $qb
149
            ->andWhere('resource.filetype = :filetype')
150
            ->setParameter('filetype', $fileType)
151
        ;
152
153
        return $qb;
154
    }
155
}
156