src/Controller/Front/Exercise/StartController.php line 27

Open in your IDE?
  1. <?php
  2. namespace App\Controller\Front\Exercise;
  3. use App\Entity\Exercise\Exercise;
  4. use App\Entity\Scholar\Lesson\Lesson;
  5. use App\Entity\Scholar\Module\Module;
  6. use App\Entity\Scholar\Training\Training;
  7. use App\Exception\Exercise\MissingUserException;
  8. use App\Form\Exercise\User\ExerciseResultType;
  9. use App\Repository\Exercise\ExerciseRepository;
  10. use App\Service\Exercise\UserExerciseResultManipulator;
  11. use Doctrine\ORM\EntityManagerInterface;
  12. use Sensio\Bundle\FrameworkExtraBundle\Configuration\Entity;
  13. use Symfony\Bundle\FrameworkBundle\Controller\AbstractController;
  14. use Symfony\Component\HttpFoundation\Request;
  15. use Symfony\Component\HttpFoundation\Response;
  16. use Symfony\Component\HttpKernel\Exception\NotFoundHttpException;
  17. use Symfony\Component\Routing\Annotation\Route;
  18. use Symfony\Component\Security\Core\Exception\AccessDeniedException;
  19. /**
  20.  * Class StartController
  21.  *
  22.  * @author Benjamin Georgeault
  23.  */
  24. class StartController extends AbstractController
  25. {
  26.     public function __construct(
  27.         private UserExerciseResultManipulator $manipulator,
  28.         private EntityManagerInterface $em,
  29.     ) {}
  30.     #[Route(path'/training/{trainingId}/module/{moduleId}/lesson/{lessonId}/exercise/{id}/start'name'front_exercise_start'priority1)]
  31.     #[Entity('training'options: ['id' => 'trainingId'])]
  32.     #[Entity('module'options: ['id' => 'moduleId'])]
  33.     #[Entity('lesson'options: ['id' => 'lessonId'])]
  34.     public function __invoke(Request $requestTraining $trainingModule $moduleLesson $lessonExercise $exercise): Response
  35.     {
  36.         if ($this->getUser() === null) {
  37.             throw new AccessDeniedException('Access denied.');
  38.         }
  39.         // Check if there is a pending exercise.
  40.         if (null !== $exerciseResult $this->manipulator->getPendingExercise()) {
  41.             // If pending but different exercise, reset to null.
  42.             if ($exercise->getId() !== $pendingExerciseId $exerciseResult->getExercise()->getId()) {
  43.                 $exerciseResult null;
  44.             } else {
  45.                 // in the case of a pending exercise have been found, set startedAt to current time to avoid 185h for an exercise
  46.                 $exerciseResult->setStartedAt(new \DateTime());
  47.                 $this->em->persist($exerciseResult);
  48.                 $this->em->flush();
  49.             }
  50.         }
  51.         if (null === $exerciseResult) {
  52.             // Create the ExerciseResult and save it in the database.
  53.             // It allows to know if the user is doing an exercise.
  54.             try {
  55.                 $exerciseResult $this->manipulator->create($exercise);
  56.                 $this->em->persist($exerciseResult);
  57.                 $this->em->flush();
  58.             } catch (MissingUserException $e) {
  59.                 throw new AccessDeniedException('No logged user.');
  60.             }
  61.         }
  62.         return $this->redirectToRoute('front_exercise_answer', [
  63.             'trainingId' => $training->getId(),
  64.             'moduleId' => $module->getId(),
  65.             'lessonId' => $lesson->getId(),
  66.             'id' => $exercise->getId(),
  67.             'exerciseResultId' => $exerciseResult->getId(),
  68.         ], 303);
  69.     }
  70. }