|
@@ -33,25 +33,151 @@ final class PartyController extends AbstractController
|
|
|
|
|
|
// supprimer une partie
|
|
// supprimer une partie
|
|
#[Route('/party/delete/{id}', name: 'app_party_delete', requirements: ['id' => Requirement::UUID_V7], methods: ['GET'])]
|
|
#[Route('/party/delete/{id}', name: 'app_party_delete', requirements: ['id' => Requirement::UUID_V7], methods: ['GET'])]
|
|
- public function delete(?Party $party, EntityManager $manager, SlotRepository $slotRepository): Response
|
|
|
|
|
|
+ public function delete(?Party $party, EntityManagerInterface $manager, SlotRepository $slotRepository): Response
|
|
{
|
|
{
|
|
// Seuls admin (ADMIN)
|
|
// Seuls admin (ADMIN)
|
|
$user = $this->getUser();
|
|
$user = $this->getUser();
|
|
- if (!in_array('ROLE_ADMIN', $roles)) {}
|
|
|
|
-
|
|
|
|
|
|
+ $roles = $user->getRoles();
|
|
|
|
+ if (in_array('ROLE_ADMIN', $roles)) {
|
|
|
|
+ if ($party) {
|
|
|
|
+ $party->purgeSlots();
|
|
|
|
+ $manager->remove($party);
|
|
|
|
+ $manager->flush($party);
|
|
|
|
+ $this->addFlash('success', 'Partie supprimée !');
|
|
|
|
+ } else {
|
|
|
|
+ $this->addFlash('danger', 'Partie inexistante');
|
|
|
|
+ }
|
|
|
|
+ } else {
|
|
|
|
+ $this->addFlash('danger', 'Seuls les admins peuvent supprimer une partie.');
|
|
|
|
+ }
|
|
|
|
+ return $this->redirectToRoute('app_main'); // @todo: à changer
|
|
}
|
|
}
|
|
|
|
|
|
// valider une partie proposée par un MJ
|
|
// valider une partie proposée par un MJ
|
|
- #[Route('/party/validate/{id}', name: 'app_party_delete', requirements: ['id' => Requirement::UUID_V7], methods: ['GET'])]
|
|
|
|
- public function validate(?Party $party, EntityManager $manager, SlotRepository $slotRepository): Response
|
|
|
|
|
|
+ #[Route('/party/validate/{id}', name: 'app_party_validate', requirements: ['id' => Requirement::UUID_V7], methods: ['GET'])]
|
|
|
|
+ public function validate(?Party $party, EntityManagerInterface $manager, SlotRepository $slotRepository): Response
|
|
{
|
|
{
|
|
// Seuls gestionnaires (MANAGER), admin (ADMIN)
|
|
// Seuls gestionnaires (MANAGER), admin (ADMIN)
|
|
$user = $this->getUser();
|
|
$user = $this->getUser();
|
|
- if (!in_array('ROLE_ADMIN', $roles) && !in_array('ROLE_MANAGER', $roles)) {}
|
|
|
|
-
|
|
|
|
|
|
+ $roles = $user->getRoles();
|
|
|
|
+ if (in_array('ROLE_ADMIN', $roles) || in_array('ROLE_MANAGER', $roles)) {
|
|
|
|
+ if ($party) {
|
|
|
|
+ $party->setValidated(true);
|
|
|
|
+ $manager->persist($party);
|
|
|
|
+ $manager->flush($party);
|
|
|
|
+ $this->addFlash('success', 'Partie validée !');
|
|
|
|
+ } else {
|
|
|
|
+ $this->addFlash('danger', 'Partie inexistante');
|
|
|
|
+ }
|
|
|
|
+ } else {
|
|
|
|
+ $this->addFlash('danger', 'Seuls les rôles Gestionnaires et Admin peuvent valider une partie');
|
|
|
|
+ }
|
|
|
|
+ return $this->redirectToRoute('app_main'); // @todo: à changer
|
|
}
|
|
}
|
|
|
|
|
|
// modifier une partie
|
|
// modifier une partie
|
|
|
|
+ #[Route('/party/modify/{id}', name: 'app_party_modify', requirements: ['id' => '\d+'], methods: ['GET','POST'])]
|
|
|
|
+ public function modify(?Slot $slot, Request $request, SlotRepository $slotRepository, GamemasterRepository $gamemasterRepository, GameRepository $gameRepository, EntityManagerInterface $manager): Response
|
|
|
|
+ {
|
|
|
|
+ // Seuls gestionnaires (MANAGER), admin (ADMIN) ou un MJ de l'asso (STAFF) qui est associé à l'événement
|
|
|
|
+ $this->denyAccessUnlessGranted(SlotAccessVoter::ACCESS_SLOT, $slot);
|
|
|
|
+
|
|
|
|
+ $user = $this->getUser();
|
|
|
|
+
|
|
|
|
+ $party = $slot->getParty();
|
|
|
|
+ if (!$party) {
|
|
|
|
+ $this->addFlash('danger', 'Pas de MJ ou de jeu sélectionné.');
|
|
|
|
+ $this->redirectToRoute('app_main'); // @todo: à modifier
|
|
|
|
+ }
|
|
|
|
+
|
|
|
|
+ $roles = $user->getRoles();
|
|
|
|
+
|
|
|
|
+ // Check MJ
|
|
|
|
+ if (in_array('ROLE_STAFF', $roles) && !(in_array('ROLE_ADMIN', $roles) || in_array('ROLE_MANAGER', $roles))) {
|
|
|
|
+ // C'est un MJ, est-ce qu'il édite bien l'une de ses parties
|
|
|
|
+ $gamemasters[] = $user->getLinkToGamemaster();
|
|
|
|
+ if ($party->gamemaster != $gamemasters[0]) {
|
|
|
|
+ // Alors dégage !
|
|
|
|
+ $this->addFlash('danger', 'Un MJ ne peut éditer que ses parties.');
|
|
|
|
+ $this->redirectToRoute('app_main'); // @todo: à modifier
|
|
|
|
+ }
|
|
|
|
+ } else {
|
|
|
|
+ $gamemasters = $slot->getEvent()->getGamemastersAssigned();
|
|
|
|
+ }
|
|
|
|
+
|
|
|
|
+ // Création des valeurs dispo pour les formulaire
|
|
|
|
+ $games = $slot->getEvent()->getGameAssigned();
|
|
|
|
+ $lastSlot = $party->getSlots()->last();
|
|
|
|
+ $getSlotsAvailables = $slotRepository->findNextsAvailables($lastSlot);
|
|
|
|
+ $slotStart = $slot;
|
|
|
|
+ $slotsAvailables = array_merge($party->getSlots()->toArray(), $getSlotsAvailables);
|
|
|
|
+
|
|
|
|
+ $form = $this->createForm(PartyType::class, $party);
|
|
|
|
+
|
|
|
|
+ $form->handleRequest($request);
|
|
|
|
+ if ($form->isSubmitted() && $form->isValid()) {
|
|
|
|
+
|
|
|
|
+ // Ajouter les slots séléctionnés
|
|
|
|
+ $slotsString = $request->request->get('party_slots');
|
|
|
|
+ $gamemasterSelectedId = $request->request->get('party_gamemaster');
|
|
|
|
+ $gamemasterSelected = $gamemasterRepository->findByStrID($gamemasterSelectedId);
|
|
|
|
+ $gameSelectedId = $request->request->get('party_game');
|
|
|
|
+ $gameSelected = $gameRepository->findByStrID($gameSelectedId);
|
|
|
|
+
|
|
|
|
+ if ($gameSelected && $gamemasterSelected) {
|
|
|
|
+ $party->purgeSlots();
|
|
|
|
+ $new_slots = explode("|", $slotsString);
|
|
|
|
+ foreach($new_slots as $add_this_slot) {
|
|
|
|
+ $add_this_slot_obj = $slotRepository->findById($add_this_slot);
|
|
|
|
+ $party->addSlot($add_this_slot_obj);
|
|
|
|
+ }
|
|
|
|
+ $slots = $party->getSlots();
|
|
|
|
+ $party->setStartOn(clone $slots->first()->getStartOn());
|
|
|
|
+ $party->setEndOn(clone $slots->last()->getEndOn());
|
|
|
|
+
|
|
|
|
+ $party->setGamemaster($gamemasterSelected);
|
|
|
|
+ $party->setGame($gameSelected);
|
|
|
|
+
|
|
|
|
+ $manager->persist($party);
|
|
|
|
+ $manager->flush();
|
|
|
|
+
|
|
|
|
+ // @todo: si c'est une partie non validée, envoyer un mail aux admin+gestionnaires pour validation
|
|
|
|
+
|
|
|
|
+ $this->addFlash('success', 'Partie ajoutée au planning.');
|
|
|
|
+ } else {
|
|
|
|
+ $this->addFlash('danger', 'Pas de MJ ou de jeu sélectionné.');
|
|
|
|
+ }
|
|
|
|
+ return $this->redirectToRoute('app_main'); // @todo: à modifier !
|
|
|
|
+
|
|
|
|
+ }
|
|
|
|
+
|
|
|
|
+ return $this->render('party/edit.html.twig', [
|
|
|
|
+ 'form' => $form,
|
|
|
|
+ 'party' => $party,
|
|
|
|
+ 'gamemasters' => $gamemasters,
|
|
|
|
+ 'games' => $games,
|
|
|
|
+ 'slotStart' => $slotStart,
|
|
|
|
+ 'slotsAvailables' => $slotsAvailables,
|
|
|
|
+ 'mod' => true
|
|
|
|
+ ]);
|
|
|
|
+ }
|
|
|
|
+
|
|
|
|
+ // afficher les détails d'une partie
|
|
|
|
+ #[Route('/party/view/{id}', name: 'app_party_view', requirements: ['id' => '\d+'], methods: ['GET', 'POST'])]
|
|
|
|
+ public function view(?Slot $slot, Request $request, SlotRepository $slotRepository, EntityManagerInterface $manager): Response
|
|
|
|
+ {
|
|
|
|
+ $party = $slot->getParty();
|
|
|
|
+ if (!$party) {
|
|
|
|
+ $this->addFlash('danger', 'Aucune partie associée à ce slot !');
|
|
|
|
+ $this->redirectToRoute('app_main'); // @todo: à déterminer
|
|
|
|
+ }
|
|
|
|
+
|
|
|
|
+ return $this->render('party/view.html.twig', [
|
|
|
|
+ 'party' => $party,
|
|
|
|
+ 'slot' => $slot,
|
|
|
|
+ ]);
|
|
|
|
+
|
|
|
|
+ }
|
|
|
|
|
|
|
|
|
|
// ajouter une partie
|
|
// ajouter une partie
|
|
@@ -109,14 +235,14 @@ final class PartyController extends AbstractController
|
|
$party->setStartOn(clone $party->getSlots()[0]->getStartOn());
|
|
$party->setStartOn(clone $party->getSlots()[0]->getStartOn());
|
|
$party->setEndOn(clone $party->getSlots()->last()->getEndOn());
|
|
$party->setEndOn(clone $party->getSlots()->last()->getEndOn());
|
|
|
|
|
|
-
|
|
|
|
-
|
|
|
|
$party->setGamemaster($gamemasterSelected);
|
|
$party->setGamemaster($gamemasterSelected);
|
|
$party->setGame($gameSelected);
|
|
$party->setGame($gameSelected);
|
|
|
|
|
|
$manager->persist($party);
|
|
$manager->persist($party);
|
|
$manager->flush();
|
|
$manager->flush();
|
|
|
|
|
|
|
|
+ // @todo: si c'est une partie non validée, envoyer un mail aux admin+gestionnaires pour validation
|
|
|
|
+
|
|
$this->addFlash('success', 'Partie ajoutée au planning.');
|
|
$this->addFlash('success', 'Partie ajoutée au planning.');
|
|
} else {
|
|
} else {
|
|
$this->addFlash('danger', 'Pas de MJ ou de jeu sélectionné.');
|
|
$this->addFlash('danger', 'Pas de MJ ou de jeu sélectionné.');
|
|
@@ -127,10 +253,12 @@ final class PartyController extends AbstractController
|
|
|
|
|
|
return $this->render('party/edit.html.twig', [
|
|
return $this->render('party/edit.html.twig', [
|
|
'form' => $form,
|
|
'form' => $form,
|
|
|
|
+ 'party' => $party,
|
|
'gamemasters' => $gamemasters,
|
|
'gamemasters' => $gamemasters,
|
|
'games' => $games,
|
|
'games' => $games,
|
|
'slotStart' => $slotStart,
|
|
'slotStart' => $slotStart,
|
|
'slotsAvailables' => $slotsAvailables,
|
|
'slotsAvailables' => $slotsAvailables,
|
|
|
|
+ 'mod' => false
|
|
]);
|
|
]);
|
|
}
|
|
}
|
|
|
|
|