Beispiel #1
0
        private IEnumerable <LinkDto> CreateLinksForStores(
            StoresResourceParameters storesResourceParameters,
            bool hasNext, bool hasPrevious)
        {
            var links = new List <LinkDto>
            {
                new LinkDto(CreateStoresResourceUri(storesResourceParameters,
                                                    ResourceUriType.Current)
                            , "self", "GET")
            };

            if (hasNext)
            {
                links.Add(
                    new LinkDto(CreateStoresResourceUri(storesResourceParameters,
                                                        ResourceUriType.NextPage),
                                "nextPage", "GET"));
            }

            if (hasPrevious)
            {
                links.Add(
                    new LinkDto(CreateStoresResourceUri(storesResourceParameters,
                                                        ResourceUriType.PreviousPage),
                                "previousPage", "GET"));
            }

            return(links);
        }
Beispiel #2
0
        private string CreateStoresResourceUri(StoresResourceParameters storesResourceParameters,
                                               ResourceUriType type)
        {
            switch (type)
            {
            case ResourceUriType.PreviousPage:
                return(_urlHelper.Link("GetStores",
                                       new
                {
                    fields = storesResourceParameters.Fields,
                    orderBy = storesResourceParameters.OrderBy,
                    searchQuery = storesResourceParameters.SearchQuery,
                    pageNumber = storesResourceParameters.PageIndex - 1,
                    pageSize = storesResourceParameters.PageSize
                }));

            case ResourceUriType.NextPage:
                return(_urlHelper.Link("GetStores",
                                       new
                {
                    fields = storesResourceParameters.Fields,
                    orderBy = storesResourceParameters.OrderBy,
                    searchQuery = storesResourceParameters.SearchQuery,
                    pageNumber = storesResourceParameters.PageIndex + 1,
                    pageSize = storesResourceParameters.PageSize
                }));

            case ResourceUriType.Current:
            default:
                return(_urlHelper.Link("GetStores",
                                       new
                {
                    fields = storesResourceParameters.Fields,
                    orderBy = storesResourceParameters.OrderBy,
                    searchQuery = storesResourceParameters.SearchQuery,
                    pageNumber = storesResourceParameters.PageIndex,
                    pageSize = storesResourceParameters.PageSize
                }));
            }
        }
Beispiel #3
0
        public async Task <IActionResult> GetStoresAsync([FromQuery] StoresResourceParameters storesResourceParameters,
                                                         [FromHeader(Name = "Accept")] string mediaType)
        {
            if (!_propertyMappingService.ValidMappingExistsFor <StoreUiModel, Store>
                    (storesResourceParameters.OrderBy))
            {
                return(BadRequest());
            }

            if (!_typeHelperService.TypeHasProperties <StoreUiModel>
                    (storesResourceParameters.Fields))
            {
                return(BadRequest());
            }

            var storesQueryable =
                await _inquiryAllStoresProcessor.GetStoresAsync(storesResourceParameters);

            var stores = Mapper.Map <IEnumerable <StoreUiModel> >(storesQueryable);

            if (mediaType.Contains("application/vnd.marvin.hateoas+json"))
            {
                var paginationMetadata = new
                {
                    totalCount  = storesQueryable.TotalCount,
                    pageSize    = storesQueryable.PageSize,
                    currentPage = storesQueryable.CurrentPage,
                    totalPages  = storesQueryable.TotalPages,
                };

                Response.Headers.Add("X-Pagination", JsonConvert.SerializeObject(paginationMetadata));

                var links = CreateLinksForStores(storesResourceParameters,
                                                 storesQueryable.HasNext, storesQueryable.HasPrevious);

                var shapedStores = stores.ShapeData(storesResourceParameters.Fields);

                var shapedStoresWithLinks = shapedStores.Select(store =>
                {
                    var storeAsDictionary = store as IDictionary <string, object>;
                    var storeLinks        =
                        CreateLinksForStore((Guid)storeAsDictionary["Id"], storesResourceParameters.Fields);

                    storeAsDictionary.Add("links", storeLinks);

                    return(storeAsDictionary);
                });

                var linkedCollectionResource = new
                {
                    value = shapedStoresWithLinks,
                    links = links
                };

                return(Ok(linkedCollectionResource));
            }
            else
            {
                var previousPageLink = storesQueryable.HasPrevious ? CreateStoresResourceUri(storesResourceParameters,
                                                                                             ResourceUriType.PreviousPage)
          : null;

                var nextPageLink = storesQueryable.HasNext
          ? CreateStoresResourceUri(storesResourceParameters, ResourceUriType.NextPage)
          : null;

                var paginationMetadata = new
                {
                    previousPageLink = previousPageLink,
                    nextPageLink     = nextPageLink,
                    totalCount       = storesQueryable.TotalCount,
                    pageSize         = storesQueryable.PageSize,
                    currentPage      = storesQueryable.CurrentPage,
                    totalPages       = storesQueryable.TotalPages
                };

                Response.Headers.Add("X-Pagination",
                                     JsonConvert.SerializeObject(paginationMetadata));

                return(Ok(stores.ShapeData(storesResourceParameters.Fields)));
            }
        }
Beispiel #4
0
 public Task <PagedList <Store> > GetStoresAsync(StoresResourceParameters storesResourceParameters)
 {
     throw new System.NotImplementedException();
 }