private async Task <List <string> > GetUserIdsWithProgressNotVisibleForUser(string courseId, List <string> userIds) { var isSystemAdministrator = await IsSystemAdministratorAsync().ConfigureAwait(false); if (isSystemAdministrator) { return(null); } if (await groupAccessesRepo.CanUserSeeAllCourseGroupsAsync(UserId, courseId)) { return(null); } var userRole = await courseRolesRepo.GetRoleAsync(UserId, courseId).ConfigureAwait(false); var groups = userRole == CourseRoleType.Instructor ? await groupAccessesRepo.GetAvailableForUserGroupsAsync(courseId, UserId, false, true, false) : new List <Group>(); groups = groups .Concat((await groupMembersRepo.GetUserGroupsAsync(courseId, UserId, false)).Where(g => g.CanUsersSeeGroupProgress)) .Distinct().ToList(); var members = new [] { UserId }.Concat(await groupMembersRepo.GetGroupsMembersIdsAsync(groups.Select(g => g.Id).ToList())).ToHashSet(); var allIdsInMembers = members.IsSupersetOf(userIds); if (allIdsInMembers) { return(null); } var notVisibleUserIds = userIds.ToHashSet(); notVisibleUserIds.ExceptWith(members); return(notVisibleUserIds.ToList()); }
public async Task <ActionResult <CourseRolesResponse> > CourseRoles() { var userId = User.GetUserId(); var isSystemAdministrator = await usersRepo.IsSystemAdministrator(userId); var visibleCourses = await unitsRepo.GetVisibleCourses(); var rolesByCourse = (await courseRolesRepo.GetRoles(userId).ConfigureAwait(false)) .Where(kvp => kvp.Value != CourseRoleType.Student).ToList(); var courseAccesses = await coursesRepo.GetUserAccesses(userId).ConfigureAwait(false); var courseAccessesByCourseId = courseAccesses.GroupBy(a => a.CourseId).Select( g => new CourseAccessResponse { CourseId = g.Key, Accesses = g.Select(a => a.AccessType).ToList() } ).ToList(); var coursesInWhichUserHasAnyRole = new HashSet <string>(rolesByCourse.Select(kvp => kvp.Key), StringComparer.OrdinalIgnoreCase); var groupsWhereIAmStudent = (await groupMembersRepo.GetUserGroupsAsync(userId).ConfigureAwait(false)) .Where(g => visibleCourses.Contains(g.CourseId) || coursesInWhichUserHasAnyRole.Contains(g.CourseId) || isSystemAdministrator); return(new CourseRolesResponse { IsSystemAdministrator = isSystemAdministrator, CourseRoles = rolesByCourse.Select(kvp => new CourseRoleResponse { CourseId = kvp.Key, Role = kvp.Value, }).ToList(), CourseAccesses = courseAccessesByCourseId, GroupsAsStudent = groupsWhereIAmStudent.Where(g => g.CanUsersSeeGroupProgress).Select(BuildShortGroupInfo).ToList() }); }
public async Task <ActionResult <CourseRolesResponse> > CourseRoles() { var userId = User.GetUserId(); var isSystemAdministrator = User.IsSystemAdministrator(); var rolesByCourse = await courseRolesRepo.GetRolesAsync(userId).ConfigureAwait(false); var courseAccesses = await coursesRepo.GetUserAccessesAsync(userId).ConfigureAwait(false); var courseAccessesByCourseId = courseAccesses.GroupBy(a => a.CourseId).Select( g => new CourseAccessResponse { CourseId = g.Key, Accesses = g.Select(a => a.AccessType).ToList() } ).ToList(); var groupsWhereIAmStudent = await groupMembersRepo.GetUserGroupsAsync(userId).ConfigureAwait(false); return(new CourseRolesResponse { IsSystemAdministrator = isSystemAdministrator, CourseRoles = rolesByCourse.Where(kvp => kvp.Value != CourseRoleType.Student).Select(kvp => new CourseRoleResponse { CourseId = kvp.Key, Role = kvp.Value, }).ToList(), CourseAccesses = courseAccessesByCourseId, GroupsAsStudent = groupsWhereIAmStudent.Where(g => g.CanUsersSeeGroupProgress).Select(BuildShortGroupInfo).ToList() }); }
public async Task <List <string> > GetInstructorsOfAllGroupsWhereUserIsMemberAsync(string courseId, string userId) { var groupsWhereUserIsStudent = await groupMembersRepo.GetUserGroupsAsync(courseId, userId).ConfigureAwait(false); var accesses = await GetGroupAccessesAsync(groupsWhereUserIsStudent.Select(g => g.Id)).ConfigureAwait(false); var ownersIds = groupsWhereUserIsStudent.Select(g => g.OwnerId).ToList(); return(accesses .SelectMany(kvp => kvp.Value.Select(a => a.User.Id)) .Concat(ownersIds) .Distinct() .ToList()); }