*/ 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 array */ public function getUsersByAccessUrl(Session $session, AccessUrl $url, array $onlyTypes = []): array { if (0 === $session->getUsers()->count()) { return []; } $qb = $this->addSessionRelUserFilterByUrl($session, $url); $qb->orderBy('sru.relationType'); if ($onlyTypes) { $qb->andWhere( $qb->expr()->in('sru.relationType', $onlyTypes) ); } 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; } }