Passed
Push — master ( 769c74...60f6e4 )
by Yannick
07:30 queued 29s
created

CourseRepository::getSubscribedStudents()   A

Complexity

Conditions 1
Paths 1

Size

Total Lines 3
Code Lines 1

Duplication

Lines 0
Ratio 0 %

Importance

Changes 0
Metric Value
cc 1
eloc 1
nc 1
nop 1
dl 0
loc 3
rs 10
c 0
b 0
f 0
1
<?php
2
3
declare(strict_types=1);
4
5
/* For licensing terms, see /license.txt */
6
7
namespace Chamilo\CoreBundle\Repository\Node;
8
9
use Chamilo\CoreBundle\Component\Utils\ChamiloApi;
10
use Chamilo\CoreBundle\Entity\AccessUrl;
11
use Chamilo\CoreBundle\Entity\Course;
12
use Chamilo\CoreBundle\Entity\CourseRelUser;
13
use Chamilo\CoreBundle\Entity\ResourceNode;
14
use Chamilo\CoreBundle\Entity\User;
15
use Chamilo\CoreBundle\Repository\ResourceRepository;
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
/**
22
 * Class CourseRepository.
23
 *
24
 * The functions inside this class should return an instance of QueryBuilder.
25
 */
26
class CourseRepository extends ResourceRepository
27
{
28
    public function __construct(ManagerRegistry $registry)
29
    {
30
        parent::__construct($registry, Course::class);
31
    }
32
33
    public function deleteCourse(Course $course): void
34
    {
35
        $em = $this->getEntityManager();
36
37
        // Deleting all nodes connected to the course:
38
        // $node = $course->getResourceNode();
39
        // $children = $node->getChildren();
40
        // /* var ResourceNode $child
41
        /*foreach ($children as $child) {
42
            var_dump($child->getId().'-'.$child->getTitle().'<br />');
43
            var_dump(get_class($child));
44
            $em->remove($child);
45
        }*/
46
47
        $em->remove($course);
48
        $em->flush();
49
        $em->clear();
50
    }
51
52
    public function findOneByCode(string $code): ?Course
53
    {
54
        return $this->findOneBy([
55
            'code' => $code,
56
        ]);
57
    }
58
59
    /**
60
     * Get course user relationship based in the course_rel_user table.
61
     *
62
     * @return CourseRelUser[]
63
     */
64
    public function getCoursesByUser(User $user, AccessUrl $url)
65
    {
66
        $qb = $this->getEntityManager()->createQueryBuilder();
67
68
        $qb
69
            ->select('courseRelUser')
70
            ->from(Course::class, 'c')
71
            ->innerJoin(CourseRelUser::class, 'courseRelUser')
72
            // ->innerJoin('c.users', 'courseRelUser')
73
            ->innerJoin('c.urls', 'accessUrlRelCourse')
74
            ->where('courseRelUser.user = :user')
75
            ->andWhere('accessUrlRelCourse.url = :url')
76
            ->setParameters([
77
                'user' => $user,
78
                'url' => $url,
79
            ])
80
        ;
81
82
        $query = $qb->getQuery();
83
84
        return $query->getResult();
85
    }
86
87
    /**
88
     * Get info from courses where the user has the given role.
89
     * @param User $user
90
     * @param AccessUrl $url
91
     * @param int $status
92
     * @param string $keyword
93
     * @return Course[]
94
     */
95
    public function getCoursesInfoByUser(User $user, AccessUrl $url, int $status, string $keyword = ''): array
96
    {
97
        $qb = $this->getEntityManager()->createQueryBuilder();
98
99
        $qb
100
            ->select('DISTINCT c.id')
101
            ->from(Course::class, 'c')
102
            ->innerJoin(CourseRelUser::class, 'courseRelUser')
103
            ->innerJoin('c.urls', 'accessUrlRelCourse')
104
            ->where('accessUrlRelCourse.url = :url')
105
            ->andWhere('courseRelUser.user = :user')
106
            ->andWhere('courseRelUser.status = :status')
107
            ->setParameters([
108
                'user' => $user,
109
                'url' => $url,
110
                'status' => $status
111
            ])
112
        ;
113
        if (!empty($keyword)) {
114
            $qb
115
                ->andWhere('c.title like = :keyword OR c.code like = :keyword')
116
                ->setParameter('keyword', $keyword)
117
            ;
118
        }
119
120
        $query = $qb->getQuery();
121
122
        return $query->getResult();
123
    }
124
125
    /**
126
     * Get all users that are registered in the course. No matter the status.
127
     *
128
     * @return QueryBuilder
129
     */
130
    public function getSubscribedUsers(Course $course)
131
    {
132
        // Course builder
133
        $queryBuilder = $this->createQueryBuilder('c');
134
135
        // Selecting user info.
136
        $queryBuilder->select('DISTINCT user');
137
138
        // Selecting courses for users.
139
        $queryBuilder->innerJoin('c.users', 'subscriptions');
140
        $queryBuilder->innerJoin(
141
            User::class,
142
            'user',
143
            Join::WITH,
144
            'subscriptions.user = user.id'
145
        );
146
147
        if (api_is_western_name_order()) {
148
            $queryBuilder->orderBy('user.firstname', Criteria::ASC);
149
        } else {
150
            $queryBuilder->orderBy('user.lastname', Criteria::ASC);
151
        }
152
153
        $wherePart = $queryBuilder->expr()->andx();
154
155
        // Get only users subscribed to this course
156
        $wherePart->add($queryBuilder->expr()->eq('c.id', $course->getId()));
157
158
        // $wherePart->add($queryBuilder->expr()->eq('c.status', $status));
159
160
        $queryBuilder->where($wherePart);
161
162
        return $queryBuilder;
163
    }
164
165
    /**
166
     * Gets students subscribed in the course.
167
     *
168
     * @return QueryBuilder
169
     */
170
    public function getSubscribedStudents(Course $course)
171
    {
172
        return $this->getSubscribedUsersByStatus($course, STUDENT);
173
    }
174
175
    /**
176
     * Gets the students subscribed in the course.
177
     *
178
     * @return QueryBuilder
179
     */
180
    public function getSubscribedCoaches(Course $course)
181
    {
182
        return $this->getSubscribedUsers($course);
183
    }
184
185
    /**
186
     * Gets the teachers subscribed in the course.
187
     *
188
     * @return QueryBuilder
189
     */
190
    public function getSubscribedTeachers(Course $course)
191
    {
192
        return $this->getSubscribedUsersByStatus($course, ChamiloApi::COURSE_MANAGER);
193
    }
194
195
    /**
196
     * @param int $status use legacy chamilo constants COURSEMANAGER|STUDENT
197
     *
198
     * @return QueryBuilder
199
     */
200
    public function getSubscribedUsersByStatus(Course $course, int $status)
201
    {
202
        $queryBuilder = $this->getSubscribedUsers($course);
203
        $queryBuilder
204
            ->andWhere(
205
                $queryBuilder->expr()->eq('subscriptions.status', $status)
206
            )
207
        ;
208
209
        return $queryBuilder;
210
    }
211
}
212