public async Task <ActionResult <CourseInfo> > CourseInfo(Course course) { if (course == null) { return(Json(new { status = "error", message = "Course not found" })); } var visibleUnits = unitsRepo.GetVisibleUnits(course, User); var containsFlashcards = course.Units.Any(x => x.Slides.OfType <FlashcardSlide>().Any()); var isInstructor = await courseRolesRepo.HasUserAccessToCourseAsync(User.GetUserId(), course.Id, CourseRoleType.Instructor).ConfigureAwait(false); var showInstructorsSlides = isInstructor; var getSlideMaxScoreFunc = await BuildGetSlideMaxScoreFunc(solutionsRepo, userQuizzesRepo, visitsRepo, groupsRepo, course, User.GetUserId()); return(new CourseInfo { Id = course.Id, Title = course.Title, Description = course.Settings.Description, NextUnitPublishTime = unitsRepo.GetNextUnitPublishTime(course.Id), Units = visibleUnits.Select(unit => BuildUnitInfo(course.Id, unit, showInstructorsSlides, getSlideMaxScoreFunc)).ToList(), ContainsFlashcards = containsFlashcards }); }
public async Task <ActionResult <CourseInfo> > CourseInfo([FromRoute] string courseId, [FromQuery][CanBeNull] int?groupId = null) { if (!await courseManager.HasCourseAsync(courseId)) { return(NotFound(new ErrorResponse("Course not found"))); } var course = await courseManager.FindCourseAsync(courseId); List <UnitInfo> units; var visibleUnitsIds = await unitsRepo.GetVisibleUnitIdsAsync(course, UserId); var visibleUnits = course.GetUnits(visibleUnitsIds); if (groupId == null) { var isInstructor = await courseRolesRepo.HasUserAccessToCourseAsync(UserId, course.Id, CourseRoleType.Instructor).ConfigureAwait(false); if (!isInstructor && visibleUnits.Count == 0) { return(NotFound(new ErrorResponse("Course not found"))); } var unitAppearances = !isInstructor ? new Dictionary <Guid, UnitAppearance>() : (await unitsRepo.GetUnitAppearancesAsync(course)).ToDictionary(a => a.UnitId, a => a); var publishedUnitIds = new HashSet <Guid>(!isInstructor ? visibleUnitsIds : await unitsRepo.GetPublishedUnitIdsAsync(course)); var getSlideMaxScoreFunc = await BuildGetSlideMaxScoreFunc(solutionsRepo, userQuizzesRepo, visitsRepo, groupsRepo, course, UserId); var getGitEditLinkFunc = await BuildGetGitEditLinkFunc(User.GetUserId(), course, courseRolesRepo, coursesRepo); units = visibleUnits.Select(unit => BuildUnitInfo(course.Id, unit, !publishedUnitIds.Contains(unit.Id), publishedUnitIds.Contains(unit.Id) ? null : unitAppearances.GetOrDefault(unit.Id)?.PublishTime, isInstructor, getSlideMaxScoreFunc, getGitEditLinkFunc)).ToList(); } else { var group = await groupsRepo.FindGroupByIdAsync(groupId.Value).ConfigureAwait(false); if (group == null) { return(NotFound(new ErrorResponse("Group not found"))); } async Task <bool> IsUserMemberOfGroup() => await groupMembersRepo.IsUserMemberOfGroup(groupId.Value, UserId).ConfigureAwait(false); async Task <bool> IsGroupVisibleForUserAsync() => await groupAccessesRepo.IsGroupVisibleForUserAsync(groupId.Value, UserId).ConfigureAwait(false); var isGroupAvailableForUser = await IsUserMemberOfGroup() || await IsGroupVisibleForUserAsync(); if (!isGroupAvailableForUser) { return(NotFound(new ErrorResponse("Group not found"))); } if (visibleUnits.Count == 0) { return(NotFound(new ErrorResponse("Course not found"))); } var getSlideMaxScoreFunc = BuildGetSlideMaxScoreFunc(course, group); var getGitEditLinkFunc = await BuildGetGitEditLinkFunc(User.GetUserId(), course, courseRolesRepo, coursesRepo); units = visibleUnits.Select(unit => BuildUnitInfo(course.Id, unit, false, null, false, getSlideMaxScoreFunc, getGitEditLinkFunc)).ToList(); } var containsFlashcards = visibleUnits.Any(x => x.GetSlides(true).OfType <FlashcardSlide>().Any()); var scoringSettings = GetScoringSettings(course); var tempCourseError = (await tempCoursesRepo.GetCourseErrorAsync(courseId))?.Error; var isTempCourse = await tempCoursesRepo.FindAsync(courseId) != null; return(new CourseInfo { Id = course.Id, Title = isTempCourse ? "Временный - " + course.Title : course.Title, Description = course.Settings.Description, Scoring = scoringSettings, NextUnitPublishTime = unitsRepo.GetNextUnitPublishTime(course.Id), Units = units, ContainsFlashcards = containsFlashcards, IsTempCourse = isTempCourse, TempCourseError = tempCourseError }); }