<?php
namespace App\Core\Controller\Admin;
use AndreaSprega\Bundle\BreadcrumbBundle\Annotation\Breadcrumb;
use App\Core\Entity\Tournament;
use App\Core\Form\Type\TournamentFromType;
use App\Core\Repository\CompetitionMatchRepository;
use App\Core\Repository\TournamentRepository;
use App\Core\Service\PluginFinder;
use Doctrine\ORM\EntityManagerInterface;
use Symfony\Component\HttpFoundation\Request;
use Symfony\Component\HttpFoundation\Response;
use Symfony\Component\Routing\Annotation\Route;
/**
* @Route("/{_locale}/admin/tournament", name="app_admin_tournament_")
*/
class TournamentAdminController extends AbstractAdminController
{
private EntityManagerInterface $entityManager;
private TournamentRepository $tournamentRepository;
private PluginFinder $pluginFinder;
private CompetitionMatchRepository $competitionMatchRepository;
public function __construct(
EntityManagerInterface $entityManager,
TournamentRepository $tournamentRepository,
PluginFinder $pluginFinder,
CompetitionMatchRepository $competitionMatchRepository
) {
$this->entityManager = $entityManager;
$this->tournamentRepository = $tournamentRepository;
$this->pluginFinder = $pluginFinder;
$this->competitionMatchRepository = $competitionMatchRepository;
}
/**
* @Route("/list", name="list", methods={"GET"})
* @Breadcrumb({
* { "label" = "Home", "route" = "app_admin_home" },
* { "label" = "Tournaments list" }
* })
*
* @param Request $request
* @return Response
*/
public function index(Request $request): Response
{
$tournaments = $this->tournamentRepository->findAll();
return $this->render(
'admin/Tournament/list.html.twig',
[
'user' => $this->getUser(),
'tournament_list' => $tournaments,
'action_plugin_templates' => $this->pluginFinder->getTemplates('/admin/Tournament/plugins/actions'),
]
);
}
/**
* @Route("/{id}/view", name="view", methods={"GET"})
* @Breadcrumb({
* { "label" = "Home", "route" = "app_admin_home" },
* { "label" = "Tournaments list", "route" = "app_admin_tournament_list" },
* })
*
* @param Request $request
* @param Tournament $tournament
* @return Response
*/
public function view(Request $request, Tournament $tournament): Response
{
try {
$activeMatches = $this->competitionMatchRepository->findActiveByTournament($tournament);
} catch (\Exception $exception) {
$activeMatches = [];
}
return $this->render(
'admin/Tournament/view.html.twig',
[
'user' => $this->getUser(),
'tournament' => $tournament,
'active_matches' => $activeMatches,
'action_plugin_templates' => $this->pluginFinder->getTemplates('/admin/Tournament/plugins/actions'),
]
);
}
/**
* @Route("/add", name="add", methods={"GET", "POST"})
* @Breadcrumb({
* { "label" = "Home", "route" = "app_admin_home" },
* { "label" = "Tournaments list", "route" = "app_admin_tournament_list" },
* })
*
* @param Request $request
* @return Response
*/
public function add(Request $request): Response
{
$tournament = new Tournament();
$form = $this->createForm(TournamentFromType::class, $tournament);
$form->handleRequest($request);
$addProcessResponse = $this->processTournament($form);
if ($addProcessResponse !== null) {
return $addProcessResponse;
}
return $this->render(
'admin/Tournament/add.html.twig',
[
'form' => $form->createView(),
]
);
}
/**
* @Route("/{id}/delete", name="delete", methods={"GET"})
*
* @param Request $request
* @param Tournament $tournament
* @return Response
*/
public function delete(Request $request, Tournament $tournament): Response
{
try {
$this->entityManager->remove($tournament);
$this->entityManager->flush();
} catch (\Exception $exception) {
$this->addFlash(
'error',
"Unable to delete tournament!!! Contact admins."
);
}
return $this->redirectToRoute('app_admin_tournament_list');
}
/**
* @Route("/{id}/archive", name="archive", methods={"GET"})
*
* @param Request $request
* @param Tournament $tournament
* @return Response
*/
public function archive(Request $request, Tournament $tournament): Response
{
try {
$tournament->setIsActive(false);
$this->entityManager->flush();
} catch (\Exception $exception) {
$this->addFlash(
'error',
"Unable to archive tournament!!! Contact admins."
);
}
return $this->redirectToRoute('app_admin_tournament_list');
}
/**
* @Route("/{id}/unarchive", name="unarchive", methods={"GET"})
*
* @param Request $request
* @param Tournament $tournament
* @return Response
*/
public function unarchive(Request $request, Tournament $tournament): Response
{
try {
$tournament->setIsActive(true);
$this->entityManager->flush();
} catch (\Exception $exception) {
$this->addFlash(
'error',
"Unable to unarchive tournament!!! Contact admins."
);
}
return $this->redirectToRoute('app_admin_tournament_list');
}
/**
* @Route("/{id}/edit", name="edit", methods={"GET", "POST"})
* @Breadcrumb({
* { "label" = "Home", "route" = "app_admin_home" },
* { "label" = "Tournaments list", "route" = "app_admin_tournament_list" },
* })
*
* @param Request $request
* @param Tournament $tournament
* @return Response
*/
public function edit(Request $request, Tournament $tournament): Response
{
$redirectIfEditIsDisabled = $this->disableEditIfTournamentActive($tournament);
if ($redirectIfEditIsDisabled) {
return $redirectIfEditIsDisabled;
}
$form = $this->createForm(TournamentFromType::class, $tournament);
$form->handleRequest($request);
$editProcessResponse = $this->processTournament($form);
if ($editProcessResponse !== null) {
return $editProcessResponse;
}
return $this->render(
'admin/Tournament/edit.html.twig',
[
'form' => $form->createView(),
]
);
}
private function processTournament($form): ?Response
{
if ($form->isSubmitted() && $form->isValid()) {
/** @var Tournament $tournament */
$tournament = $form->getData();
$this->entityManager->persist($tournament);
$this->entityManager->flush();
$this->addFlash(
'notice',
"Your have saved a tournament: {$tournament->getId()} {$tournament->getName()}"
);
return $this->redirectToRoute('app_admin_tournament_list');
}
return null;
}
}