public IActionResult GetAuthors([FromQuery] AuthorsResourceParameters authorsResourceParameters)
        {
            if (!_propertyMappingSerivce.ValidMappingExistsFor <AuthorDto, Author>(authorsResourceParameters.OrderBy))
            {
                return(BadRequest());
            }

            if (!_typeHelperService.TypeHasProperty <AuthorDto>(authorsResourceParameters.Fields))
            {
                return(BadRequest());
            }

            var authors = _libraryRepository.GetAuthors(authorsResourceParameters);

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

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

            var authorDtos = authors
                             .Select(a => new AuthorDto(a))
                             .ToList();

            var shaped = EnumerableExtensions.ShapeData(authorDtos, authorsResourceParameters.Fields)
                         .Select(a =>
            {
                var dict        = (IDictionary <string, object>)a;
                var authorLinks = CreateLinksForAuthor((Guid)dict["Id"], authorsResourceParameters.Fields);

                dict.Add("Links", authorLinks);
                return(dict);
            });

            var links = CreateLinksForAuthors(authorsResourceParameters, authors.HasNext, authors.HasPrevious);

            return(Ok(new
            {
                values = shaped,
                links = links
            }));
        }