public async Task <PagedList <Users> > GetUsersAsync(DtoUserParameter parameter) { var queryExpression = _context.Set <Users>() as IQueryable <Users>; if (!string.IsNullOrWhiteSpace(parameter.Username)) { queryExpression = queryExpression.Where(c => c.Username.Contains(parameter.Username)); } if (!string.IsNullOrWhiteSpace(parameter.Account)) { queryExpression = queryExpression.Where(c => c.Account == parameter.Account); } var mappingDictionary = _propertyMappingService.GetPropertyMapping <UserDto, Users>(); queryExpression = queryExpression.ApplySort(parameter.OrderBy, mappingDictionary); return(await PagedList <Users> .CreateAsync(queryExpression, parameter.PageNumber, parameter.PageSize)); }
public async Task <IActionResult> GetUsers([FromQuery] DtoUserParameter parameter) { if (!_propertyCheckerService.TypeHasProperties <UserDto>(parameter.Fields)) { return(BadRequest()); } if (!_propertyMappingService.ValidMappingExistsFor <UserDto, Users>(parameter.OrderBy)) { return(BadRequest()); } var users = await _userRepository.GetUsersAsync(parameter); var paginationMetadata = new { totalCount = users.TotalCount, pageSize = users.PageSize, currentPage = users.CurrentPage, totalPages = users.TotalPages, }; Response.Headers.Add("X-Pagination", JsonSerializer.Serialize(paginationMetadata, new JsonSerializerOptions { Encoder = JavaScriptEncoder.UnsafeRelaxedJsonEscaping })); var userDtos = _mapper.Map <IList <UserDto> >(users); var shapedData = userDtos.shapeData(parameter.Fields); var links = CreateLinksForUsers(parameter, users.HasPrevious, users.HasNext); var shapedUsersWithLinks = shapedData.Select(c => { var userDict = c as IDictionary <string, object>; var userLinks = CreateLinksForUsers((int)userDict["Id"], null); userDict.Add("links", userLinks); return(userDict); }); var linkedCollectionResource = new { value = shapedUsersWithLinks, links }; return(Ok(linkedCollectionResource)); }
private string CreateUsersResourceUri(DtoUserParameter parameters, ResourceUriType type) { switch (type) { case ResourceUriType.PreviousPage: return(Url.Link(nameof(GetUsers), new { fields = parameters.Fields, pageNumber = parameters.PageNumber - 1, pageSize = parameters.PageSize, username = parameters.Username, account = parameters.Account, orderBy = parameters.OrderBy })); case ResourceUriType.NextPage: return(Url.Link(nameof(GetUsers), new { fields = parameters.Fields, pageNumber = parameters.PageNumber + 1, pageSize = parameters.PageSize, username = parameters.Username, account = parameters.Account, orderBy = parameters.OrderBy })); case ResourceUriType.CurrentPage: default: return(Url.Link(nameof(GetUsers), new { fields = parameters.Fields, pageNumber = parameters.PageNumber, pageSize = parameters.PageSize, username = parameters.Username, account = parameters.Account, orderBy = parameters.OrderBy })); } }
private IEnumerable <LinkDto> CreateLinksForUsers(DtoUserParameter parameters, bool hasPrevious, bool hasNext) { var links = new List <LinkDto>(); links.Add(new LinkDto(CreateUsersResourceUri(parameters, ResourceUriType.CurrentPage), "self", "GET")); if (hasPrevious) { links.Add(new LinkDto(CreateUsersResourceUri(parameters, ResourceUriType.PreviousPage), "previous_page", "GET")); } if (hasNext) { links.Add(new LinkDto(CreateUsersResourceUri(parameters, ResourceUriType.NextPage), "next_page", "GET")); } return(links); }