Passed
Push — master ( 3fcb32...49d6fc )
by Julito
09:27
created

SessionRepository::getSessionsByUser()   A

Complexity

Conditions 1
Paths 1

Size

Total Lines 15
Code Lines 10

Duplication

Lines 0
Ratio 0 %

Importance

Changes 0
Metric Value
cc 1
eloc 10
nc 1
nop 2
dl 0
loc 15
rs 9.9332
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;
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
    /**
33
     * @return SessionRelUser[]
34
     */
35
    public function getUsersByAccessUrl(Session $session, AccessUrl $url)
36
    {
37
        if (0 === $session->getUsers()->count()) {
38
            return [];
39
        }
40
41
        $qb = $this->addSessionRelUserFilterByUrl($session, $url);
42
        $qb->orderBy('sru.relationType');
43
44
        return $qb->getQuery()->getResult();
45
    }
46
47
    public function getUsersByCourse(Session $session, Course $course, AccessUrl $url)
48
    {
49
        if (0 === $session->getUsers()->count()) {
50
            return [];
51
        }
52
53
        $qb = $this->addSessionRelUserFilterByUrl($session, $url);
54
        $qb
55
            ->innerJoin(SessionRelCourseRelUser::class, 'srcu')
56
            ->andWhere('srcu.session = :session AND srcu.course = :course ')
57
            ->setParameters([
58
                'course' => $course,
59
                'session' => $session,
60
            ])
61
        ;
62
63
        return $qb->getQuery()->getResult();
64
    }
65
66
    /**
67
     * @return Session[]
68
     */
69
    public function getSessionsByUser(User $user, AccessUrl $url)
70
    {
71
        $qb = $this->createQueryBuilder('s');
72
        $qb
73
            ->select('s')
74
            ->innerJoin('s.users', 'sru')
75
            ->leftJoin(AccessUrlRelUser::class, 'uru', Join::WITH, 'uru.user = sru.user')
76
            ->andWhere('sru.user = :user AND uru.url = :url')
77
            ->setParameters([
78
                'user' => $user,
79
                'url' => $url,
80
            ])
81
        ;
82
83
        return $qb->getQuery()->getResult();
84
    }
85
86
    protected function addUserInCourse(
87
        int $status,
88
        User $user,
89
        Course $course,
90
        Session $session
91
    ): void {
92
        if ($session->isActive() &&
93
            $user->getIsActive() &&
94
            $course->isActive() && $session->hasCourse($course)
95
        ) {
96
            switch ($status) {
97
                case Session::DRH:
98
                    if ($user->hasRole('ROLE_RRHH')) {
99
                        $session->addUserInSession(Session::DRH, $user);
100
                    }
101
102
                    break;
103
                case Session::STUDENT:
104
                    $session->addUserInSession(Session::STUDENT, $user);
105
                    $session->addUserInCourse(
106
                        Session::STUDENT,
107
                        $user,
108
                        $course
109
                    );
110
111
                    break;
112
                case Session::COACH:
113
                    if ($user->hasRole('ROLE_TEACHER')) {
114
                        $session->addUserInCourse(
115
                            Session::COACH,
116
                            $user,
117
                            $course
118
                        );
119
                    }
120
121
                    break;
122
            }
123
        }
124
    }
125
126
    private function addSessionRelUserFilterByUrl(Session $session, AccessUrl $url)
127
    {
128
        $qb = $this->getEntityManager()->createQueryBuilder();
129
        $qb
130
            ->select('sru')
131
            ->from(User::class, 'u')
132
            ->innerJoin(SessionRelUser::class, 'sru')
133
            ->innerJoin(AccessUrlRelUser::class, 'uru')
134
            ->andWhere('sru.session = :session AND uru.url = :url')
135
            ->setParameters([
136
                'session' => $session,
137
                'url' => $url,
138
            ])
139
        ;
140
141
        return $qb;
142
    }
143
}
144