Example #1
0
        private IEnumerable <LinkDto> CreateLinksForCountries(
            CountriesResourceParameters countriesResourceParameters,
            bool hasNext, bool hasPrevious)
        {
            var links = new List <LinkDto>();

            // self
            links.Add(
                new LinkDto(CreateCountriesResourceUri(countriesResourceParameters,
                                                       ResourceUriType.Current)
                            , "self", "GET"));

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

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

            return(links);
        }
        public CountriesControllerTests()
        {
            _mockCountryService = new Mock <ICountryService>();
            _mockCountryService.Setup(c => c.Save()).ReturnsAsync(true);

            _controller = new CountriesController(_mockCountryService.Object, _mapper);
            SetupTestController(_controller);

            _builder                  = new CountryTestBuilder();
            resourceParameters        = new CountriesResourceParameters();
            resourceParameters.Fields = "Id, Name";
        }
Example #3
0
        public async Task <PagedList <Country> > FindCountries(CountriesResourceParameters resourceParameters)
        {
            var countries = await _unitOfWork.Countries.GetAll();

            if (!string.IsNullOrEmpty(resourceParameters.Name))
            {
                countries = await _unitOfWork.Countries.GetAll(new CountryByName(resourceParameters.Name));
            }

            if (!string.IsNullOrEmpty(resourceParameters.Search))
            {
                countries = await _unitOfWork.Countries
                            .GetAll(new CountryByName(resourceParameters.Name) || new CountryBySearch(resourceParameters.Search));
            }

            countries = countries.OrderBy(resourceParameters.OrderBy,
                                          PropertyMappingService.CountryPropertyMapping);

            return(PagedList <Country> .Create(countries.ToList(), resourceParameters.Page, resourceParameters.PageSize));
        }
Example #4
0
        private string CreateCountriesResourceUri(
            CountriesResourceParameters countriesResourceParameters,
            ResourceUriType type)
        {
            switch (type)
            {
            case ResourceUriType.PreviousPage:
                return(_urlHelper.Link("GetCountries",
                                       new
                {
                    fields = countriesResourceParameters.Fields,
                    orderBy = countriesResourceParameters.OrderBy,
                    searchQuery = countriesResourceParameters.SearchQuery,
                    pageNumber = countriesResourceParameters.PageNumber - 1,
                    pageSize = countriesResourceParameters.PageSize
                }));

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

            default:
                return(_urlHelper.Link("GetCountries",
                                       new
                {
                    fields = countriesResourceParameters.Fields,
                    orderBy = countriesResourceParameters.OrderBy,
                    searchQuery = countriesResourceParameters.SearchQuery,
                    pageNumber = countriesResourceParameters.PageNumber,
                    pageSize = countriesResourceParameters.PageSize
                }));
            }
        }
Example #5
0
        private string CreateCountriesResourceUri(CountriesResourceParameters resourceParameters,
                                                  ResourceUriType type)
        {
            switch (type)
            {
            case ResourceUriType.PreviousPage:
                return(Url.Link("GetCountries", new
                {
                    name = resourceParameters.Name,
                    search = resourceParameters.Search,
                    orderBy = resourceParameters.OrderBy,
                    fields = resourceParameters.Fields,
                    page = resourceParameters.Page - 1,
                    pageSize = resourceParameters.PageSize
                }));

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

            default:
                return(Url.Link("GetCountries", new
                {
                    name = resourceParameters.Name,
                    search = resourceParameters.Search,
                    orderBy = resourceParameters.OrderBy,
                    fields = resourceParameters.Fields,
                    page = resourceParameters.Page,
                    pageSize = resourceParameters.PageSize
                }));
            }
        }
Example #6
0
        public PagedList <Country> GetCountries(CountriesResourceParameters countriesResourceParameters)
        {
            //var collectionBeforePaging =
            //    _context.Countries
            //    .OrderBy(c => c.Name)
            //    .AsQueryable();

            var collectionBeforePaging =
                _context.Countries
                .ApplySort(countriesResourceParameters.OrderBy,
                           _propertyMappingService.GetPropertyMapping <CountryDto, Country>());


            if (!string.IsNullOrEmpty(countriesResourceParameters.Continent))
            {
                // trim & ignore casing
                var continentForWhereClause = countriesResourceParameters.Continent
                                              .Trim().ToLowerInvariant();
                collectionBeforePaging = collectionBeforePaging
                                         .Where(c => c.Continent.ToLowerInvariant() == continentForWhereClause);
            }

            if (!string.IsNullOrEmpty(countriesResourceParameters.SearchQuery))
            {
                // trim & ignore casing
                var searchQueryForWhereClause = countriesResourceParameters.SearchQuery
                                                .Trim().ToLowerInvariant();

                collectionBeforePaging = collectionBeforePaging
                                         .Where(c => c.Name.ToLowerInvariant().Contains(searchQueryForWhereClause));
            }

            return(PagedList <Country> .Create(collectionBeforePaging,
                                               countriesResourceParameters.PageNumber,
                                               countriesResourceParameters.PageSize));
        }
Example #7
0
        public IActionResult GetCountries(CountriesResourceParameters countriesResourceParameters)
        {
            if (!_propertyMappingService.ValidMappingExistsFor <CountryDto, Country>
                    (countriesResourceParameters.OrderBy))
            {
                return(BadRequest());
            }

            if (!_typeHelperService.TypeHasProperties <CountryDto>
                    (countriesResourceParameters.Fields))
            {
                return(BadRequest());
            }

            var countriesFromRepo = _repository.GetCountries(countriesResourceParameters);
            var countries         = Mapper.Map <IEnumerable <CountryDto> >(countriesFromRepo);

            var previousPageLink = countriesFromRepo.HasPrevious ?
                                   CreateCountriesResourceUri(countriesResourceParameters,
                                                              ResourceUriType.PreviousPage) : null;

            var nextPageLink = countriesFromRepo.HasNext ?
                               CreateCountriesResourceUri(countriesResourceParameters,
                                                          ResourceUriType.NextPage) : null;

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

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

            var links = CreateLinksForCountries(countriesResourceParameters,
                                                countriesFromRepo.HasNext, countriesFromRepo.HasPrevious);

            var shapedCountries = countries.ShapeData(countriesResourceParameters.Fields);

            var shapedCountriesWithLinks = shapedCountries.Select(author =>
            {
                var countryAsDictionary = author as IDictionary <string, object>;
                var countryLinks        = CreateLinksForCountry(
                    (int)countryAsDictionary["Id"], countriesResourceParameters.Fields);

                countryAsDictionary.Add("links", countryLinks);

                return(countryAsDictionary);
            });

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

            return(Ok(linkedCollectionResource));
        }
Example #8
0
        public async Task <IActionResult> GetCountries(CountriesResourceParameters resourceParameters,
                                                       [FromHeader(Name = "Accept")] string mediaType)
        {
            if (!PropertyMappingService.ValidMappingExistsFor <Country>(resourceParameters.OrderBy))
            {
                return(BadRequest());
            }

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

            var retrievedCountries = await _countryService.FindCountries(resourceParameters);

            var countries       = _mapper.Map <IEnumerable <CountryDto> >(retrievedCountries);
            var shapedCountries = countries.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  = retrievedCountries.TotalCount,
                    pageSize    = retrievedCountries.PageSize,
                    currentPage = retrievedCountries.CurrentPage,
                    totalPages  = retrievedCountries.TotalPages
                };

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

                var links = CreateCountriesLinks(resourceParameters,
                                                 retrievedCountries.HasNext, retrievedCountries.HasPrevious);

                var linkedCountries = shapedCountries.Select(country =>
                {
                    var countryAsDictionary = country as IDictionary <string, object>;
                    var countryLinks        = CreateCountryLinks((Guid)countryAsDictionary["Id"],
                                                                 resourceParameters.Fields);

                    countryAsDictionary.Add("links", countryLinks);

                    return(countryAsDictionary);
                });

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

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

                var nextPageLink = retrievedCountries.HasNext ?
                                   CreateCountriesResourceUri(resourceParameters,
                                                              ResourceUriType.NextPage) : null;

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

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

                return(Ok(shapedCountries));
            }
        }
 public CountryServiceTests()
 {
     _countryService    = new CountryService(_unitOfWork);
     resourceParameters = new CountriesResourceParameters();
 }