public async Task <ActionResult> Details(string courseId, int submissionId) { var submission = userSolutionsRepo.FindSubmissionById(submissionId); if (!submission.CourseId.EqualsIgnoreCase(courseId)) { return(HttpNotFound()); } var antiPlagiarismsResult = await GetAuthorPlagiarismsAsync(submission); var mostSimilarSubmissionsHistogramData = await GetMostSimilarSubmissionsHistogramData(submission.SlideId, 100); //var mostSimilarSubmissionsHistogramData = GetMostSimilarSubmissionsHistogramDataMock(100); var suspicionLevelsResponse = await antiPlagiarismClient.GetSuspicionLevelsAsync(new GetSuspicionLevelsParameters { TaskId = submission.SlideId }); var antiPlagiarismSubmissionInfos = antiPlagiarismsResult.ResearchedSubmissions.Select(s => s.SubmissionInfo); var plagiarismsSubmissionInfos = antiPlagiarismsResult.ResearchedSubmissions .SelectMany(s => s.Plagiarisms).Select(p => p.SubmissionInfo); var submissionsIds = antiPlagiarismSubmissionInfos.Concat(plagiarismsSubmissionInfos) .Select(si => si.SubmissionId) .Distinct() .ToList(); var submissions = userSolutionsRepo.FindSubmissionsByIds(submissionsIds) .ToDictionary(s => s.Id); submissions[submissionId] = submission; var userIds = new HashSet <string>(antiPlagiarismsResult.ResearchedSubmissions.SelectMany(s => s.Plagiarisms).Select(s => s.SubmissionInfo.AuthorId.ToString())); userIds.Add(submission.UserId); /* Use special MockUserCanSeeAllGroups() instead of User because we want to show all users groups, not only available */ var usersGroups = groupsRepo.GetUsersGroupsNamesAsStrings(courseId, userIds, new MockUserCanSeeAllGroups(), actual: true, archived: false).ToDefaultDictionary(); var usersArchivedGroups = groupsRepo.GetUsersGroupsNamesAsStrings(courseId, userIds, new MockUserCanSeeAllGroups(), actual: false, archived: true).ToDefaultDictionary(); var isCourseOrSysAdmin = User.HasAccessFor(courseId, CourseRole.CourseAdmin); var course = courseManager.FindCourse(courseId); var slide = course?.FindSlideById(submission.SlideId, true); var details = new AntiPlagiarismDetailsModel { Course = course, Slide = slide, SubmissionId = submissionId, Submissions = submissions, UsersGroups = usersGroups, UsersArchivedGroups = usersArchivedGroups, AntiPlagiarismResponse = antiPlagiarismsResult, MostSimilarSubmissionsHistogramData = mostSimilarSubmissionsHistogramData, CanEditSuspicionLevels = isCourseOrSysAdmin, SuspicionLevels = suspicionLevelsResponse.SuspicionLevels, MaxAuthorSubmissionWeight = antiPlagiarismsResult.ResearchedSubmissions.Select(s => s.Plagiarisms.Select(p => p.Weight).DefaultIfEmpty(0).Max()).Max() }; return(View(details)); }