/** * Returns a list of contests * * @param Request $r * @return array * @throws InvalidDatabaseOperationException */ public static function apiList(Request $r) { // Check who is visiting, but a not logged user can still view // the list of contests try { self::authenticateRequest($r); } catch (UnauthorizedException $e) { // Do nothing } // Create array of relevant columns $relevant_columns = array('contest_id', 'title', 'description', 'start_time', 'finish_time', 'public', 'alias', 'director_id', 'window_length', 'recommended'); try { // Get all contests using only relevan columns $contests = ContestsDAO::getAllMultipleOrder(null, null, array(array('column' => 'recommended', 'type' => 'DESC'), array('column' => 'finish_time', 'type' => 'DESC')), $relevant_columns); } catch (Exception $e) { throw new InvalidDatabaseOperationException($e); } // DAO requires contest_id as relevant column but we don't want to expose it array_shift($relevant_columns); /** * Ok, lets go 1 by 1, and if its public, show it, * if its not, check if the user has access to it. * */ $addedContests = array(); foreach ($contests as $c) { // At most we want 1000 contests @TODO paginar correctamente if (sizeof($addedContests) == 1000) { break; } if ($c->getPublic()) { $c->toUnixTime(); $contestInfo = $c->asFilteredArray($relevant_columns); $contestInfo['duration'] = is_null($c->getWindowLength()) ? $c->getFinishTime() - $c->getStartTime() : $c->getWindowLength() * 60; $addedContests[] = $contestInfo; continue; } /* * Ok, its not public, lets se if we have a * valid user * */ if ($r['current_user_id'] === null) { continue; } /** * Ok, i have a user. Can he see this contest ? * */ try { $contestUser = ContestsUsersDAO::getByPK($r['current_user_id'], $c->getContestId()); } catch (Exception $e) { throw new InvalidDatabaseOperationException($e); } // Admins can see all contests if ($contestUser === null && !Authorization::IsContestAdmin($r['current_user_id'], $c)) { /** * Nope, he cant . * */ continue; } /** * He can see it ! * * */ $c->toUnixTime(); $contestInfo = $c->asFilteredArray($relevant_columns); $contestInfo['duration'] = is_null($c->getWindowLength()) ? $c->getFinishTime() - $c->getStartTime() : $c->getWindowLength() * 60; $addedContests[] = $contestInfo; } return array('number_of_results' => sizeof($addedContests), 'results' => $addedContests); }