src/Lms/UserInterface/Rest/Controller/CourseController.php line 107

Open in your IDE?
  1. <?php
  2. namespace CodersLab\Lms\UserInterface\Rest\Controller;
  3. use CodersLab\Lms\Modules\IdentityAccess\Application\IContentAccessContext;
  4. use CodersLab\Lms\Modules\IdentityAccess\Application\ICourseInstanceContext;
  5. use CodersLab\Lms\Modules\IdentityAccess\Application\Query\Model\User\LastSeenMaterial;
  6. use CodersLab\Lms\Modules\IdentityAccess\Application\Query\ProgressQuery;
  7. use CodersLab\Lms\Modules\IdentityAccess\Application\Query\UserAccessQuery;
  8. use CodersLab\Lms\Modules\Materials\Application\Query\CourseQuery;
  9. use CodersLab\Lms\Modules\Materials\Application\Query\Model\Course;
  10. use CodersLab\Lms\SharedKernel\Application\Response\LmsApiResponse;
  11. use CodersLab\Lms\SharedKernel\Application\SecurityContext;
  12. use CodersLab\Lms\SharedKernel\Common\Exception\AccessDeniedHttpException;
  13. use JMS\Serializer\SerializationContext;
  14. use JMS\Serializer\SerializerInterface;
  15. use Nelmio\ApiDocBundle\Annotation\Model;
  16. use OpenApi\Annotations as OA;
  17. use Symfony\Component\HttpFoundation\JsonResponse;
  18. use Symfony\Component\Routing\Annotation\Route;
  19. /**
  20.  * @OA\Tag(name="Course")
  21.  */
  22. final class CourseController
  23. {
  24.     public function __construct(
  25.         private CourseQuery $courseQuery,
  26.         private SecurityContext $security,
  27.         private IContentAccessContext $accessContext,
  28.         private ICourseInstanceContext $instanceContext,
  29.         private SerializerInterface $serializer,
  30.         private UserAccessQuery $userAccessQuery,
  31.         private ProgressQuery $progressQuery
  32.     ) {
  33.     }
  34.     /**
  35.      * @Route("/course/{instanceId}", name="course_single_id", methods={"GET"}, requirements={"instanceId"="\d+"})
  36.      * @OA\Parameter(name="instanceId", in="path", @OA\Schema(type="string"))
  37.      * @OA\Response(
  38.      *     response=200,
  39.      *     description="Single course by instance id",
  40.      *     @OA\Schema(ref=@Model(type="CodersLab\Lms\Modules\Materials\Application\Query\Model\Course"))
  41.      * )
  42.      */
  43.     public function getSingleById(string $instanceId): JsonResponse
  44.     {
  45.         $course $this->courseQuery->getByInstanceId($instanceId);
  46.         return $this->proceedResponse($course, (int)$instanceId);
  47.     }
  48.     /**
  49.      * @Route("/course/{signature}", name="course_single_signature", methods={"GET"})
  50.      * @OA\Parameter(name="signature", in="path", @OA\Schema(type="string"))
  51.      * @OA\Response(
  52.      *     response=200,
  53.      *     description="Single course by instance id",
  54.      *     @OA\Schema(ref=@Model(type="CodersLab\Lms\Modules\Materials\Application\Query\Model\Course"))
  55.      * )
  56.      */
  57.     public function getSingleBySignature(string $signature): JsonResponse
  58.     {
  59.         $course $this->courseQuery->getBySignature($signature);
  60.         $instanceId $this->courseQuery->findInstanceIdForSignature($signature);
  61.         return $this->proceedResponse($course, (int)$instanceId);
  62.     }
  63.     /**
  64.      * @Route("/course/{instanceId}/progress", name="course_single_id_progress", methods={"GET"}, requirements={"instanceId"="\d+"})
  65.      * @OA\Parameter(name="instanceId", in="path", @OA\Schema(type="string"))
  66.      * @OA\Response(
  67.      *     response=200,
  68.      *     description="Single course by instance id",
  69.      *     @OA\Schema(ref=@Model(type="CodersLab\Lms\Modules\Materials\Application\Query\Model\Course"))
  70.      * )
  71.      */
  72.     public function getSingleResultsById(string $instanceId): JsonResponse
  73.     {
  74.         $course $this->courseQuery->getByInstanceId($instanceId);
  75.         $course->addProgress($this->progressQuery->forCourseInstance(
  76.             (string)$instanceId,
  77.             (string)$this->security->getLoggedUser()->id()
  78.         ));
  79.         $context SerializationContext::create()->setSerializeNull(true);
  80.         $context->setGroups(['progress''Default']);
  81.         return LmsApiResponse::createFromJsonString($this->serializer->serialize(
  82.             ['data' => $course],
  83.             'json',
  84.             $context
  85.         ));
  86.     }
  87.     /**
  88.      * @Route("/course/{signature}/progress", name="course_single_signature_progress", methods={"GET"})
  89.      * @OA\Parameter(name="signature", in="path", @OA\Schema(type="string"))
  90.      * @OA\Response(
  91.      *     response=200,
  92.      *     description="Single course by instance id",
  93.      *     @OA\Schema(ref=@Model(type="CodersLab\Lms\Modules\Materials\Application\Query\Model\Course"))
  94.      * )
  95.      */
  96.     public function getSingleResultsBySignature(string $signature): JsonResponse
  97.     {
  98.         $course $this->courseQuery->getBySignature($signature);
  99.         $course->addProgress($this->progressQuery->forCourseInstance(
  100.             (string)$this->courseQuery->findInstanceIdForSignature($signature),
  101.             (string)$this->security->getLoggedUser()->id()
  102.         ));
  103.         $context SerializationContext::create()->setSerializeNull(true);
  104.         $context->setGroups(['progress''Default']);
  105.         return LmsApiResponse::createFromJsonString($this->serializer->serialize(
  106.             ['data' => $course],
  107.             'json',
  108.             $context
  109.         ));
  110.     }
  111.     /**
  112.      * @Route("/directAccess/course/{courseId}", name="direct_access_course_single", methods={"GET"})
  113.      * @OA\Parameter(name="courseId", in="path", @OA\Schema(type="string"))
  114.      * @OA\Response(
  115.      *     response=200,
  116.      *     description="Single course by instance id",
  117.      *     @OA\Schema(ref=@Model(type="CodersLab\Lms\Modules\Materials\Application\Query\Model\Course"))
  118.      * )
  119.      */
  120.     public function getSingleDirectAccess(string $courseId): JsonResponse
  121.     {
  122.         $course $this->courseQuery->getById($courseId);
  123.         $user $this->security->getLoggedUser();
  124.         $directAccess $this->accessContext->hasDirectAccess($user->id(), $course->getProduct()->getId());
  125.         if ($directAccess === false) {
  126.             throw new AccessDeniedHttpException();
  127.         }
  128.         $context SerializationContext::create()->setSerializeNull(true);
  129.         $context->setGroups(['details''progress''Default']);
  130.         return LmsApiResponse::createFromJsonString($this->serializer->serialize(
  131.             ['data' => $course],
  132.             'json',
  133.             $context
  134.         ));
  135.     }
  136.     private function proceedResponse(Course $courseint $instanceId): JsonResponse
  137.     {
  138.         $user $this->security->getLoggedUser();
  139.         if (!$this->accessContext->hasAccessToCourseInstance($user->id(), $instanceId)) {
  140.             $directAccess $this->accessContext->hasDirectAccess($user->id(), $course->getProduct()->getId());
  141.             if ($directAccess === true) {
  142.                 return new LmsApiResponse($course);
  143.             }
  144.             throw new AccessDeniedHttpException();
  145.         }
  146.         $lastSeenMaterial $this->instanceContext->getLastSeenMaterial((string)$user->id(), (string)$instanceId);
  147.         if ($lastSeenMaterial instanceof LastSeenMaterial) {
  148.             $course->markLastSeenMaterial($lastSeenMaterial);
  149.         }
  150.         $moduleLecturers $this->instanceContext->getModulesLecturers((string)$instanceId);
  151.         $course->setLecturers($moduleLecturers);
  152.         $chaptersStatistics $this->courseQuery->getChaptersMaterialsStatistics((string)$instanceId);
  153.         $course->addChaptersStatistics($chaptersStatistics);
  154.         $access $this->userAccessQuery->findChaptersAccessOnCourse((string)$instanceId, (string)$user->id());
  155.         $course->setAccess($access);
  156.         $context SerializationContext::create()->setSerializeNull(true);
  157.         $context->setGroups(['details''Default']);
  158.         return LmsApiResponse::createFromJsonString($this->serializer->serialize(
  159.             ['data' => $course],
  160.             'json',
  161.             $context
  162.         ));
  163.     }
  164. }