private Slide GetInitialSlideForStartup(string courseId, IEnumerable <Unit> visibleUnits) { var userId = User.Identity.GetUserId(); var visitedIds = visitsRepo.GetIdOfVisitedSlides(courseId, userId); var visibleSlides = visibleUnits.SelectMany(u => u.Slides).ToList(); var lastVisited = visibleSlides.LastOrDefault(slide => visitedIds.Contains(slide.Id)); if (lastVisited == null) { return(visibleSlides.Any() ? visibleSlides.First() : null); } var unitSlides = lastVisited.Info.Unit.Slides.Where(s => visibleSlides.Contains(s)).ToList(); var lastVisitedSlide = unitSlides.First(); foreach (var slide in unitSlides) { if (visitedIds.Contains(slide.Id)) { lastVisitedSlide = slide; } else { return(lastVisitedSlide); } } return(lastVisitedSlide); }
private Slide GetInitialSlideForStartup(string courseId, List <Unit> orderedVisibleUnits, bool isInstructor) { var userId = User.Identity.GetUserId(); var lastVisit = visitsRepo.FindLastVisit(courseId, userId); var orderedVisibleSlides = orderedVisibleUnits.SelectMany(u => u.GetSlides(isInstructor)).ToList(); if (lastVisit != null) { var lastVisitedSlide = orderedVisibleSlides.FirstOrDefault(s => s.Id == lastVisit.SlideId); if (lastVisitedSlide != null) { return(lastVisitedSlide); } if (isInstructor) { var instructorNoteSlide = orderedVisibleUnits.FirstOrDefault(u => u.Id == lastVisit.SlideId)?.InstructorNote?.Slide; if (instructorNoteSlide != null) { return(instructorNoteSlide); } } } var unorderedVisitedIds = visitsRepo.GetIdOfVisitedSlides(courseId, userId); var lastVisitedVisibleSlide = orderedVisibleSlides.LastOrDefault(slide => unorderedVisitedIds.Contains(slide.Id)); if (lastVisitedVisibleSlide != null) { return(lastVisitedVisibleSlide); } return(orderedVisibleSlides.Any() ? orderedVisibleSlides.First() : null); }
private int GetInitialIndexForStartup(string courseId, Course course, List <string> visibleUnits) { var userId = User.Identity.GetUserId(); var visitedIds = visitsRepo.GetIdOfVisitedSlides(courseId, userId); var visibleSlides = course.Slides.Where(slide => visibleUnits.Contains(slide.Info.UnitName)).OrderBy(slide => slide.Index).ToList(); var lastVisited = visibleSlides.LastOrDefault(slide => visitedIds.Contains(slide.Id)); if (lastVisited == null) { return(visibleSlides.Any() ? visibleSlides.First().Index : 0); } var slides = visibleSlides.Where(slide => lastVisited.Info.UnitName == slide.Info.UnitName).ToList(); var lastVisitedSlide = slides.First().Index; foreach (var slide in slides) { if (visitedIds.Contains(slide.Id)) { lastVisitedSlide = slide.Index; } else { return(lastVisitedSlide); } } return(lastVisitedSlide); }
private TocModel CreateTocModel(Course course, Guid?currentSlideId, string userId) { var visibleUnits = unitsRepo.GetVisibleUnits(course, User); var visited = visitsRepo.GetIdOfVisitedSlides(course.Id, userId); var scoresForSlides = visitsRepo.GetScoresForSlides(course.Id, userId); var solvedSlidesIds = ControllerUtils.GetSolvedSlides(solutionsRepo, userQuizzesRepo, course, userId); var slidesWithUsersManualChecking = visitsRepo.GetSlidesWithUsersManualChecking(course.Id, userId).ToImmutableHashSet(); var enabledManualCheckingForUser = groupsRepo.IsManualCheckingEnabledForUser(course, userId); Func <Slide, int> getSlideMaxScoreFunc = s => ControllerUtils.GetMaxScoreForUsersSlide(s, solvedSlidesIds.Contains(s.Id), slidesWithUsersManualChecking.Contains(s.Id), enabledManualCheckingForUser); var userGroupsIds = groupsRepo.GetUserGroupsIds(course.Id, userId); var enabledScoringGroupsIds = groupsRepo.GetEnabledAdditionalScoringGroups(course.Id) .Where(e => userGroupsIds.Contains(e.GroupId)) .Select(e => e.ScoringGroupId) .ToList(); var additionalScores = additionalScoresRepo.GetAdditionalScoresForUser(course.Id, userId); var builder = new TocModelBuilder( s => Url.RouteUrl("Course.SlideById", new { courseId = course.Id, slideId = s.Url }), s => scoresForSlides.ContainsKey(s.Id) ? scoresForSlides[s.Id] : 0, getSlideMaxScoreFunc, (u, g) => additionalScores.GetOrDefault(Tuple.Create(u.Id, g.Id), 0), course, currentSlideId) { GetUnitInstructionNotesUrl = unit => Url.Action("InstructorNote", "Course", new { courseId = course.Id, unitId = unit.Id }), GetUnitStatisticsUrl = unit => Url.Action("UnitStatistics", "Analytics", new { courseId = course.Id, unitId = unit.Id }), IsInstructor = User.HasAccessFor(course.Id, CourseRole.Instructor), IsSolved = s => solvedSlidesIds.Contains(s.Id), IsVisited = s => visited.Contains(s.Id), IsUnitVisible = visibleUnits.Contains, IsSlideHidden = s => s is QuizSlide && ((QuizSlide)s).ManualChecking && !enabledManualCheckingForUser && !solvedSlidesIds.Contains(s.Id), EnabledScoringGroupsIds = enabledScoringGroupsIds, }; var userGroups = groupsRepo.GetUserGroups(course.Id, User.Identity.GetUserId()); var tocGroupsForStatistics = userGroups.Select(g => new TocGroupForStatistics { GroupName = g.Name, StatisticsUrl = Url.Action("CourseStatistics", "Analytics", new { courseId = course.Id, group = g.Id }) }); var toc = builder.CreateTocModel(tocGroupsForStatistics.ToList()); toc.NextUnitTime = unitsRepo.GetNextUnitPublishTime(course.Id); return(toc); }
private TocModel CreateTocModel(Course course, int slideIndex, string userId) { var visibleUnits = unitsRepo.GetVisibleUnits(course.Id, User); var solved = GetSolvedSlides(course, userId); var visited = visitsRepo.GetIdOfVisitedSlides(course.Id, userId); var scoresForSlides = visitsRepo.GetScoresForSlides(course.Id, userId); var builder = new TocModelBuilder( s => Url.Action("Slide", "Course", new { courseId = course.Id, slideIndex = s.Index }), s => scoresForSlides.ContainsKey(s.Id) ? scoresForSlides[s.Id] : 0, course, slideIndex); builder.GetUnitInstructionNotesUrl = unitName => Url.Action("InstructorNote", "Course", new { courseId = course.Id, unitName }); builder.GetUnitStatisticsUrl = unitName => Url.Action("UnitStatistics", "Analytics", new { courseId = course.Id, unitName }); builder.IsInstructor = User.HasAccessFor(course.Id, CourseRole.Instructor); builder.IsSolved = s => solved.Contains(s.Id); builder.IsVisited = s => visited.Contains(s.Id); builder.IsUnitVisible = visibleUnits.Contains; var toc = builder.CreateTocModel(); toc.NextUnitTime = unitsRepo.GetNextUnitPublishTime(course.Id); return(toc); }