diff --git a/public/main/inc/lib/sessionmanager.lib.php b/public/main/inc/lib/sessionmanager.lib.php index 851c384018..17e4f3ffd1 100644 --- a/public/main/inc/lib/sessionmanager.lib.php +++ b/public/main/inc/lib/sessionmanager.lib.php @@ -5558,13 +5558,10 @@ class SessionManager } } - $userList[] = $user_id; - // Insert new users. - $sql = "INSERT IGNORE INTO $tbl_session_user SET - user_id = '$user_id', - session_id = '$session_id', - registered_at = '".api_get_utc_datetime()."'"; - Database::query($sql); + $userEntity = api_get_user_entity($user_id); + $sessionEntity = api_get_session_entity($session_id); + $sessionEntity->addUserInSession(Session::STUDENT, $userEntity); + if ($debug) { $logger->debug("Adding User #$user_id ($user) to session #$session_id"); } diff --git a/src/CoreBundle/Entity/Session.php b/src/CoreBundle/Entity/Session.php index 0bda39bde5..d190a2ad86 100644 --- a/src/CoreBundle/Entity/Session.php +++ b/src/CoreBundle/Entity/Session.php @@ -260,7 +260,7 @@ class Session implements ResourceWithAccessUrlInterface, Stringable 'session:write', ])] #[ORM\Column(name: 'show_description', type: 'boolean', nullable: true)] - protected ?bool $showDescription; + protected ?bool $showDescription = false; #[Groups(['session:read', 'session:write', 'user_subscriptions:sessions'])] #[ORM\Column(name: 'duration', type: 'integer', nullable: true)] @@ -446,7 +446,7 @@ class Session implements ResourceWithAccessUrlInterface, Stringable public function getShowDescription(): bool { - return $this->showDescription; + return $this->showDescription ?? false; } public function setShowDescription(bool $showDescription): self @@ -810,7 +810,18 @@ class Session implements ResourceWithAccessUrlInterface, Stringable public function addUserInSession(int $relationType, User $user): self { - $sessionRelUser = (new SessionRelUser())->setUser($user)->setRelationType($relationType); + foreach ($this->getUsers() as $existingSubscription) { + if ( + $existingSubscription->getUser()->getId() === $user->getId() && + $existingSubscription->getRelationType() === $relationType + ) { + return $this; + } + } + + $sessionRelUser = (new SessionRelUser()) + ->setUser($user) + ->setRelationType($relationType); $this->addUserSubscription($sessionRelUser); return $this; @@ -985,8 +996,12 @@ class Session implements ResourceWithAccessUrlInterface, Stringable * If user status in session is student, then increase number of course users. * Status example: Session::STUDENT. */ - public function addUserInCourse(int $status, User $user, Course $course): SessionRelCourseRelUser + public function addUserInCourse(int $status, User $user, Course $course): ?SessionRelCourseRelUser { + if ($this->hasUserInCourse($user, $course, $status)) { + return null; + } + $userRelCourseRelSession = (new SessionRelCourseRelUser()) ->setCourse($course) ->setUser($user) @@ -998,7 +1013,9 @@ class Session implements ResourceWithAccessUrlInterface, Stringable if (self::STUDENT === $status) { $sessionCourse = $this->getCourseSubscription($course); - $sessionCourse->setNbrUsers($sessionCourse->getNbrUsers() + 1); + if ($sessionCourse) { + $sessionCourse->setNbrUsers($sessionCourse->getNbrUsers() + 1); + } } return $userRelCourseRelSession;