private string CreateLink(CompaniesResourceParameters companiesResourceParameters,
                                  ResourceUriLinkType resourceUriLinkType)
        {
            switch (resourceUriLinkType)
            {
            case ResourceUriLinkType.NextPage:
                return(Url.Link("GetCompanies",
                                new CompaniesResourceParameters
                {
                    PageSize = companiesResourceParameters.PageSize,
                    PageNumber = companiesResourceParameters.PageNumber + 1,
                    SearchQuery = companiesResourceParameters.SearchQuery
                }));

            case ResourceUriLinkType.PreviousPage:
                return(Url.Link("GetCompanies", new CompaniesResourceParameters()
                {
                    PageSize = companiesResourceParameters.PageSize,
                    PageNumber = companiesResourceParameters.PageNumber - 1,
                    SearchQuery = companiesResourceParameters.SearchQuery
                }));

            default:
                return(Url.Link("GetCompanies", companiesResourceParameters));
            }
        }
Esempio n. 2
0
        private IEnumerable <LinkDto> CreateLinks(
            CompaniesResourceParameters companiesResourceParameters,
            bool hasNextPage,
            bool hasPreviousPage)
        {
            var links = new List <LinkDto>();

            links.Add(
                new LinkDto(
                    href: CreateResourceUri(companiesResourceParameters, ResourceUriType.Current),
                    rel: "self",
                    method: "GET"));

            if (hasNextPage)
            {
                links.Add(
                    new LinkDto(
                        href: CreateResourceUri(companiesResourceParameters, ResourceUriType.Current),
                        rel: "nextPage",
                        method: "GET"));
            }

            if (hasPreviousPage)
            {
                links.Add(
                    new LinkDto(
                        href: CreateResourceUri(companiesResourceParameters, ResourceUriType.Current),
                        rel: "previousPage",
                        method: "GET"));
            }

            return(links);
        }
Esempio n. 3
0
        //public IEnumerable<Recruiter> GetCompanies(IEnumerable<Guid> companyIds)
        //{
        //    if (companyIds == null)
        //    {
        //        throw new ArgumentNullException(nameof(companyIds));
        //    }

        //    return _context.Recruiters.Where(a => companyIds.Contains(a.Id));
        //}

        public async Task <IPagedList <Company> > GetCompaniesAsync(CompaniesResourceParameters companiesResourceParameters)
        {
            if (companiesResourceParameters == null)
            {
                throw new ArgumentNullException(nameof(companiesResourceParameters));
            }

            var collection = _context.Companies as IQueryable <Company>;

            var name = companiesResourceParameters.Name;

            if (name != null)
            {
                collection = collection.Where(a => a.Name == name);
            }

            var hqCity = companiesResourceParameters.HqCity;

            if (hqCity != null)
            {
                collection = collection.Where(a => a.HqCity == hqCity);
            }

            var hqCountry = companiesResourceParameters.HqCountry;

            if (hqCountry != null)
            {
                collection = collection.Where(a => a.HqCountry == hqCountry);
            }

            var category = companiesResourceParameters.Category;

            if (category != null)
            {
                collection = collection.Where(a => a.Category.ToString() == category);
            }

            if (!string.IsNullOrWhiteSpace(companiesResourceParameters.SearchQuery))
            {
                var searchQuery = companiesResourceParameters.SearchQuery.Trim();
                collection = collection.Where(a => a.Name.ToLower().Contains(searchQuery.ToLower()));
            }

            if (!string.IsNullOrWhiteSpace(companiesResourceParameters.OrderBy))
            {
                // get property mapping dictionary
                var companyMappingDictionary = _propertyMappingService.GetPropertyMapping <CompanyDto, Company>();

                collection = collection.ApplySort(companiesResourceParameters.OrderBy, companyMappingDictionary);
            }

            return(await Utils.PagedList <Company> .Create(collection, companiesResourceParameters.PageNumber, companiesResourceParameters.PageSize));
        }
Esempio n. 4
0
        private string CreateResourceUri(CompaniesResourceParameters companiesResourceParameters, ResourceUriType resourceUriType)
        {
            switch (resourceUriType)
            {
            case ResourceUriType.PreviousPage:
                return(_urlHelper.Link(
                           routeName:
                           "GetCompanies",
                           values:
                           new
                {
                    fields = companiesResourceParameters.Fields,
                    orderBy = companiesResourceParameters.OrderBy,
                    searchQuery = companiesResourceParameters.SearchQuery,
                    location = companiesResourceParameters.Location,
                    pageNumber = companiesResourceParameters.PageNumber - 1,
                    pageSize = companiesResourceParameters.PageSize
                }));

            case ResourceUriType.NextPage:
                return(_urlHelper.Link(
                           routeName:
                           "GetCompanies",
                           values:
                           new
                {
                    fields = companiesResourceParameters.Fields,
                    orderBy = companiesResourceParameters.OrderBy,
                    searchQuery = companiesResourceParameters.SearchQuery,
                    location = companiesResourceParameters.Location,
                    pageNumber = companiesResourceParameters.PageNumber + 1,
                    pageSize = companiesResourceParameters.PageSize
                }));

            case ResourceUriType.Current:
            default:
                return(_urlHelper.Link(
                           routeName:
                           "GetCompanies",
                           values:
                           new
                {
                    fields = companiesResourceParameters.Fields,
                    orderBy = companiesResourceParameters.OrderBy,
                    searchQuery = companiesResourceParameters.SearchQuery,
                    location = companiesResourceParameters.Location,
                    pageNumber = companiesResourceParameters.PageNumber,
                    pageSize = companiesResourceParameters.PageSize
                }));
            }
        }
        public ActionResult <IEnumerable <CompanyDto> > GetCompanies
            ([FromQuery] CompaniesResourceParameters companiesResourceParameters)
        {
            var companiesFromRepo = jobRepository.GetCompanies(companiesResourceParameters);

            var previousLink = companiesFromRepo.HasPrevious
                ? CreateLink(companiesResourceParameters, ResourceUriLinkType.PreviousPage) : null;
            var nextLink = companiesFromRepo.HasNext ? CreateLink(companiesResourceParameters,
                                                                  ResourceUriLinkType.NextPage) : null;

            var metadataObj = new
            {
                pageSize = companiesFromRepo.PageSize,
                pageNo   = companiesFromRepo.CurrentPage,
                previousLink,
                nextLink,
                totalCount = companiesFromRepo.Count,
                totalPages = companiesFromRepo.TotalPages
            };

            Response.Headers.Add("x-pagination", JsonSerializer.Serialize(metadataObj));
            return(Ok(mapper.Map <IEnumerable <CompanyDto> >(companiesFromRepo)));
        }
        public PagedList <Company> GetCompanies(CompaniesResourceParameters companiesResourceParameters)
        {
            var mappingDictionary = _propertyMappingService.GetPropertyMapping <CompanyDto, Company>();

            // Apply sort to collection using a custom ApplySort extension on IQueryable.
            var collection = _repositoryContext.Companies.ApplySort(
                companiesResourceParameters.OrderBy,
                mappingDictionary);

            // Filtering
            if (!string.IsNullOrEmpty(companiesResourceParameters.Name))
            {
                string nameFilter = companiesResourceParameters.Name.Trim().ToLowerInvariant();
                collection = collection.Where(company => company.Name.ToLowerInvariant() == nameFilter);
            }

            // Filtering on location (v3)
            if (!string.IsNullOrEmpty(companiesResourceParameters.Location))
            {
                string locationFilter = companiesResourceParameters.Location.Trim().ToLowerInvariant();
                collection = collection.Where(company => company.Location.ToLowerInvariant() == locationFilter);
            }

            // Searching (simple hard-coded implementation). Could use Lucene?
            if (!string.IsNullOrEmpty(companiesResourceParameters.SearchQuery))
            {
                string searchQuery = companiesResourceParameters.SearchQuery.Trim().ToLowerInvariant();
                collection = collection.Where(a => a.Name.ToLowerInvariant().Contains(searchQuery));
            }

            // Paging
            return(PagedList <Company> .Create(
                       source : collection,
                       pageNumber : companiesResourceParameters.PageNumber,
                       pageSize : companiesResourceParameters.PageSize));
        }
        public PagedList <Company> GetCompanies(CompaniesResourceParameters companiesResourceParameters)
        {
            if (companiesResourceParameters == null)
            {
                throw new ArgumentNullException(nameof(CompaniesResourceParameters));
            }


            var collection = context.Companies as IQueryable <Company>;

            if (!string.IsNullOrEmpty(companiesResourceParameters.SearchQuery))
            {
                var searchQuery = companiesResourceParameters.SearchQuery.Trim();
                collection = collection.Where(i => i.Name.Contains(searchQuery) ||
                                              i.Activity.Contains(searchQuery));
            }

            //if (!string.IsNullOrEmpty(companiesResourceParameters.OrderBy))
            //{
            //    collection.Sort<Company>(companiesResourceParameters.)
            //}

            return(PagedList <Company> .Create(collection, companiesResourceParameters.PageSize, companiesResourceParameters.PageNumber));
        }
Esempio n. 8
0
        public async Task <IActionResult> GetCompanies([FromQuery] CompaniesResourceParameters companiesResourceParameters, [FromHeader(Name = "Accept")] string mediaType)
        {
            if (!MediaTypeHeaderValue.TryParse(mediaType, out MediaTypeHeaderValue parsedMediaType))
            {
                _logger.LogInformation($"Media type header value [{mediaType}] not parsable");
                return(BadRequest());
            }

            if (!_propertyCheckerService.TypeHasProperties <CompanyDto>(companiesResourceParameters.Fields))
            {
                _logger.LogInformation($"Property checker did not find on of the Company resource parameters fields");
                return(BadRequest());
            }

            if (!_propertyMappingService.ValidMappingExistsFor <CompanyDto, Company>
                    (companiesResourceParameters.OrderBy))
            {
                return(BadRequest());
            }

            var companiesFromRepo = await _repository.GetCompaniesAsync(companiesResourceParameters);

            return(Ok(companiesFromRepo));
        }
Esempio n. 9
0
        [HttpHead]         // Provide response headers without payload to allow consumer test calls
        public IActionResult GetCompanies(
            CompaniesResourceParameters companiesResourceParameters,
            [FromHeader(Name = "Accept")] string mediaType)             // Support custom media-type to support HATEOAS
        {
            if (!_propertyMappingService.ValidMappingExistsFor <CompanyDto, Company>(companiesResourceParameters.OrderBy))
            {
                return(BadRequest());
            }

            if (!_typeHelperService.TypeHasProperties <CompanyDto>(companiesResourceParameters.Fields))
            {
                return(BadRequest());
            }

            PagedList <Company> companies = _repository.GetCompanies(companiesResourceParameters);

            var companyDtos = AutoMapper.Mapper.Map <IEnumerable <CompanyDto> >(companies);

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

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

                IEnumerable <LinkDto> linkDtos = CreateLinks(
                    companiesResourceParameters: companiesResourceParameters,
                    hasNextPage: companies.HasNextPage,
                    hasPreviousPage: companies.HasPreviousPage);

                IEnumerable <ExpandoObject> dataShapedCompanyDtos = companyDtos.ShapeData(companiesResourceParameters.Fields);

                var dataShapedCompanyDtosWithLinks = dataShapedCompanyDtos.Select(
                    companyDto =>
                {
                    var companyDtoAsDictionary = companyDto as IDictionary <string, object>;

                    var companyLinks = CreateLinks(
                        id: (Guid)companyDtoAsDictionary["Id"],
                        fields: companiesResourceParameters.Fields);

                    companyDtoAsDictionary.Add("links", companyLinks);

                    return(companyDtoAsDictionary);
                });

                var linkedCollectionResource = new
                {
                    value = dataShapedCompanyDtosWithLinks,
                    links = linkDtos
                };

                return(Ok(linkedCollectionResource));
            }
            else
            {
                var previousPageLink = companies.HasPreviousPage
                                        ? CreateResourceUri(companiesResourceParameters, ResourceUriType.PreviousPage)
                                        : null;

                var nextPageLink = companies.HasNextPage
                                        ? CreateResourceUri(companiesResourceParameters, ResourceUriType.NextPage)
                                        : null;

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

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

                return(Ok(companyDtos.ShapeData(companiesResourceParameters.Fields)));
            }
        }