예제 #1
0
        public ActionResult <IEnumerable <BrewWithoutAdditionalInfoDto> > GetBrews(
            [FromQuery] BrewsResourceParameters brewsResourceParameters,
            [FromHeader(Name = ExtendedControllerBase.ACCEPT)] string mediaTypes)
        {
            if (!_propertyMappingService.ValidMappingExistsFor <BrewDto, Entities.Brew>
                    (brewsResourceParameters.OrderBy))
            {
                return(BadRequest());
            }

            var splitMediaTypes = mediaTypes.Split(',');

            if (!MediaTypeHeaderValue.TryParseList(splitMediaTypes,
                                                   out IList <MediaTypeHeaderValue> parsedMediaTypes))
            {
                return(BadRequest());
            }

            var brews = _homebrewRepository.GetBrews(brewsResourceParameters);

            var paginationMetaData = new
            {
                totalCount  = brews.TotalCount,
                pageSize    = brews.PageSize,
                currentPage = brews.CurrentPage,
                totalPages  = brews.TotalPages
            };

            Response.Headers.Add(this.PAGINATION_HEADER,
                                 JsonSerializer.Serialize(paginationMetaData));

            var shapedBrews = brewsResourceParameters.IncludeAdditionalInfo ?
                              _mapper.Map <IEnumerable <BrewDto> >(brews).ShapeData(null) :
                              _mapper.Map <IEnumerable <BrewWithoutAdditionalInfoDto> >(brews).ShapeData(null);

            if (parsedMediaTypes.Any(pmt => pmt.SubTypeWithoutSuffix.EndsWith(this.HATEOAS, StringComparison.InvariantCultureIgnoreCase)))
            {
                var links = CreateLinksForBrews(brewsResourceParameters,
                                                brews.HasNext,
                                                brews.HasPrevious);

                var shapedBrewsWithLinks = shapedBrews.Select(brew =>
                {
                    var brewAsDictionary = brew as IDictionary <string, object>;
                    var brewLinks        = CreateLinksForBrew((int)brewAsDictionary["Id"], false);
                    brewAsDictionary.Add(this.LINKS, brewLinks);
                    return(brewAsDictionary);
                });

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

                return(Ok(linkedCollectionResource));
            }

            return(Ok(shapedBrews));
        }