Esempio n. 1
0
        public async Task <IActionResult> GetCompanies([FromQuery] CompanyDtoParameters parameters, [FromHeader(Name = "Accept")] string mediaType)  //ActionResult<IEnumerable<DtoCompany>
        {
            if (!MediaTypeHeaderValue.TryParse(mediaType, out MediaTypeHeaderValue parsedMediaType))
            {
                return(BadRequest());
            }

            if (!_propertyMappingService.ValidMappingExistsFor <CompanyDto, Company>(parameters.OrderBy))
            {
                return(BadRequest());
            }
            if (!_propertyCheckerService.TypeHasProperites <CompanyDto>(parameters.Fields))
            {
                return(BadRequest());
            }

            var companies = await _companyRepositroy.GetCompaniesAsync(parameters);


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

            var shapeData = companyDtos.ShapeData(parameters.Fields);


            if (parsedMediaType.MediaType == "application/vnd.company.hateoas+json")
            {
                var paginationMetadata_hateoas = new
                {
                    totalCount  = companies.TotalCount,
                    pageSize    = companies.PageSize,
                    currentPage = companies.CurrentPage,
                    totalPage   = companies.TotalPages,
                    //privousPageLink = companies.HasPrevious ? CreateCompaniesResourceUri(parameters, ResourceUriType.PreviousPage) : null,
                    //nextPageLink = companies.HasNext ? CreateCompaniesResourceUri(parameters, ResourceUriType.NextPage) : null
                };

                Response.Headers.Add("X-Pagination",
                                     JsonSerializer.Serialize(paginationMetadata_hateoas, new JsonSerializerOptions {
                    Encoder = JavaScriptEncoder.UnsafeRelaxedJsonEscaping
                })
                                     );

                var links = CreateLinksForCompany(parameters, companies.HasPrevious, companies.HasNext);

                var shapedCompaniesWithLinks = shapeData.Select(c =>
                {
                    var companyDict  = c as IDictionary <string, object>;
                    var companyLinks = CreateLinksForCompany((Guid)companyDict["Id"], null);
                    companyDict.Add("links", companyLinks);
                    return(companyDict);
                });

                var linkedCollectionResource = new
                {
                    value = shapedCompaniesWithLinks,
                    links = links
                };
                return(Ok(linkedCollectionResource));
            }

            var paginationMetadata = new
            {
                totalCount      = companies.TotalCount,
                pageSize        = companies.PageSize,
                currentPage     = companies.CurrentPage,
                totalPage       = companies.TotalPages,
                privousPageLink = companies.HasPrevious ? CreateCompaniesResourceUri(parameters, ResourceUriType.PreviousPage) : null,
                nextPageLink    = companies.HasNext ? CreateCompaniesResourceUri(parameters, ResourceUriType.NextPage) : null
            };

            Response.Headers.Add("X-Pagination",
                                 JsonSerializer.Serialize(paginationMetadata, new JsonSerializerOptions {
                Encoder = JavaScriptEncoder.UnsafeRelaxedJsonEscaping
            })
                                 );

            return(Ok(shapeData));
        }