Chamilo is a learning management system focused on ease of use and accessibility
You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
chamilo-lms/src/CoreBundle/Repository/SessionRepository.php

173 lines
4.8 KiB

<?php
declare(strict_types=1);
/* For licensing terms, see /license.txt */
11 years ago
namespace Chamilo\CoreBundle\Repository;
use Chamilo\CoreBundle\Entity\AccessUrl;
use Chamilo\CoreBundle\Entity\AccessUrlRelUser;
use Chamilo\CoreBundle\Entity\Course;
use Chamilo\CoreBundle\Entity\Session;
use Chamilo\CoreBundle\Entity\SessionRelCourseRelUser;
use Chamilo\CoreBundle\Entity\SessionRelUser;
use Chamilo\CoreBundle\Entity\User;
use Doctrine\Bundle\DoctrineBundle\Repository\ServiceEntityRepository;
use Doctrine\ORM\Query\Expr\Join;
use Doctrine\ORM\QueryBuilder;
use Doctrine\Persistence\ManagerRegistry;
use Exception;
/**
* SessionRepository.
*
* @author Julio Montoya <gugli100@gmail.com>
*/
class SessionRepository extends ServiceEntityRepository
{
public function __construct(ManagerRegistry $registry)
{
parent::__construct($registry, Session::class);
}
public function create(): ?Session
{
return new Session();
}
public function update(Session $session): void
{
$this->getEntityManager()->persist($session);
$this->getEntityManager()->flush();
}
/**
* @return SessionRelUser[]
*/
public function getUsersByAccessUrl(Session $session, AccessUrl $url)
{
if (0 === $session->getUsers()->count()) {
return [];
}
$qb = $this->addSessionRelUserFilterByUrl($session, $url);
$qb->orderBy('sru.relationType');
return $qb->getQuery()->getResult();
}
/**
* @return SessionRelUser[]
*/
public function getUsersByCourse(Session $session, Course $course, AccessUrl $url)
{
if (0 === $session->getUsers()->count()) {
return [];
}
$qb = $this->addSessionRelUserFilterByUrl($session, $url);
$qb
->innerJoin(SessionRelCourseRelUser::class, 'srcu')
->andWhere('srcu.session = :session AND srcu.course = :course ')
->setParameters([
'course' => $course,
'session' => $session,
])
;
return $qb->getQuery()->getResult();
}
/**
* @return Session[]
*/
public function getSessionsByUser(User $user, AccessUrl $url)
{
$qb = $this->createQueryBuilder('s');
$qb
->select('s')
->innerJoin('s.users', 'sru')
->leftJoin(AccessUrlRelUser::class, 'uru', Join::WITH, 'uru.user = sru.user')
->andWhere('sru.user = :user AND uru.url = :url')
->setParameters([
'user' => $user,
'url' => $url,
])
;
return $qb->getQuery()->getResult();
}
public function addUserInCourse(int $status, User $user, Course $course, Session $session): void
{
if (!$session->isActive()) {
throw new Exception('Session not active');
}
if (!$user->isActive()) {
throw new Exception('User not active');
}
if (!$course->isActive()) {
throw new Exception('Course not active');
}
if (!$session->hasCourse($course)) {
$msg = sprintf('Course %s is not subscribed to the session %s', $course->getTitle(), $session->getName());
throw new Exception($msg);
}
switch ($status) {
case Session::DRH:
if ($user->hasRole('ROLE_RRHH')) {
$session->addUserInSession(Session::DRH, $user);
}
break;
case Session::STUDENT:
$session
->addUserInSession(Session::STUDENT, $user)
->addUserInCourse(
Session::STUDENT,
$user,
$course
)
;
break;
case Session::COURSE_COACH:
if ($user->hasRole('ROLE_TEACHER')) {
$session->addUserInCourse(
Session::COURSE_COACH,
$user,
$course
);
}
break;
default:
throw new Exception(sprintf('Cannot handle status %s', $status));
}
}
private function addSessionRelUserFilterByUrl(Session $session, AccessUrl $url): QueryBuilder
{
$qb = $this->getEntityManager()->createQueryBuilder();
$qb
->select('sru')
->from(User::class, 'u')
->innerJoin(SessionRelUser::class, 'sru')
->innerJoin(AccessUrlRelUser::class, 'uru')
->andWhere('sru.session = :session AND uru.url = :url')
->setParameters([
'session' => $session,
'url' => $url,
])
;
return $qb;
}
}