From 751a1663d1d41746d1855b57b853104869a48458 Mon Sep 17 00:00:00 2001 From: Michael Vasseur <14887731+vmcj@users.noreply.github.com> Date: Sat, 5 Jul 2025 10:51:14 +0200 Subject: [PATCH] Expose samples/problemset after the contest start (cherry picked from commit 84925260ecf318c1911260b6a3ae71104fec9cb1) --- .../src/Controller/API/AbstractApiController.php | 15 ++++++++++++--- webapp/src/Controller/API/ContestController.php | 10 +++++----- 2 files changed, 17 insertions(+), 8 deletions(-) diff --git a/webapp/src/Controller/API/AbstractApiController.php b/webapp/src/Controller/API/AbstractApiController.php index 219c53b6b0..92eddb8569 100644 --- a/webapp/src/Controller/API/AbstractApiController.php +++ b/webapp/src/Controller/API/AbstractApiController.php @@ -33,9 +33,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 @@ -62,6 +64,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; @@ -76,7 +82,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('c.externalid = :cid') ->setParameter('cid', $request->attributes->get('cid')); diff --git a/webapp/src/Controller/API/ContestController.php b/webapp/src/Controller/API/ContestController.php index f6816e6938..24f46b76c0 100644 --- a/webapp/src/Controller/API/ContestController.php +++ b/webapp/src/Controller/API/ContestController.php @@ -180,7 +180,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() @@ -950,10 +950,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', true)); + return $this->getContestQueryBuilder($request->query->getBoolean('onlyActive', true), $filterBeforeContest); } catch (TypeError) { throw new BadRequestHttpException('\'onlyActive\' must be a boolean.'); } @@ -970,7 +970,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); @@ -987,7 +987,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()