Ejemplo n.º 1
0
        public async Task <ActionResult <RunSolutionResponse> > RunSolution(
            [FromRoute] Course course,
            [FromRoute] Guid slideId,
            [FromBody] RunSolutionParameters parameters,
            [FromQuery] Language language)
        {
            var courseId = course.Id;

            /* Check that no checking solution by this user in last time */
            var delta         = TimeSpan.FromSeconds(30);
            var halfMinuteAgo = DateTime.Now.Subtract(delta);

            if (await userSolutionsRepo.IsCheckingSubmissionByUser(courseId, slideId, User.Identity.GetUserId(), halfMinuteAgo, DateTime.MaxValue))
            {
                return(Json(new RunSolutionResponse(SolutionRunStatus.Ignored)
                {
                    Message = $"Ваше решение по этой задаче уже проверяется. Дождитесь окончания проверки. Вы можете отправить новое решение через {delta.Seconds} секунд."
                }));
            }

            var code = parameters.Solution;

            if (code.Length > TextsRepo.MaxTextSize)
            {
                return(Json(new RunSolutionResponse(SolutionRunStatus.Ignored)
                {
                    Message = "Слишком длинный код"
                }));
            }

            var isInstructor = await courseRolesRepo.HasUserAccessToCourse(UserId, courseId, CourseRoleType.Instructor);

            var exerciseSlide = (await courseManager.FindCourseAsync(courseId))?.FindSlideById(slideId, isInstructor) as ExerciseSlide;

            if (exerciseSlide == null)
            {
                return(NotFound(new ErrorResponse("Slide not found")));
            }

            var result = await CheckSolution(
                courseId, exerciseSlide, code, language, UserId, User.Identity.Name,
                waitUntilChecked : true, saveSubmissionOnCompileErrors : false
                ).ConfigureAwait(false);

            return(result);
        }
Ejemplo n.º 2
0
        public async Task <ActionResult <RunSolutionResponse> > RunSolution(
            [FromRoute] Course course,
            [FromRoute] Guid slideId,
            [FromBody] RunSolutionParameters parameters,
            [FromQuery] Language language,
            [FromQuery] bool isLti = false)
        {
            var courseId = course.Id;

            /* Check that no checking solution by this user in last time */
            var delta         = TimeSpan.FromSeconds(30);
            var halfMinuteAgo = DateTime.Now.Subtract(delta);

            if (await userSolutionsRepo.IsCheckingSubmissionByUser(courseId, slideId, User.Identity.GetUserId(), halfMinuteAgo, DateTime.MaxValue))
            {
                return(Json(new RunSolutionResponse(SolutionRunStatus.Ignored)
                {
                    Message = $"Ваше решение по этой задаче уже проверяется. Дождитесь окончания проверки. Вы можете отправить новое решение через {delta.Seconds} секунд."
                }));
            }

            var code = parameters.Solution;

            if (code.Length > TextsRepo.MaxTextSize)
            {
                return(Json(new RunSolutionResponse(SolutionRunStatus.Ignored)
                {
                    Message = "Слишком длинный код"
                }));
            }

            var isInstructor = await courseRolesRepo.HasUserAccessToCourseAsync(UserId, courseId, CourseRoleType.Instructor);

            var exerciseSlide = (await courseManager.FindCourseAsync(courseId))?.FindSlideById(slideId, isInstructor) as ExerciseSlide;

            if (exerciseSlide == null)
            {
                return(NotFound(new ErrorResponse("Slide not found")));
            }

            var result = await CheckSolution(
                courseId, exerciseSlide, code, language, User.Identity.GetUserId(), User.Identity.Name,
                waitUntilChecked : true, saveSubmissionOnCompileErrors : false
                ).ConfigureAwait(false);

            if (isLti)
            {
                try
                {
                    var score = await visitsRepo.GetScore(courseId, slideId, UserId);

                    await LtiUtils.SubmitScore(courseId, exerciseSlide, User.Identity.GetUserId(), score, ltiRequestsRepo, ltiConsumersRepo);
                }
                catch (Exception e)
                {
                    log.Error(e, "Мы не смогли отправить баллы на вашу образовательную платформу");
                    return(Json(new RunSolutionResponse(SolutionRunStatus.InternalServerError)
                    {
                        Message = "Мы не смогли отправить баллы на вашу образовательную платформу. Пожалуйста, обновите страницу — мы попробуем сделать это ещё раз."
                    }));
                }
            }

            return(result);
        }