private async Task <GroupsListResponse> GetGroupsListResponseAsync(GroupsListParameters parameters) { var groups = await groupAccessesRepo.GetAvailableForUserGroupsAsync(parameters.CourseId, UserId, false, !parameters.Archived, parameters.Archived).ConfigureAwait(false); /* Order groups by (name, createTime) and get one page of data (offset...offset+count) */ var groupIds = groups.OrderBy(g => g.Name, StringComparer.InvariantCultureIgnoreCase).ThenBy(g => g.Id) .Skip(parameters.Offset) .Take(parameters.Count) .Select(g => g.Id) .ToImmutableHashSet(); var filteredGroups = groups.Where(g => groupIds.Contains(g.Id)).ToList(); var groupMembers = await groupMembersRepo.GetGroupsMembersAsync(groupIds).ConfigureAwait(false); var membersCountByGroup = groupMembers.GroupBy(m => m.GroupId).ToDictionary(g => g.Key, g => g.Count()).ToDefaultDictionary(); var groupAccessesByGroup = await groupAccessesRepo.GetGroupAccessesAsync(groupIds).ConfigureAwait(false); var groupInfos = filteredGroups.Select(g => BuildGroupInfo( g, membersCountByGroup[g.Id], groupAccessesByGroup[g.Id], addGroupApiUrl: true )).ToList(); return(new GroupsListResponse { Groups = groupInfos, Pagination = new PaginationResponse { Offset = parameters.Offset, Count = filteredGroups.Count, TotalCount = groups.Count, } }); }
public async Task <ActionResult <GroupsListResponse> > GroupsList([FromQuery] GroupsListParameters parameters) { return(await GetGroupsListResponseAsync(parameters).ConfigureAwait(false)); }
public async Task <ActionResult <GroupsListResponse> > ArchivedGroupsList(ICourse course, [FromQuery] GroupsListParameters parameters) { return(await GetGroupsListResponseAsync(course, parameters, onlyArchived : true).ConfigureAwait(false)); }