src/Controller/Front/Scholar/Chapter/ChapterController.php line 30

Open in your IDE?
  1. <?php
  2. namespace App\Controller\Front\Scholar\Chapter;
  3. use App\Entity\Account\User;
  4. use App\Entity\Achievement\AchievedChapter;
  5. use App\Entity\Achievement\AchievementTimeLog;
  6. use App\Entity\Scholar\Chapter\Chapter;
  7. use App\Entity\Scholar\Lesson\Lesson;
  8. use App\Entity\Scholar\Module\Module;
  9. use App\Entity\Scholar\Training\Training;
  10. use App\Enum\AssignableStatusEnum;
  11. use App\Service\Forum\MessageManager;
  12. use App\Service\Scholar\LessonService;
  13. use Nellapp\Bundle\SDKBundle\Permission\Enum\ChannelUserTrainingPermissionEnum;
  14. use App\Form\Forum\MessageAnswerType;
  15. use App\Form\Forum\MessageType;
  16. use App\Repository\Forum\ChapterMessageRepository;
  17. use App\Service\Account\NotificationManager;
  18. use App\Service\Achievement\AchievementManager;
  19. use App\Service\Scholar\StatusService;
  20. use Doctrine\ORM\EntityManagerInterface;
  21. use Sensio\Bundle\FrameworkExtraBundle\Configuration\ParamConverter;
  22. use Symfony\Bundle\FrameworkBundle\Controller\AbstractController;
  23. use Symfony\Component\HttpFoundation\Request;
  24. use Symfony\Component\HttpFoundation\Response;
  25. use Symfony\Component\HttpKernel\Exception\NotFoundHttpException;
  26. use Symfony\Component\Routing\Annotation\Route;
  27. class ChapterController extends AbstractController
  28. {
  29.     public function __construct(
  30.         private ChapterMessageRepository $messageRepository,
  31.         private EntityManagerInterface   $em,
  32.         private NotificationManager      $notificationManager,
  33.         private AchievementManager       $achievementManager,
  34.         private MessageManager           $messageManager,
  35.         private LessonService          $lessonService,
  36.     )
  37.     {
  38.     }
  39.     #[Route(path'/training/{trainingId}/module/{moduleId}/lesson/{lessonId}/chapter/{chapterId}'name'front_channel_chapter_show')]
  40.     #[ParamConverter('training'options: ['id' => 'trainingId'])]
  41.     #[ParamConverter('module'options: ['id' => 'moduleId'])]
  42.     #[ParamConverter('lesson'options: ['id' => 'lessonId'])]
  43.     #[ParamConverter('chapter'options: ['id' => 'chapterId'])]
  44.     public function __invoke(Request $requestTraining $trainingModule $moduleLesson $lessonChapter $chapterStatusService $statusService): Response
  45.     {
  46.         if (!$this->isGranted('FRONT_ACCESS', [
  47.             'training' => $training,
  48.             'module' => $module,
  49.             'lesson' => $lesson,
  50.         ])) {
  51.             throw $this->createAccessDeniedException();
  52.         }
  53.         if ($chapter->getLesson() !== $lesson) {
  54.             throw new NotFoundHttpException();
  55.         }
  56.         /** @var ?User $user */
  57.         $user $this->getUser();
  58.         /** @var AchievedChapter $achievedChapter */
  59.         $achievedChapter $this->achievementManager->getOrCreate($user$chapter);
  60.         if ($achievedChapter) {
  61.             $achievementTimeLog = new AchievementTimeLog();
  62.             $achievementTimeLog->setAchievedChapter($achievedChapter)
  63.                 ->setChapter($chapter)
  64.                 ->setLesson($lesson)
  65.                 ->setModule($module)
  66.                 ->setTraining($training)
  67.                 ->setStartAt(new \DateTime());
  68.             $this->em->persist($achievementTimeLog);
  69.             $this->em->flush();
  70.         }
  71.         /**
  72.          * Form for a message which is a new one
  73.          */
  74.         $message $this->messageManager->createUserChapterMessage($user$chapter$module$training);
  75.         $form $this->createForm(MessageType::class, $message);
  76.         $form->handleRequest($request);
  77.         if ($form->isSubmitted() && $form->isValid()) {
  78.             $message->setAssignedTo($this->lessonService->getLessonReferralTrainer($lesson));
  79.             // If the user that created the message is Manager -> DONE
  80.             if ($this->isGranted(ChannelUserTrainingPermissionEnum::CHANNEL_USER_PERM_TRAINING_MANAGE_COMMENT$training)) {
  81.                 $message->setAssignableStatus(AssignableStatusEnum::DONE);
  82.             } else {
  83.                 $message->setAssignableStatus(AssignableStatusEnum::TODO);
  84.             }
  85.             if ($form->get('parent-id')->getData() !== null) {
  86.                 $messageId $form->get('parent-id')->getData();
  87.                 $messageParent $this->messageRepository->find($messageId);
  88.                 $message->setParent($messageParent);
  89.                 // If the user that created the message is the assignee of the message parent -> DONE
  90.                 if ($this->getUser() && $messageParent->getAssignedTo() === $this->getUser()) {
  91.                     $message->setAssignableStatus(AssignableStatusEnum::DONE);
  92.                 }
  93.                 // In case the user that created the message is the assignee of the parent message or Manager:
  94.                 // MessageParent -> DONE
  95.                 // All childs of message parent -> DONE
  96.                 if ($this->isGranted(ChannelUserTrainingPermissionEnum::CHANNEL_USER_PERM_TRAINING_MANAGE_COMMENT$training)
  97.                     || $this->getUser() && $messageParent->getAssignedTo() === $this->getUser()
  98.                 ) {
  99.                     $messageParent->setAssignableStatus(AssignableStatusEnum::DONE);
  100.                     $this->em->persist($messageParent);
  101.                     /** @var ChapterMessage $childMessage */
  102.                     foreach ($messageParent->getChildren() as $childMessage) {
  103.                         $childMessage->setAssignableStatus(AssignableStatusEnum::DONE);
  104.                         $this->em->persist($childMessage);
  105.                     }
  106.                 }
  107.             }
  108.             $this->em->persist($message);
  109.             $this->em->flush();
  110.             if ($message->getAssignableStatus() === AssignableStatusEnum::TODO && $user) {
  111.                 if ($form->get('parent-id')->getData() !== null && null !== ($messageUser $messageParent->getUser())) {
  112.                     $this->notificationManager->addChapterResponseMessageNotification(
  113.                         $messageUser,
  114.                         $user,
  115.                         $message->getChapter(),
  116.                         $message,
  117.                         $training->getId(),
  118.                         $module->getId(),
  119.                         $lesson->getId()
  120.                     );
  121.                 } else {
  122.                     $this->notificationManager->addMessageNotificationToStaff($user$chapter$message$module$training);
  123.                 }
  124.             }
  125.         }
  126.         /**
  127.          * Form for a message which answer a question
  128.          */
  129.         $messageAnswer $this->messageManager->createUserChapterMessage($user$chapter$module$training);
  130.         $formAnswerQuestion $this->createForm(MessageAnswerType::class, $messageAnswer);
  131.         $formAnswerQuestion->handleRequest($request);
  132.         if ($formAnswerQuestion->isSubmitted() && $formAnswerQuestion->isValid()) {
  133.             $messageAnswer->setAssignableStatus(0);
  134.             $messageAnswer->setAssignedTo($this->lessonService->getLessonReferralTrainer($lesson));
  135.             if ($this->isGranted(ChannelUserTrainingPermissionEnum::CHANNEL_USER_PERM_TRAINING_MANAGE_COMMENT$training)) {
  136.                 $messageAnswer->setAssignableStatus(AssignableStatusEnum::DONE);
  137.             } else {
  138.                 $messageAnswer->setAssignableStatus(AssignableStatusEnum::TODO);
  139.             }
  140.             if ($formAnswerQuestion->get('parent-id')->getData() !== null) {
  141.                 $messageId $formAnswerQuestion->get('parent-id')->getData();
  142.                 $messageParent $this->messageRepository->find($messageId);
  143.                 $messageAnswer->setParent($messageParent);
  144.                 if ($this->getUser() && $messageParent->getAssignedTo() === $this->getUser()) {
  145.                     $messageAnswer->setAssignableStatus(AssignableStatusEnum::DONE);
  146.                 }
  147.                 if ($this->isGranted(ChannelUserTrainingPermissionEnum::CHANNEL_USER_PERM_TRAINING_MANAGE_COMMENT$training)
  148.                     || $this->getUser() && $messageParent->getAssignedTo() === $this->getUser()
  149.                 ) {
  150.                     $messageParent->setAssignableStatus(AssignableStatusEnum::DONE);
  151.                 }
  152.             }
  153.             $this->em->persist($messageAnswer);
  154.             $this->em->flush();
  155.             if ($user) {
  156.                 if ($formAnswerQuestion->get('parent-id')->getData() !== null && null !== ($messageUser $messageParent->getUser())) {
  157.                     $this->notificationManager->addChapterResponseMessageNotification(
  158.                         $messageUser,
  159.                         $user,
  160.                         $messageAnswer->getChapter(),
  161.                         $messageAnswer,
  162.                         $training->getId(),
  163.                         $module->getId(),
  164.                         $lesson->getId()
  165.                     );
  166.                 } else {
  167.                     $this->notificationManager->addMessageNotificationToStaff($user$chapter$messageAnswer$module$training);
  168.                 }
  169.             }
  170.         }
  171.         $messages $this->messageRepository->findByChapter($chapter);
  172.         $isGrantedComment false;
  173.         if ($user !== null) {
  174.             $isGrantedComment $this->isGranted(ChannelUserTrainingPermissionEnum::CHANNEL_USER_PERM_TRAINING_MANAGE_COMMENT$module);
  175.         }
  176.         return $this->render('Front/Scholar/Chapter/show.html.twig', [
  177.             'chapter' => $chapter,
  178.             'messages' => $messages,
  179.             'form' => $form->createView(),
  180.             'formAnswer' => $formAnswerQuestion->createView(),
  181.             'module' => $module,
  182.             'training' => $training,
  183.             'lesson' => $lesson,
  184.             'is_granted_comment' => $isGrantedComment,
  185.             'channel' => $training->getOwnerChannel(),
  186.         ]);
  187.     }
  188. }