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); }
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); }