src/Lms/UserInterface/Rest/Controller/MenuController.php line 80

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\Query\ProgressQuery;
  5. use CodersLab\Lms\Modules\IdentityAccess\Application\Query\UserAccessQuery;
  6. use CodersLab\Lms\Modules\Materials\Application\Query\CourseQuery;
  7. use CodersLab\Lms\Modules\Materials\Application\Service\Material\MaterialInstanceSlug\Slug;
  8. use CodersLab\Lms\SharedKernel\Application\Response\LmsApiResponse;
  9. use CodersLab\Lms\SharedKernel\Application\SecurityContext;
  10. use CodersLab\Lms\SharedKernel\Common\Exception\AccessDeniedHttpException;
  11. use CodersLab\Lms\SharedKernel\Domain\Courses\MemberType;
  12. use CodersLab\Lms\SharedKernel\Domain\Identity\Uuid;
  13. use JMS\Serializer\SerializationContext;
  14. use JMS\Serializer\SerializerInterface;
  15. use OpenApi\Annotations as OA;
  16. use Symfony\Component\HttpFoundation\Response;
  17. use Symfony\Component\Routing\Annotation\Route;
  18. /**
  19.  * @OA\Tag(name="User menu")
  20.  */
  21. final class MenuController
  22. {
  23.     private SecurityContext $security;
  24.     private IContentAccessContext $accessContext;
  25.     private CourseQuery $courseQuery;
  26.     private UserAccessQuery $userAccessQuery;
  27.     private SerializerInterface $serializer;
  28.     private ProgressQuery $progressQuery;
  29.     public function __construct(
  30.         SecurityContext $security,
  31.         IContentAccessContext $accessContext,
  32.         CourseQuery $courseQuery,
  33.         UserAccessQuery $userAccessQuery,
  34.         SerializerInterface $serializer,
  35.         ProgressQuery $progressQuery
  36.     ) {
  37.         $this->security $security;
  38.         $this->accessContext $accessContext;
  39.         $this->courseQuery $courseQuery;
  40.         $this->userAccessQuery $userAccessQuery;
  41.         $this->serializer $serializer;
  42.         $this->progressQuery $progressQuery;
  43.     }
  44.     /**
  45.      * @Route(
  46.      *     "/menu/{chapterId}/{instanceId}",
  47.      *     name="user_menu_id",
  48.      *     methods={"GET"},
  49.      *     requirements={"chapterId"="[a-f0-9]{8}\-[a-f0-9]{4}\-[a-f0-9]{4}\-[a-f0-9]{4}\-[a-f0-9]{12}"}
  50.      * )
  51.      *
  52.      * @OA\Parameter(name="chapterId", in="path", @OA\Schema(type="string"), required=true)
  53.      * @OA\Parameter(name="instanceId", in="path", @OA\Schema(type="string"), required=true)
  54.      * @OA\Response(response=200, description="")
  55.      *
  56.      */
  57.     public function menuByChapterId(): Response
  58.     {
  59.         return new Response(nullResponse::HTTP_MOVED_PERMANENTLY);
  60.     }
  61.     /**
  62.      * @Route(
  63.      *     "/menu/{slug}/{instanceId}",
  64.      *     name="user_menu_slug",
  65.      *     methods={"GET"},
  66.      *     requirements={"slug"="[0-9]+\-[0-9]+"}
  67.      * )
  68.      *
  69.      * @OA\Parameter(name="chapterId", in="path", @OA\Schema(type="string"), required=true)
  70.      * @OA\Parameter(name="instanceId", in="path", @OA\Schema(type="string"), required=true)
  71.      * @OA\Response(response=200, description="")
  72.      *
  73.      */
  74.     public function menuBySlug(string $slugstring $instanceId): Response
  75.     {
  76.         $user $this->security->getLoggedUser();
  77.         $memberTypes $this->accessContext->getUserCourseInstanceRoles($user->id(), $instanceId);
  78.         $course $this->courseQuery->getByInstanceId($instanceIdtrueMemberType::chooseHighest($memberTypes));
  79.         if (!$this->accessContext->hasAccessToCourseInstance($user->id(), (int)$instanceId)) {
  80.             throw new AccessDeniedHttpException();
  81.         }
  82.         $course->addProgress($this->progressQuery->forCourseInstance(
  83.             (string)$instanceId,
  84.             (string)$this->security->getLoggedUser()->id()
  85.         ));
  86.         $course->setAccess(
  87.             $this->userAccessQuery->findChaptersAccessOnCourse(
  88.                 (string)$instanceId,
  89.                 (string)$user->id()
  90.             )
  91.         );
  92.         $module $course->getModuleBySlug(Slug::createFromString($slug));
  93.         $context SerializationContext::create()->setSerializeNull(true);
  94.         $context->setGroups(['module''Default']);
  95.         return LmsApiResponse::createFromJsonString($this->serializer->serialize(
  96.             ['data' => $module],
  97.             'json',
  98.             $context
  99.         ));
  100.     }
  101.     /**
  102.      * @Route("/direct-access/menu/{chapterId}", name="user_menu_direct_access", methods={"GET"})
  103.      *
  104.      * @OA\Parameter(name="chapterId", in="path", @OA\Schema(type="string"), required=true)
  105.      * @OA\Parameter(name="instanceId", in="path", @OA\Schema(type="string"), required=true)
  106.      * @OA\Response(response=200, description="")
  107.      *
  108.      */
  109.     public function menuDirectAccess(string $chapterId): Response
  110.     {
  111.         $user $this->security->getLoggedUser();
  112.         $this->accessContext->hasDirectAccessByChapter((string)$user->id(), $chapterId);
  113.         $course $this->courseQuery->getById((string)$this->courseQuery->findCourseIdForChapter($chapterId), true);
  114.         $module $course->getModuleByChapter(new Uuid($chapterId));
  115.         $context SerializationContext::create()->setSerializeNull(true);
  116.         $context->setGroups(['direct''Default']);
  117.         return LmsApiResponse::createFromJsonString($this->serializer->serialize(
  118.             ['data' => $module],
  119.             'json',
  120.             $context
  121.         ));
  122.     }
  123. }