コード例 #1
0
        public async Task <ActionResult> LtiSlide(string courseId, int slideIndex)
        {
            if (string.IsNullOrWhiteSpace(courseId))
            {
                return(RedirectToAction("Index", "Home"));
            }

            var userId = User.Identity.GetUserId();

            var ltiRequestJson = FindLtiRequestJson();
            var course         = courseManager.GetCourse(courseId);
            var slide          = course.Slides[slideIndex];

            if (!string.IsNullOrWhiteSpace(ltiRequestJson))
            {
                await ltiRequestsRepo.Update(userId, slide.Id, ltiRequestJson);
            }

            var visiter = await VisitSlide(courseId, slide.Id);

            var exerciseSlide = slide as ExerciseSlide;

            if (exerciseSlide != null)
            {
                var model = new CodeModel
                {
                    CourseId      = courseId,
                    SlideIndex    = slideIndex,
                    SlideId       = exerciseSlide.Id,
                    ExerciseBlock = exerciseSlide.Exercise,
                    Context       = CreateRenderContext(course, exerciseSlide, userId, visiter, true)
                };
                return(View("LtiExerciseSlide", model));
            }

            var quizSlide = slide as QuizSlide;

            if (quizSlide != null)
            {
                var model = new LtiQuizModel
                {
                    CourseId = courseId,
                    Slide    = quizSlide,
                    UserId   = userId
                };
                return(View("LtiQuizSlide", model));
            }

            return(View());
        }
コード例 #2
0
        public async Task <ActionResult> LtiSlide(string courseId, Guid slideId)
        {
            if (string.IsNullOrWhiteSpace(courseId))
            {
                return(RedirectToAction("Index", "Home"));
            }

            var course = courseManager.GetCourse(courseId);
            var slide  = course.GetSlideById(slideId);

            string userId;
            var    owinRequest = Request.GetOwinContext().Request;

            if (await owinRequest.IsAuthenticatedLtiRequestAsync())
            {
                var ltiRequest = await owinRequest.ParseLtiRequestAsync();

                log.Info($"Нашёл LTI request в запросе: {ltiRequest.JsonSerialize()}");
                userId = Request.GetOwinContext().Authentication.AuthenticationResponseGrant.Identity.GetUserId();
                await ltiRequestsRepo.Update(courseId, userId, slide.Id, ltiRequest.JsonSerialize());

                /* Substitute http(s) scheme with real scheme from header */
                var uriBuilder = new UriBuilder(ltiRequest.Url)
                {
                    Scheme = owinRequest.GetRealRequestScheme(),
                    Port   = owinRequest.GetRealRequestPort()
                };
                return(Redirect(uriBuilder.Uri.AbsoluteUri));
            }

            /* For now user should be authenticated */
            if (!User.Identity.IsAuthenticated)
            {
                return(new HttpStatusCodeResult(HttpStatusCode.Forbidden));
            }

            userId = User.Identity.GetUserId();
            var visit = await VisitSlide(courseId, slide.Id, userId);

            /* Try to send score via LTI immediately after slide visiting */
            try
            {
                if (visit.IsPassed)
                {
                    LtiUtils.SubmitScore(courseId, slide, userId, visit);
                }
            }
            catch (Exception e)
            {
                ErrorLog.GetDefault(System.Web.HttpContext.Current).Log(new Error(e));
            }

            var exerciseSlide = slide as ExerciseSlide;

            if (exerciseSlide != null)
            {
                var model = new CodeModel
                {
                    CourseId      = courseId,
                    SlideId       = exerciseSlide.Id,
                    ExerciseBlock = exerciseSlide.Exercise,
                    Context       = CreateRenderContext(course, exerciseSlide, isLti: true)
                };
                return(View("LtiExerciseSlide", model));
            }

            var quizSlide = slide as QuizSlide;

            if (quizSlide != null)
            {
                var model = new LtiQuizModel
                {
                    CourseId = courseId,
                    Slide    = quizSlide,
                    UserId   = userId
                };
                return(View("LtiQuizSlide", model));
            }

            return(View());
        }