Skip to content

Commit 7cbb96d

Browse files
committed
Deduplicate some multi entity deletion code.
1 parent 9a00115 commit 7cbb96d

File tree

8 files changed

+93
-98
lines changed

8 files changed

+93
-98
lines changed

webapp/src/Controller/BaseController.php

Lines changed: 28 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -458,6 +458,34 @@ protected function deleteEntities(
458458
* @param array<string, array<array{'target': string, 'targetColumn': string, 'type': string}>> $relations
459459
* @return string[]
460460
*/
461+
protected function deleteMultiple(
462+
Request $request,
463+
string $entityClass,
464+
string $idProperty,
465+
string $redirectRoute,
466+
string $warningMessage,
467+
?callable $filter = null
468+
): Response {
469+
$ids = $request->query->all('ids');
470+
if (empty($ids)) {
471+
throw new BadRequestHttpException('No IDs specified for deletion');
472+
}
473+
474+
$entities = $this->em->getRepository($entityClass)->findBy([$idProperty => $ids]);
475+
476+
if ($filter) {
477+
$entities = array_filter($entities, $filter);
478+
}
479+
480+
if (empty($entities)) {
481+
$this->addFlash('warning', $warningMessage);
482+
return $this->redirectToRoute($redirectRoute);
483+
}
484+
485+
return $this->deleteEntities($request, $entities, $this->generateUrl($redirectRoute));
486+
}
487+
488+
461489
protected function getDependentEntities(string $entityClass, array $relations): array
462490
{
463491
$result = [];

webapp/src/Controller/Jury/ProblemController.php

Lines changed: 8 additions & 27 deletions
Original file line numberDiff line numberDiff line change
@@ -1032,33 +1032,14 @@ public function editAction(Request $request, int $probId): Response
10321032
#[Route(path: '/delete-multiple', name: 'jury_problem_delete_multiple', methods: ['GET', 'POST'])]
10331033
public function deleteMultipleAction(Request $request): Response
10341034
{
1035-
$ids = $request->query->all('ids');
1036-
if (empty($ids)) {
1037-
throw new BadRequestHttpException('No IDs specified for deletion');
1038-
}
1039-
1040-
$problems = $this->em->getRepository(Problem::class)->findBy(['probid' => $ids]);
1041-
1042-
$deletableProblems = [];
1043-
foreach ($problems as $problem) {
1044-
$isLocked = false;
1045-
foreach ($problem->getContestProblems() as $contestProblem) {
1046-
if ($contestProblem->getContest()->isLocked()) {
1047-
$isLocked = true;
1048-
break;
1049-
}
1050-
}
1051-
if (!$isLocked) {
1052-
$deletableProblems[] = $problem;
1053-
}
1054-
}
1055-
1056-
if (empty($deletableProblems)) {
1057-
$this->addFlash('warning', 'No problems could be deleted (they might be locked).');
1058-
return $this->redirectToRoute('jury_problems');
1059-
}
1060-
1061-
return $this->deleteEntities($request, $deletableProblems, $this->generateUrl('jury_problems'));
1035+
return $this->deleteMultiple(
1036+
$request,
1037+
Problem::class,
1038+
'probid',
1039+
'jury_problems',
1040+
'No problems could be deleted (they might be locked).',
1041+
fn(Problem $problem) => !$problem->isLocked()
1042+
);
10621043
}
10631044

10641045
#[IsGranted('ROLE_ADMIN')]

webapp/src/Controller/Jury/TeamAffiliationController.php

Lines changed: 7 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -223,14 +223,13 @@ public function deleteAction(Request $request, int $affilId): Response
223223
#[Route(path: '/delete-multiple', name: 'jury_team_affiliation_delete_multiple', methods: ['GET', 'POST'])]
224224
public function deleteMultipleAction(Request $request): Response
225225
{
226-
$ids = $request->query->all('ids');
227-
if (empty($ids)) {
228-
throw new BadRequestHttpException('No IDs specified for deletion');
229-
}
230-
231-
$affiliations = $this->em->getRepository(TeamAffiliation::class)->findBy(['affilid' => $ids]);
232-
233-
return $this->deleteEntities($request, $affiliations, $this->generateUrl('jury_team_affiliations'));
226+
return $this->deleteMultiple(
227+
$request,
228+
TeamAffiliation::class,
229+
'affilid',
230+
'jury_team_affiliations',
231+
'No affiliations could be deleted.'
232+
);
234233
}
235234

236235
#[IsGranted('ROLE_ADMIN')]

webapp/src/Controller/Jury/TeamCategoryController.php

Lines changed: 7 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -252,14 +252,13 @@ public function addAction(Request $request): Response
252252
#[Route(path: '/delete-multiple', name: 'jury_team_category_delete_multiple', methods: ['GET', 'POST'])]
253253
public function deleteMultipleAction(Request $request): Response
254254
{
255-
$ids = $request->query->all('ids');
256-
if (empty($ids)) {
257-
throw new BadRequestHttpException('No IDs specified for deletion');
258-
}
259-
260-
$categories = $this->em->getRepository(TeamCategory::class)->findBy(['categoryid' => $ids]);
261-
262-
return $this->deleteEntities($request, $categories, $this->generateUrl('jury_team_categories'));
255+
return $this->deleteMultiple(
256+
$request,
257+
TeamCategory::class,
258+
'categoryid',
259+
'jury_team_categories',
260+
'No categories could be deleted.'
261+
);
263262
}
264263

265264
#[Route(path: '/{categoryId<\d+>}/request-remaining', name: 'jury_team_category_request_remaining')]

webapp/src/Controller/Jury/TeamController.php

Lines changed: 8 additions & 35 deletions
Original file line numberDiff line numberDiff line change
@@ -387,41 +387,14 @@ public function deleteAction(Request $request, int $teamId): Response
387387
#[Route(path: '/delete-multiple', name: 'jury_team_delete_multiple', methods: ['GET', 'POST'])]
388388
public function deleteMultipleAction(Request $request): Response
389389
{
390-
$ids = $request->query->all('ids');
391-
if (empty($ids)) {
392-
throw new BadRequestHttpException('No IDs specified for deletion');
393-
}
394-
395-
$teams = $this->em->getRepository(Team::class)->findBy(['teamid' => $ids]);
396-
397-
$deletableTeams = [];
398-
foreach ($teams as $team) {
399-
$isLocked = false;
400-
foreach ($team->getContests() as $contest) {
401-
if ($contest->isLocked()) {
402-
$isLocked = true;
403-
break;
404-
}
405-
}
406-
if (!$isLocked && $team->getCategory()) {
407-
foreach ($team->getCategory()->getContests() as $contest) {
408-
if ($contest->isLocked()) {
409-
$isLocked = true;
410-
break;
411-
}
412-
}
413-
}
414-
if (!$isLocked) {
415-
$deletableTeams[] = $team;
416-
}
417-
}
418-
419-
if (empty($deletableTeams)) {
420-
$this->addFlash('warning', 'No teams could be deleted (they might be in a locked contest).');
421-
return $this->redirectToRoute('jury_teams');
422-
}
423-
424-
return $this->deleteEntities($request, $deletableTeams, $this->generateUrl('jury_teams'));
390+
return $this->deleteMultiple(
391+
$request,
392+
Team::class,
393+
'teamid',
394+
'jury_teams',
395+
'No teams could be deleted (they might be in a locked contest).',
396+
fn(Team $team) => !$team->isLocked()
397+
);
425398
}
426399

427400
#[IsGranted('ROLE_ADMIN')]

webapp/src/Controller/Jury/UserController.php

Lines changed: 8 additions & 20 deletions
Original file line numberDiff line numberDiff line change
@@ -415,25 +415,13 @@ public function resetTeamLoginStatus(Request $request): Response
415415
#[Route(path: '/delete-multiple', name: 'jury_user_delete_multiple', methods: ['GET', 'POST'])]
416416
public function deleteMultipleAction(Request $request): Response
417417
{
418-
$ids = $request->query->all('ids');
419-
if (empty($ids)) {
420-
throw new BadRequestHttpException('No IDs specified for deletion');
421-
}
422-
423-
$users = $this->em->getRepository(User::class)->findBy(['userid' => $ids]);
424-
425-
$deletableUsers = [];
426-
foreach ($users as $user) {
427-
if ($user->getUserid() !== $this->dj->getUser()->getUserid()) {
428-
$deletableUsers[] = $user;
429-
}
430-
}
431-
432-
if (empty($deletableUsers)) {
433-
$this->addFlash('warning', 'No users could be deleted (you cannot delete your own account).');
434-
return $this->redirectToRoute('jury_users');
435-
}
436-
437-
return $this->deleteEntities($request, $deletableUsers, $this->generateUrl('jury_users'));
418+
return $this->deleteMultiple(
419+
$request,
420+
User::class,
421+
'userid',
422+
'jury_users',
423+
'No users could be deleted (you cannot delete your own account).',
424+
fn(User $user) => $user->getUserid() !== $this->dj->getUser()->getUserid()
425+
);
438426
}
439427
}

webapp/src/Entity/Problem.php

Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -682,4 +682,14 @@ public function removeLanguage(Language $language): Problem
682682
$this->languages->removeElement($language);
683683
return $this;
684684
}
685+
686+
public function isLocked(): bool
687+
{
688+
foreach ($this->getContestProblems() as $contestProblem) {
689+
if ($contestProblem->getContest()->isLocked()) {
690+
return true;
691+
}
692+
}
693+
return false;
694+
}
685695
}

webapp/src/Entity/Team.php

Lines changed: 17 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -661,4 +661,21 @@ public function getPhotoForApi(): array
661661
{
662662
return array_filter([$this->photoForApi]);
663663
}
664+
665+
public function isLocked(): bool
666+
{
667+
foreach ($this->getContests() as $contest) {
668+
if ($contest->isLocked()) {
669+
return true;
670+
}
671+
}
672+
if ($this->getCategory()) {
673+
foreach ($this->getCategory()->getContests() as $contest) {
674+
if ($contest->isLocked()) {
675+
return true;
676+
}
677+
}
678+
}
679+
return false;
680+
}
664681
}

0 commit comments

Comments
 (0)