private IEnumerable <LinkDto> CreateLinksForDevice(
            DeviceResourceParameters deviceResourceParameters,
            bool hasNext, bool hasPrevious)
        {
            var links = new List <LinkDto>();

            // self
            links.Add(
                new LinkDto(CreateDevicesResourceUri(
                                deviceResourceParameters, ResourceUriType.Current)
                            , "self", "GET"));

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

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

            return(links);
        }
Exemple #2
0
        public PagedList <Device> GetDevices(DeviceResourceParameters deviceResourseParameters)
        {
            if (deviceResourseParameters == null)
            {
                throw new ArgumentNullException(nameof(deviceResourseParameters));
            }

            if (deviceResourseParameters.TerminalId == Guid.Empty)
            {
                throw new ArgumentNullException(nameof(deviceResourseParameters));
            }

            var collection = _context.Device as IQueryable <Device>;

            collection = collection.Where(a => a.TerminalId == deviceResourseParameters.TerminalId);

            if (!string.IsNullOrWhiteSpace(deviceResourseParameters.SearchQuery))
            {
                var searchQuery = deviceResourseParameters.SearchQuery.Trim();
                collection = collection.Where(a => a.ModelName.Contains(searchQuery) || a.SerialNumber.Contains(searchQuery));
            }

            if (!string.IsNullOrWhiteSpace(deviceResourseParameters.OrderBy))
            {
                var devicePropertyMappingDictionary = _propertyMappingService.GetDevicePropertyMapping <DevicesDto, Device>();

                collection = collection.ApplySort(deviceResourseParameters.OrderBy, devicePropertyMappingDictionary);
            }

            //Paging.... happens LAST
            return(PagedList <Device> .Create(collection,
                                              deviceResourseParameters.PageNumber,
                                              deviceResourseParameters.PageSize));
        }
        public IActionResult GetDevices(Guid terminalId,
                                        [FromQuery] DeviceResourceParameters deviceResourceParameters)
        {
            if (!_propertyMappingService.ValidDeviceMappingExistsFor <DevicesDto, Entities.Device>
                    (deviceResourceParameters.OrderBy))
            {
                return(BadRequest());
            }

            deviceResourceParameters.TerminalId = terminalId;

            var devicesFromRepo = _deviceRepository.GetDevices(deviceResourceParameters);

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

            Response.Headers.Add("X-Pagination",
                                 JsonSerializer.Serialize(paginationMetadata));

            var links = CreateLinksForDevice(deviceResourceParameters,
                                             devicesFromRepo.HasNext,
                                             devicesFromRepo.HasPrevious);

            var shapedDevices = _mapper.Map <IEnumerable <DevicesDto> >(devicesFromRepo)
                                .ShapeData(deviceResourceParameters.Fields);

            var shapedDevicesWithLinks = shapedDevices.Select(devices =>
            {
                var deviceAsDictionary = devices as IDictionary <string, object>;
                var deviceLinks        = CreateLinksForDevice(terminalId.ToString(), (string)deviceAsDictionary["Id"], null);
                deviceAsDictionary.Add("links", deviceLinks);
                return(deviceAsDictionary);
            });

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

            return(Ok(linkedCollectionResource));
        }
        private string CreateDevicesResourceUri(
            DeviceResourceParameters deviceResourceParameters,
            ResourceUriType type)
        {
            switch (type)
            {
            case ResourceUriType.PreviousPage:
                return(Url.Link("GetDevices",
                                new
                {
                    fields = deviceResourceParameters.Fields,
                    orderBy = deviceResourceParameters.OrderBy,
                    pageNumber = deviceResourceParameters.PageNumber - 1,
                    pageSize = deviceResourceParameters.PageSize,
                    searchQuery = deviceResourceParameters.SearchQuery
                }));

            case ResourceUriType.NextPage:
                return(Url.Link("GetDevices",
                                new
                {
                    fields = deviceResourceParameters.Fields,
                    orderBy = deviceResourceParameters.OrderBy,
                    pageNumber = deviceResourceParameters.PageNumber + 1,
                    pageSize = deviceResourceParameters.PageSize,
                    searchQuery = deviceResourceParameters.SearchQuery
                }));

            case ResourceUriType.Current:
            default:
                return(Url.Link("GetDevices",
                                new
                {
                    fields = deviceResourceParameters.Fields,
                    orderBy = deviceResourceParameters.OrderBy,
                    pageNumber = deviceResourceParameters.PageNumber,
                    pageSize = deviceResourceParameters.PageSize,
                    searchQuery = deviceResourceParameters.SearchQuery
                }));
            }
        }