/** * Basic tests for shareable scoreboard url */ public function testScoreboardUrlNoLogin() { // Get a private contest with 0% of scoreboard show percentage $contestData = ContestsFactory::createContest(null, 0); ContestsFactory::setScoreboardPercentage($contestData, 0); // Create problem $problemData = ProblemsFactory::createProblem(); ContestsFactory::addProblemToContest($problemData, $contestData); // Create our contestant, will submit 1 run $contestant = UserFactory::createUser(); ContestsFactory::addUser($contestData, $contestant); $runData = RunsFactory::createRun($problemData, $contestData, $contestant); RunsFactory::gradeRun($runData); // Get the scoreboard url by using the MyList api being the // contest director $response = ContestController::apiMyList(new Request(array('auth_token' => $this->login($contestData['director'])))); // Look for our contest from the list and save the scoreboard tokens $scoreboard_url = null; $scoreboard_admin_url = null; foreach ($response['results'] as $c) { if ($c['alias'] === $contestData['request']['alias']) { $scoreboard_url = $c['scoreboard_url']; $scoreboard_admin_url = $c['scoreboard_url_admin']; break; } } $this->assertNotNull($scoreboard_url); $this->assertNotNull($scoreboard_admin_url); // Call scoreboard api from the user $scoreboardResponse = ContestController::apiScoreboard(new Request(array('contest_alias' => $contestData['request']['alias'], 'token' => $scoreboard_url))); $this->assertEquals('0', $scoreboardResponse['ranking'][0]['total']['points']); // Call scoreboard api from the user with admin token $scoreboardResponse = ContestController::apiScoreboard(new Request(array('contest_alias' => $contestData['request']['alias'], 'token' => $scoreboard_admin_url))); $this->assertEquals('100', $scoreboardResponse['ranking'][0]['total']['points']); }
/** * Get Contests which a certain user has participated in * * @param Request $r * @return Contests array * @throws InvalidDatabaseOperationException */ public static function apiContestStats(Request $r) { self::authenticateOrAllowUnauthenticatedRequest($r); $response = array(); $response['contests'] = array(); $user = self::resolveTargetUser($r); // Get contests where user had at least 1 run try { $contestsParticipated = ContestsDAO::getContestsParticipated($user->getUserId()); } catch (Exception $e) { throw new InvalidDatabaseOperationException($e); } $contests = array(); foreach ($contestsParticipated as $contest) { // Get user ranking $scoreboardR = new Request(array('auth_token' => $r['auth_token'], 'contest_alias' => $contest->getAlias(), 'token' => $contest->getScoreboardUrlAdmin())); $scoreboardResponse = ContestController::apiScoreboard($scoreboardR); // Grab the place of the current user in the given contest $contests[$contest->getAlias()]['place'] = null; foreach ($scoreboardResponse['ranking'] as $userData) { if ($userData['username'] == $user->getUsername()) { $contests[$contest->getAlias()]['place'] = $userData['place']; break; } } $contest->toUnixTime(); $contests[$contest->getAlias()]['data'] = $contest->asArray(); } $response['contests'] = $contests; $response['status'] = 'ok'; return $response; }
/** * Get Contests which a certain user has participated in * * @param Request $r * @return Contests array * @throws InvalidDatabaseOperationException */ public static function apiContestStats(Request $r) { self::authenticateOrAllowUnauthenticatedRequest($r); $response = array(); $response["contests"] = array(); $user = self::resolveTargetUser($r); $contest_user_key = new ContestsUsers(); $contest_user_key->setUserId($user->getUserId()); // Get contests where user had at least 1 run try { $contestsParticipated = ContestsDAO::getContestsParticipated($user->getUserId()); } catch (Exception $e) { throw new InvalidDatabaseOperationException($e); } $contests = array(); foreach ($contestsParticipated as $contest) { // Get user ranking $scoreboardR = new Request(array("auth_token" => $r["auth_token"], "contest_alias" => $contest->getAlias(), "token" => $contest->getScoreboardUrlAdmin())); $scoreboardResponse = ContestController::apiScoreboard($scoreboardR); // Grab the place of the current user in the given contest $contests[$contest->getAlias()]["place"] = null; foreach ($scoreboardResponse["ranking"] as $userData) { if ($userData["username"] == $user->getUsername()) { $contests[$contest->getAlias()]["place"] = $userData["place"]; break; } } $contest->toUnixTime(); $contests[$contest->getAlias()]["data"] = $contest->asArray(); } $response["contests"] = $contests; $response["status"] = "ok"; return $response; }