Passed
Push — master ( c37697...7551f3 )
by Julito
11:15
created

SessionRepository::update()   A

Complexity

Conditions 1
Paths 1

Size

Total Lines 4
Code Lines 2

Duplication

Lines 0
Ratio 0 %

Importance

Changes 1
Bugs 0 Features 0
Metric Value
cc 1
eloc 2
c 1
b 0
f 0
nc 1
nop 1
dl 0
loc 4
rs 10
1
<?php
2
3
declare(strict_types=1);
4
5
/* For licensing terms, see /license.txt */
6
7
namespace Chamilo\CoreBundle\Repository;
8
9
use Chamilo\CoreBundle\Entity\AccessUrl;
10
use Chamilo\CoreBundle\Entity\AccessUrlRelUser;
11
use Chamilo\CoreBundle\Entity\Course;
12
use Chamilo\CoreBundle\Entity\Session;
13
use Chamilo\CoreBundle\Entity\SessionRelCourseRelUser;
14
use Chamilo\CoreBundle\Entity\SessionRelUser;
15
use Chamilo\CoreBundle\Entity\User;
16
use Doctrine\Bundle\DoctrineBundle\Repository\ServiceEntityRepository;
17
use Doctrine\ORM\Query\Expr\Join;
18
use Doctrine\Persistence\ManagerRegistry;
19
20
/**
21
 * SessionRepository.
22
 *
23
 * @author Julio Montoya <[email protected]>
24
 */
25
class SessionRepository extends ServiceEntityRepository
26
{
27
    public function __construct(ManagerRegistry $registry)
28
    {
29
        parent::__construct($registry, Session::class);
30
    }
31
32
    public function create(): ?Session
33
    {
34
        return new Session();
35
    }
36
37
    public function update(Session $session): void
38
    {
39
        $this->getEntityManager()->persist($session);
40
        $this->getEntityManager()->flush();
41
    }
42
43
    /**
44
     * @return SessionRelUser[]
45
     */
46
    public function getUsersByAccessUrl(Session $session, AccessUrl $url)
47
    {
48
        if (0 === $session->getUsers()->count()) {
49
            return [];
50
        }
51
52
        $qb = $this->addSessionRelUserFilterByUrl($session, $url);
53
        $qb->orderBy('sru.relationType');
54
55
        return $qb->getQuery()->getResult();
56
    }
57
58
    /**
59
     * @return SessionRelUser[]
60
     */
61
    public function getUsersByCourse(Session $session, Course $course, AccessUrl $url)
62
    {
63
        if (0 === $session->getUsers()->count()) {
64
            return [];
65
        }
66
67
        $qb = $this->addSessionRelUserFilterByUrl($session, $url);
68
        $qb
69
            ->innerJoin(SessionRelCourseRelUser::class, 'srcu')
70
            ->andWhere('srcu.session = :session AND srcu.course = :course ')
71
            ->setParameters([
72
                'course' => $course,
73
                'session' => $session,
74
            ])
75
        ;
76
77
        return $qb->getQuery()->getResult();
78
    }
79
80
    /**
81
     * @return Session[]
82
     */
83
    public function getSessionsByUser(User $user, AccessUrl $url)
84
    {
85
        $qb = $this->createQueryBuilder('s');
86
        $qb
87
            ->select('s')
88
            ->innerJoin('s.users', 'sru')
89
            ->leftJoin(AccessUrlRelUser::class, 'uru', Join::WITH, 'uru.user = sru.user')
90
            ->andWhere('sru.user = :user AND uru.url = :url')
91
            ->setParameters([
92
                'user' => $user,
93
                'url' => $url,
94
            ])
95
        ;
96
97
        return $qb->getQuery()->getResult();
98
    }
99
100
    protected function addUserInCourse(
101
        int $status,
102
        User $user,
103
        Course $course,
104
        Session $session
105
    ): void {
106
        if ($session->isActive() &&
107
            $user->getIsActive() &&
108
            $course->isActive() && $session->hasCourse($course)
109
        ) {
110
            switch ($status) {
111
                case Session::DRH:
112
                    if ($user->hasRole('ROLE_RRHH')) {
113
                        $session->addUserInSession(Session::DRH, $user);
114
                    }
115
116
                    break;
117
                case Session::STUDENT:
118
                    $session->addUserInSession(Session::STUDENT, $user);
119
                    $session->addUserInCourse(
120
                        Session::STUDENT,
121
                        $user,
122
                        $course
123
                    );
124
125
                    break;
126
                case Session::COACH:
127
                    if ($user->hasRole('ROLE_TEACHER')) {
128
                        $session->addUserInCourse(
129
                            Session::COACH,
130
                            $user,
131
                            $course
132
                        );
133
                    }
134
135
                    break;
136
            }
137
        }
138
    }
139
140
    private function addSessionRelUserFilterByUrl(Session $session, AccessUrl $url)
141
    {
142
        $qb = $this->getEntityManager()->createQueryBuilder();
143
        $qb
144
            ->select('sru')
145
            ->from(User::class, 'u')
146
            ->innerJoin(SessionRelUser::class, 'sru')
147
            ->innerJoin(AccessUrlRelUser::class, 'uru')
148
            ->andWhere('sru.session = :session AND uru.url = :url')
149
            ->setParameters([
150
                'session' => $session,
151
                'url' => $url,
152
            ])
153
        ;
154
155
        return $qb;
156
    }
157
}
158