sessionRepository->createQueryBuilder('s') ->innerJoin('s.players', 'p') ->where('p.user = :user') ->setParameter('user', $user) ->getQuery() ->getResult(); } /** * @return Game[] */ public function getAvailableGames(bool $isAdmin): array { if ($isAdmin) { return $this->gameRepository->findAll(); } return $this->gameRepository->findBy(['status' => GameStatus::OPEN]); } public function createSession(Game $game, UserInterface $user, bool $isAdmin): ?Session { if ($game->getStatus() !== GameStatus::OPEN && !$isAdmin) { return null; } if(!$user instanceof User) return null; $session = new Session(); $session->setGame($game); $session->setStatus(SessionStatus::CREATED); $session->setTimer(0); $player = new Player(); $player->setUser($user); $player->setSession($session); $player->setScreen(1); $this->entityManager->persist($session); $this->entityManager->persist($player); $this->entityManager->flush(); return $session; } public function generateInviteCode(Session $session, UserInterface $user, bool $isAdmin): ?string { // Security check: is user part of this session? $isPlayer = false; foreach ($session->getPlayers() as $player) { if ($player->getUser() === $user) { $isPlayer = true; break; } } if (!$isPlayer && !$isAdmin) { return null; } $inviteCode = bin2hex(random_bytes(4)); $setting = null; foreach ($session->getSettings() as $s) { if ($s->getName() === SessionSettingType::INVITE_CODE) { $setting = $s; break; } } if (!$setting) { $setting = new SessionSetting(); $setting->setSession($session); $setting->setName(SessionSettingType::INVITE_CODE); } $setting->setValue($inviteCode); $this->entityManager->persist($setting); $this->entityManager->flush(); return $inviteCode; } }