Passed
Push — master ( c12494...619086 )
by Julito
15:29
created

SessionRepository::create()   A

Complexity

Conditions 1
Paths 1

Size

Total Lines 4
Code Lines 2

Duplication

Lines 0
Ratio 0 %

Importance

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