public async Task <IActionResult> GetHateaos(OrderQueryParameter parameter) { if (!_propertyMappingContainer.ValidateMappingExsitFor <OrderResourceModel, Order>(parameter.OrderBy)) { return(BadRequest("Can't finds fields for sorting")); } if (!_typeHelperService.TypeHasProperties <OrderResourceModel>(parameter.Fields)) { return(BadRequest("Fields not exist")); } var paginatedList = await _orderRepository.GetOrdersAsync(parameter); var orderResourceModel = _mapper.Map <IEnumerable <Order>, IEnumerable <OrderResourceModel> >(paginatedList); var previousPageLink = paginatedList.HasPrevious ? CreateOrderUrl(parameter, PaginatedUrlType.PreviousPage) : null; var nextPageLink = paginatedList.HasNext ? CreateOrderUrl(parameter, PaginatedUrlType.NextPage) : null; var meta = new { paginatedList.PageIndex, paginatedList.PageSize, paginatedList.TotalItemCount, paginatedList.PageCount, }; Response.Headers.Add("X-Pagination", JsonConvert.SerializeObject(meta, new JsonSerializerSettings() { ContractResolver = new CamelCasePropertyNamesContractResolver() })); var shapeOrderResources = orderResourceModel.ToDynamicIEnumerable(parameter.Fields); _logger.LogInformation(JsonConvert.SerializeObject(shapeOrderResources)); var shapedWithLinks = shapeOrderResources.Select(x => { var dict = x as IDictionary <string, object>; var orderLinks = CreateLinksForOrder((Guid)dict["Id"], parameter.Fields); dict.Add("links", orderLinks); return(dict); }); var links = CreateLinksForOrders(parameter, paginatedList.HasPrevious, paginatedList.HasNext); var result = new { value = shapedWithLinks, links }; return(Ok(result)); }
private string CreateOrderUrl(OrderQueryParameter parameter, PaginatedUrlType paginatedUrlType) { switch (paginatedUrlType) { case PaginatedUrlType.PreviousPage: parameter.PageIndex -= 1; return(_urlHelper.Link("GetOrders", parameter)); case PaginatedUrlType.NextPage: parameter.PageIndex += 1; return(_urlHelper.Link("GetOrders", parameter)); default: return(_urlHelper.Link("GetOrders", parameter)); } }
private IEnumerable <LinkResourceModel> CreateLinksForOrders(OrderQueryParameter orderQueryParameter, bool hasPrevious, bool hasNext) { var links = new List <LinkResourceModel> { new LinkResourceModel(CreateOrderUrl(orderQueryParameter, PaginatedUrlType.CurrentPage), "self", "GET") }; if (hasPrevious) { links.Add(new LinkResourceModel(CreateOrderUrl(orderQueryParameter, PaginatedUrlType.PreviousPage), "previous_page", "GET")); } if (hasNext) { links.Add(new LinkResourceModel(CreateOrderUrl(orderQueryParameter, PaginatedUrlType.NextPage), "next_page", "GET")); } return(links); }
public async Task <PaginatedList <Order> > GetOrdersAsync(OrderQueryParameter orderQueryParameter) { var query = _dbContext.Orders.OrderBy(x => x.Id).AsQueryable(); if (!string.IsNullOrEmpty(orderQueryParameter.OrderNo)) { query = query.Where(x => x.OrderNo == orderQueryParameter.OrderNo); } if (!string.IsNullOrEmpty(orderQueryParameter.ReciverName)) { query = query.Where(x => x.ReciverName == orderQueryParameter.ReciverName); } if (!string.IsNullOrEmpty(orderQueryParameter.ReciverMobile)) { query = query.Where(x => x.ReciverMobile == orderQueryParameter.ReciverMobile); } if (!string.IsNullOrEmpty(orderQueryParameter.ReciverProvince)) { query = query.Where(x => x.ReciverProvince == orderQueryParameter.ReciverProvince); } if (!string.IsNullOrEmpty(orderQueryParameter.ReciverCity)) { query = query.Where(x => x.ReciverCity == orderQueryParameter.ReciverCity); } if (!string.IsNullOrEmpty(orderQueryParameter.ReciverDistrict)) { query = query.Where(x => x.ReciverDistrict == orderQueryParameter.ReciverDistrict); } _logger.LogInformation($"Order By => {orderQueryParameter.OrderBy}"); query = query.ApplySort(orderQueryParameter.OrderBy, _propertyMappingContainer.Resolve <OrderResourceModel, Order>()); var count = await query.CountAsync(); query = query.Skip(orderQueryParameter.PageIndex * orderQueryParameter.PageSize) .Take(orderQueryParameter.PageSize); var data = await query.ToListAsync(); var paginatedList = new PaginatedList <Order>(orderQueryParameter.PageIndex, orderQueryParameter.PageSize, count, data); return(paginatedList); }
public async Task <IActionResult> Get(OrderQueryParameter parameter) { if (!_propertyMappingContainer.ValidateMappingExsitFor <OrderResourceModel, Order>(parameter.OrderBy)) { return(BadRequest("Can't finds fields for sorting")); } if (!_typeHelperService.TypeHasProperties <OrderResourceModel>(parameter.Fields)) { return(BadRequest("Fields not exist")); } var paginatedList = await _orderRepository.GetOrdersAsync(parameter); var orderResourceModel = _mapper.Map <IEnumerable <Order>, IEnumerable <OrderResourceModel> >(paginatedList); var previousPageLink = paginatedList.HasPrevious ? CreateOrderUrl(parameter, PaginatedUrlType.PreviousPage) : null; var nextPageLink = paginatedList.HasNext ? CreateOrderUrl(parameter, PaginatedUrlType.NextPage) : null; var meta = new { paginatedList.PageIndex, paginatedList.PageSize, paginatedList.TotalItemCount, paginatedList.PageCount, previousPageLink, nextPageLink }; Response.Headers.Add("X-Pagination", JsonConvert.SerializeObject(meta, new JsonSerializerSettings() { ContractResolver = new CamelCasePropertyNamesContractResolver() })); var shapeOrderResources = orderResourceModel.ToDynamicIEnumerable(parameter.Fields); return(Ok(shapeOrderResources)); }