src/Controller/Front/Scholar/Training/ShowController.php line 37

Open in your IDE?
  1. <?php
  2. /*
  3. * This file is part of the nellapp package.
  4. *
  5. * (c) Benjamin Georgeault <https://www.drosalys-web.fr/>
  6. *
  7. * For the full copyright and license information, please view the LICENSE
  8. * file that was distributed with this source code.
  9. */
  10. namespace App\Controller\Front\Scholar\Training;
  11. use App\Entity\Account\Advice;
  12. use App\Entity\Account\User;
  13. use App\Entity\Scholar\Training\Training;
  14. use Nellapp\Bundle\SDKBundle\Permission\Enum\ChannelUserTrainingPermissionEnum;
  15. use App\Form\Account\AdviceType;
  16. use App\Repository\Account\AdviceRepository;
  17. use App\Service\Advice\AdviceManager;
  18. use App\Service\ChannelUserData\CursusService;
  19. use App\Service\Scholar\ModuleService;
  20. use App\Service\Scholar\StatusService;
  21. use App\Service\Scholar\TrainingService;
  22. use App\Service\Scholar\UserProgression\UserProgressionService;
  23. use Doctrine\ORM\EntityManagerInterface;
  24. use Nellapp\Bundle\SDKBundle\Permission\ChannelUserPermissionService;
  25. use Sensio\Bundle\FrameworkExtraBundle\Configuration\ParamConverter;
  26. use Symfony\Bundle\FrameworkBundle\Controller\AbstractController;
  27. use Symfony\Component\HttpFoundation\Request;
  28. use Symfony\Component\HttpFoundation\Response;
  29. use Symfony\Component\HttpKernel\Exception\NotFoundHttpException;
  30. use Symfony\Component\Routing\Annotation\Route;
  31. use Symfony\Component\Security\Core\Authorization\AuthorizationCheckerInterface;
  32. class ShowController extends AbstractController
  33. {
  34. public function __construct(
  35. private EntityManagerInterface $em,
  36. private AdviceRepository $adviceRepository,
  37. private AdviceManager $adviceManager,
  38. private StatusService $statusService,
  39. private TrainingService $trainingService,
  40. private ModuleService $moduleService,
  41. private UserProgressionService $userProgressionService,
  42. private ChannelUserPermissionService $channelUserPermissionService,
  43. private CursusService $cursusService,
  44. )
  45. {
  46. }
  47. #[Route(
  48. path: '/training/{id}',
  49. name: 'front_channel_training_show',
  50. )]
  51. #[ParamConverter('training', options: ['id' => 'id'])]
  52. public function __invoke(Request $request, Training $training): Response
  53. {
  54. if ($this->statusService->isDraft($training)) {
  55. throw new NotFoundHttpException();
  56. }
  57. $vars = $this->variables($request, $training);
  58. return $this->render('Front/Scholar/Training/show.html.twig', $vars);
  59. }
  60. /**
  61. * @param Request $request
  62. * @param Training $sub
  63. * @return array
  64. */
  65. protected function variables(Request $request, Training $sub): array
  66. {
  67. $vars = [];
  68. $advice = null;
  69. $cursus = null;
  70. $trainingProgression = null;
  71. /** @var ?User $user */
  72. $user = $this->getUser();
  73. $form = null;
  74. if (null !== $user) {
  75. $advice = $this->adviceRepository->findOneByUserAndTraining($user, $sub);
  76. if ($advice === null) {
  77. $advice = new Advice();
  78. }
  79. $form = $this->createForm(AdviceType::class, $advice);
  80. $form->handleRequest($request);
  81. if ($form->isSubmitted() && $form->isValid()) {
  82. $advice->setUser($user);
  83. $advice->setTraining($sub);
  84. $this->em->persist($advice);
  85. $this->em->flush();
  86. }
  87. $cursus = $this->cursusService->getCursusByTraining(training: $sub, user: $user);
  88. $trainingProgression = $this->userProgressionService->getUserProgressionByTrainingAndUser($sub, $user);
  89. $modules = $trainingProgression->getModules();
  90. } else {
  91. $modules = $this->trainingService->getActiveModules($sub);
  92. $modulesWithLessons = [];
  93. foreach ($modules as $module) {
  94. $moduleLessons = [];
  95. $activeLessons = $this->moduleService->getActiveLessons($module);
  96. foreach ($activeLessons as $lesson) {
  97. $moduleLessons[$lesson->getId()] = [
  98. 'id' => $lesson->getId(),
  99. 'name' => $lesson->getName(),
  100. 'isPublic' => $lesson->isPublic(),
  101. 'hasFrontAccess' => $this->isGranted('FRONT_ACCESS', [
  102. 'training' => $sub,
  103. 'module' => $module,
  104. 'lesson' => $lesson,
  105. ]),
  106. ];
  107. }
  108. $modulesWithLessons[$module->getId()] = [
  109. 'lessons' => $moduleLessons,
  110. 'id' => $module->getId(),
  111. 'name' => $module->getName(),
  112. ];
  113. }
  114. $modules = $modulesWithLessons;
  115. }
  116. $allAdvice = $this->adviceManager->getTrainingAdvices($sub, $user);
  117. $trainingDescriptionEntities = $sub->getTrainingDescriptions();
  118. //TOCHECK
  119. $teacherEntities = $this->channelUserPermissionService->getAllUserForGivenPermissions($sub, ChannelUserTrainingPermissionEnum::CHANNEL_USER_PERM_TRAINING_MANAGE_COMMENT);
  120. $firstModules = array_slice($modules, 0, 5);
  121. $lastModules = array_slice($modules, 5);
  122. $vars['user'] = $user;
  123. $vars['form'] = $form?->createView();
  124. $vars['training_advices'] = $allAdvice;
  125. $vars['training_descriptions'] = $trainingDescriptionEntities;
  126. $vars['teacher_entities'] = $teacherEntities;
  127. $vars['advice_user'] = $advice;
  128. $vars['cursus'] = $cursus;
  129. $vars['sub'] = $sub;
  130. $vars['channel'] = $sub->getOwnerChannel();
  131. $vars['trainingProgression'] = $trainingProgression;
  132. $vars['firstModules'] = $firstModules;
  133. $vars['lastModules'] = $lastModules;
  134. return $vars;
  135. }
  136. }