private IEnumerable <LinkDto> CreateCollectorValuesLinks
            (CollectorValuesResourceParameters resourceParameters,
            bool hasNext, bool hasPrevious)
        {
            var links = new List <LinkDto>
            {
                new LinkDto(CreateCollectorValuesResourceUri
                                (resourceParameters, ResourceUriType.Current),
                            "self", "GET")
            };

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

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

            return(links);
        }
        private string CreateCollectorValuesResourceUri(CollectorValuesResourceParameters resourceParameters,
                                                        ResourceUriType type)
        {
            switch (type)
            {
            case ResourceUriType.PreviousPage:
                return(Url.Link("GetCollectorValues", new
                {
                    orderBy = resourceParameters.OrderBy,
                    fields = resourceParameters.Fields,
                    page = resourceParameters.Page - 1,
                    pageSize = resourceParameters.PageSize
                }));

            case ResourceUriType.NextPage:
                return(Url.Link("GetCollectorValues", new
                {
                    orderBy = resourceParameters.OrderBy,
                    fields = resourceParameters.Fields,
                    page = resourceParameters.Page + 1,
                    pageSize = resourceParameters.PageSize
                }));

            default:
                return(Url.Link("GetCollectorValues", new
                {
                    orderBy = resourceParameters.OrderBy,
                    fields = resourceParameters.Fields,
                    page = resourceParameters.Page,
                    pageSize = resourceParameters.PageSize
                }));
            }
        }
        public async Task <PagedList <CollectorValue> > FindCollectorValues(CollectorValuesResourceParameters resourceParameters)
        {
            var collectorValues = await _unitOfWork.CollectorValues.GetAll();

            collectorValues = collectorValues.OrderBy(resourceParameters.OrderBy,
                                                      PropertyMappingService.CollectorValuePropertyMapping);

            return(PagedList <CollectorValue> .Create(collectorValues.ToList(), resourceParameters.Page, resourceParameters.PageSize));
        }
        public CollectorValuesControllerTests()
        {
            _mockCollectorValueService = new Mock <ICollectorValueService>();
            _mockCollectorValueService.Setup(c => c.Save()).ReturnsAsync(true);

            _controller = new CollectorValuesController(_mockCollectorValueService.Object, _mapper);
            SetupTestController(_controller);

            _builder                  = new CollectorValueTestBuilder();
            resourceParameters        = new CollectorValuesResourceParameters();
            resourceParameters.Fields = "Id, G4";
        }
        public async Task <IActionResult> GetCollectorValues(CollectorValuesResourceParameters resourceParameters,
                                                             [FromHeader(Name = "Accept")] string mediaType)
        {
            if (!PropertyMappingService.ValidMappingExistsFor <CollectorValue>(resourceParameters.OrderBy))
            {
                return(BadRequest());
            }

            if (!TypeHelper.TypeHasProperties <CollectorValueDto>
                    (resourceParameters.Fields))
            {
                return(BadRequest());
            }

            var retrievedCollectorValues = await _collectorValueService.FindCollectorValues(resourceParameters);

            var collectorValues       = _mapper.Map <IEnumerable <CollectorValueDto> >(retrievedCollectorValues);
            var shapedCollectorValues = collectorValues.ShapeData(resourceParameters.Fields);

            if (mediaType == "application/json+hateoas")
            {
                if (!string.IsNullOrEmpty(resourceParameters.Fields) &&
                    !resourceParameters.Fields.ToLowerInvariant().Contains("id"))
                {
                    return(BadRequest("Field parameter 'id' is required"));
                }

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

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

                var links = CreateCollectorValuesLinks(resourceParameters,
                                                       retrievedCollectorValues.HasNext, retrievedCollectorValues.HasPrevious);

                var linkedCollectorValues = shapedCollectorValues.Select(collectorValue =>
                {
                    var collectorValueAsDictionary = collectorValue as IDictionary <string, object>;
                    var collectorValueLinks        = CreateCollectorValueLinks
                                                         ((Guid)collectorValueAsDictionary["Id"], resourceParameters.Fields);

                    collectorValueAsDictionary.Add("links", collectorValueLinks);

                    return(collectorValueAsDictionary);
                });

                var linkedCollectionResource = new LinkedCollectionResource
                {
                    Value = linkedCollectorValues,
                    Links = links
                };

                return(Ok(linkedCollectionResource));
            }
            else
            {
                var previousPageLink = retrievedCollectorValues.HasPrevious ?
                                       CreateCollectorValuesResourceUri(resourceParameters,
                                                                        ResourceUriType.PreviousPage) : null;

                var nextPageLink = retrievedCollectorValues.HasNext ?
                                   CreateCollectorValuesResourceUri(resourceParameters,
                                                                    ResourceUriType.NextPage) : null;

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

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

                return(Ok(shapedCollectorValues));
            }
        }
 public CollectorValueServiceTests()
 {
     _collectorValueService = new CollectorValueService(_unitOfWork);
     resourceParameters     = new CollectorValuesResourceParameters();
 }