Exemple #1
0
        public async Task <ActionResult <GroupInfo> > Group(Guid inviteHash)
        {
            var group = await groupsRepo.FindGroupByInviteHashAsync(inviteHash).ConfigureAwait(false);

            var isMember = await groupMembersRepo.IsUserMemberOfGroup(@group.Id, UserId).ConfigureAwait(false);

            return(BuildGroupInfo(group, isUserMemberOfGroup: isMember));
        }
        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
            });
        }