|
@@ -0,0 +1,81 @@
|
|
|
+<?php
|
|
|
+
|
|
|
+namespace App\Controller;
|
|
|
+
|
|
|
+use Symfony\Bundle\FrameworkBundle\Controller\AbstractController;
|
|
|
+use Symfony\Component\HttpFoundation\Response;
|
|
|
+use Symfony\Component\HttpFoundation\Request;
|
|
|
+use Symfony\Component\HttpFoundation\JsonResponse;
|
|
|
+use Symfony\Component\Routing\Requirement\Requirement;
|
|
|
+use Symfony\Component\Routing\Attribute\Route;
|
|
|
+use Doctrine\ORM\EntityManagerInterface;
|
|
|
+
|
|
|
+use App\Security\Voter\PartyAccessVoter;
|
|
|
+use App\Security\Voter\EventAccessVoter;
|
|
|
+
|
|
|
+use App\Entity\Event;
|
|
|
+use App\Entity\Party;
|
|
|
+use App\Entity\Gamemaster;
|
|
|
+use App\Entity\Participation;
|
|
|
+use App\Entity\EventRepository;
|
|
|
+
|
|
|
+final class CheckinController extends AbstractController
|
|
|
+{
|
|
|
+ #[Route('/checkin/participant/{id}', name: 'app_check', requirements: ['id' => Requirement::UUID_V7], methods: ['POST'])]
|
|
|
+ public function participant(?Participation $participation, Request $request, EntityManagerInterface $manager): JsonResponse
|
|
|
+ {
|
|
|
+ // On récupère la participation
|
|
|
+ if (!$participation) {
|
|
|
+ return $this->json(['error' => 'Participation not found'], 404);
|
|
|
+ }
|
|
|
+
|
|
|
+ // ON check la partie
|
|
|
+ $party = $participation->getParty();
|
|
|
+ if (!$party) {
|
|
|
+ return $this->json(['error' => 'Party not found'], 404);
|
|
|
+ }
|
|
|
+
|
|
|
+ // Voteur sur la partie : ADMIN, GESTIONNAIRE ou STAFF/si MJ de la partie
|
|
|
+ $this->denyAccessUnlessGranted(PartyAccessVoter::ACCESS_PARTY, $party);
|
|
|
+ // TODO: retourner une erreur 503
|
|
|
+
|
|
|
+ $returnCode = "ERROR";
|
|
|
+
|
|
|
+ if ($participation->isCheckin()) {
|
|
|
+ $participation->setCheckin(false);
|
|
|
+ $manager->persist($participation);
|
|
|
+ $manager->flush();
|
|
|
+ $returnCode = "UNCHECKED";
|
|
|
+ } else {
|
|
|
+ $participation->setCheckin(true);
|
|
|
+ $manager->persist($participation);
|
|
|
+ $manager->flush();
|
|
|
+ $returnCode = "CHECKED";
|
|
|
+ }
|
|
|
+
|
|
|
+ return $this->json(["status" => $returnCode]);
|
|
|
+ }
|
|
|
+
|
|
|
+ // Gérer l'affichage du contenu de la modale pour les checkins
|
|
|
+ #[Route('/checkin/party/{id}', name: 'app_checkin_party', requirements: ['id' => Requirement::UUID_V7], methods: ['GET'])]
|
|
|
+ public function party(?Party $party): Response
|
|
|
+ {
|
|
|
+ // Est-ce que c'est bien une partie ?
|
|
|
+ if (!$party) {
|
|
|
+ $this->addFlash('danger', 'Aucune partie avec cet identifiant.');
|
|
|
+ return $this->redirectToRoute('app_main');
|
|
|
+ }
|
|
|
+
|
|
|
+ // Voteur sur la partie : ADMIN, GESTIONNAIRE ou STAFF/si MJ de la partie
|
|
|
+ $this->denyAccessUnlessGranted(PartyAccessVoter::ACCESS_PARTY, $party);
|
|
|
+
|
|
|
+ // Donc, ça marche
|
|
|
+ return $this->render('checkin/_modal.checkin.html.twig', [
|
|
|
+ 'party' => $party,
|
|
|
+ 'participations' => $party->getParticipations()
|
|
|
+ ]);
|
|
|
+
|
|
|
+ }
|
|
|
+
|
|
|
+
|
|
|
+}
|