diff --git a/webapp/src/Controller/API/AbstractApiController.php b/webapp/src/Controller/API/AbstractApiController.php index 163f000bba..b5c43a76d9 100644 --- a/webapp/src/Controller/API/AbstractApiController.php +++ b/webapp/src/Controller/API/AbstractApiController.php @@ -34,9 +34,11 @@ public function __construct( * Get the query builder used for getting contests. * * @param bool $onlyActive return only contests that are active + * @param bool $filterBeforeContest return only contests that have started */ - protected function getContestQueryBuilder(bool $onlyActive = false): QueryBuilder - { + protected function getContestQueryBuilder( + bool $onlyActive = false, bool $filterBeforeContest = true + ): QueryBuilder { $now = Utils::now(); $qb = $this->em->createQueryBuilder(); $qb @@ -63,6 +65,10 @@ protected function getContestQueryBuilder(bool $onlyActive = false): QueryBuilde } else { $qb->andWhere('c.public = 1'); } + if ($filterBeforeContest) { + $qb->andWhere('c.starttime <= :now') + ->setParameter('now', $now); + } } return $qb; @@ -77,7 +83,10 @@ protected function getContestId(Request $request): int throw new BadRequestHttpException('cid parameter missing'); } - $qb = $this->getContestQueryBuilder($request->query->getBoolean('onlyActive', false)); + $qb = $this->getContestQueryBuilder( + onlyActive: $request->query->getBoolean('onlyActive', false), + filterBeforeContest: false + ); $qb ->andWhere(sprintf('c.%s = :cid', $this->getContestIdField())) ->setParameter('cid', $request->attributes->get('cid')); diff --git a/webapp/src/Controller/API/ContestController.php b/webapp/src/Controller/API/ContestController.php index 317d49cdcb..b0f4ce8ceb 100644 --- a/webapp/src/Controller/API/ContestController.php +++ b/webapp/src/Controller/API/ContestController.php @@ -179,7 +179,7 @@ public function singleAction(Request $request, string $cid): Response public function bannerAction(Request $request, string $cid): Response { /** @var Contest|null $contest */ - $contest = $this->getQueryBuilder($request) + $contest = $this->getQueryBuilder($request, filterBeforeContest: false) ->andWhere(sprintf('%s = :id', $this->getIdField())) ->setParameter('id', $cid) ->getQuery() @@ -934,10 +934,10 @@ public function samplesDataZipAction(Request $request): Response return $this->dj->getSamplesZipForContest($contest); } - protected function getQueryBuilder(Request $request): QueryBuilder + protected function getQueryBuilder(Request $request, bool $filterBeforeContest = true): QueryBuilder { try { - return $this->getContestQueryBuilder($request->query->getBoolean('onlyActive', false)); + return $this->getContestQueryBuilder($request->query->getBoolean('onlyActive', false), $filterBeforeContest); } catch (TypeError) { throw new BadRequestHttpException('\'onlyActive\' must be a boolean.'); } @@ -954,7 +954,7 @@ protected function getIdField(): string */ protected function getContestWithId(Request $request, string $id): Contest { - $queryBuilder = $this->getQueryBuilder($request) + $queryBuilder = $this->getQueryBuilder($request, filterBeforeContest: false) ->andWhere(sprintf('%s = :id', $this->getIdField())) ->setParameter('id', $id); @@ -971,7 +971,7 @@ protected function getContestWithId(Request $request, string $id): Contest private function getContestAndCheckIfLocked(Request $request, string $cid): Contest { /** @var Contest|null $contest */ - $contest = $this->getQueryBuilder($request) + $contest = $this->getQueryBuilder($request, filterBeforeContest: false) ->andWhere(sprintf('%s = :id', $this->getIdField())) ->setParameter('id', $cid) ->getQuery()