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

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', priority: 1)]
  31. #[Entity('training', options: ['id' => 'trainingId'])]
  32. #[Entity('module', options: ['id' => 'moduleId'])]
  33. #[Entity('lesson', options: ['id' => 'lessonId'])]
  34. public function __invoke(Request $request, Training $training, Module $module, Lesson $lesson, Exercise $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. }