Пример #1
0
        public ActionResult <IEnumerable <BookWithoutQuotesDto> > GetBooks(
            [FromQuery] BooksResourceParameters booksResourceParameters)
        {
            var books = _bookInfoRepository.GetBooks(booksResourceParameters);

            return(Ok(_mapper.Map <IEnumerable <BookWithoutQuotesDto> >(books)));
        }
 private string CreateBooksResourceUri(BooksResourceParameters booksResourceParameters,
                                       ResourceUriType resourceUriType)
 {
     return(resourceUriType switch
     {
         ResourceUriType.PreviousPage => Url.Link(nameof(GetBooksForAuthor),
                                                  new
         {
             fields = booksResourceParameters.Fields,
             pageNumber = booksResourceParameters.PageNumber - 1,
             pageSize = booksResourceParameters.PageSize,
             searchTitle = booksResourceParameters.SearchTitle
         }),
         ResourceUriType.NextPage => Url.Link(nameof(GetBooksForAuthor),
                                              new
         {
             fields = booksResourceParameters.Fields,
             pageNumber = booksResourceParameters.PageNumber + 1,
             pageSize = booksResourceParameters.PageSize,
             searchTitle = booksResourceParameters.SearchTitle
         }),
         ResourceUriType.Current => Url.Link(nameof(GetBooksForAuthor),
                                             new
         {
             fields = booksResourceParameters.Fields,
             pageNumber = booksResourceParameters.PageNumber,
             pageSize = booksResourceParameters.PageSize,
             searchTitle = booksResourceParameters.SearchTitle
         }),
         _ => throw new NotImplementedException(),
     });
Пример #3
0
        public IActionResult GetBooks(BooksResourceParameters booksResourcesParameters)
        {
            try
            {
                var books = _repository.GetBooks(booksResourcesParameters);

                var previousPageLink = books.HasPrevious
                    ? CreateBooksResourceUri(booksResourcesParameters, ResourceUriType.PreviousPage)
                    : null;

                var nextPageLink = books.HasNext
                    ? CreateBooksResourceUri(booksResourcesParameters, ResourceUriType.NextPage)
                    : null;

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

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

                return(Ok(Mapper.Map <IEnumerable <BookViewModel> >(books)));
            }
            catch (Exception ex)
            {
                _logger.LogError("Failed to load books : {0}", ex);
            }
            return(BadRequest("Failed to load books"));
        }
        public IEnumerable <Book> GetBooks(BooksResourceParameters booksResourceParameters)
        {
            if (string.IsNullOrWhiteSpace(booksResourceParameters.Genre) &&
                string.IsNullOrWhiteSpace(booksResourceParameters.SearchQuery))
            {
                return(GetBooks());
            }

            var booksToQuery = _context.Books as IQueryable <Book>;

            if (!string.IsNullOrWhiteSpace(booksResourceParameters.Genre))
            {
                var genre = booksResourceParameters.Genre.Trim();
                booksToQuery = booksToQuery.Where(b => b.Genre == genre);
            }

            if (!string.IsNullOrWhiteSpace(booksResourceParameters.SearchQuery))
            {
                var searchQuery = booksResourceParameters.SearchQuery.Trim();
                booksToQuery = booksToQuery.Where(b =>
                                                  b.Author.Contains(searchQuery) ||
                                                  b.Description.Contains(searchQuery) ||
                                                  b.Genre.Contains(searchQuery) ||
                                                  b.Title.Contains(searchQuery)
                                                  );
            }

            return(booksToQuery.ToList());
        }
Пример #5
0
        public async Task <IActionResult> GetBooks(Guid authorId,
                                                   [FromQuery] BooksResourceParameters booksResourceParameters)
        {
            var books = await _bookRepository.GetBooksForAuthorAsync(authorId,
                                                                     booksResourceParameters);

            return(Ok(books));
        }
Пример #6
0
        public IActionResult GetBooks([FromQuery] BooksResourceParameters parameters)
        {
            var books    = _bookService.GetBooks(parameters);
            var bookDtos = MapBookToBookDto(books);

            AddCoversToBookDtos(books, bookDtos);

            return(Ok(new PagedList <BookDto>(bookDtos.AsQueryable(), parameters.PageNumber, parameters.PageSize)));
        }
Пример #7
0
 public IQueryable <Book> GetBooks(BooksResourceParameters parameters)
 {
     return(_context.Books
            .Include(b => b.Cover)
            .Include(b => b.BookTags)
            .ThenInclude(bt => bt.Tag)
            .FilterBooks(parameters)
            .FilterBooksByTags(parameters.Tags)
            .ApplySort(parameters.OrderBy, _propertyMappingService.GetPropertyMapping <BookDto, Book>()));
 }
        public async Task <IActionResult> GetBooksForAuthor(long authorId,
                                                            [FromQuery] BooksResourceParameters booksResourceParameters)
        {
            if (!_propertyCheckerService.TypeHasProperties <BookDto>(booksResourceParameters.Fields))
            {
                return(BadRequest($"No field with the name {booksResourceParameters.Fields} was found."));
            }

            var author = await _messages.Dispatch(new GetAuthorQuery(authorId));

            if (author is null)
            {
                return(NotFound($"No author with id {authorId} was found."));
            }

            var books = await _messages.Dispatch(new GetBooksListQuery(authorId,
                                                                       booksResourceParameters.SearchTitle, booksResourceParameters.PageNumber,
                                                                       booksResourceParameters.PageSize));

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

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

            var links = CreateLinksForBooks(booksResourceParameters, books.HasNext, books.HasPrevious);

            var shapedBooks = _mapper.Map <IEnumerable <BookDto> >(books)
                              .ShapeData(booksResourceParameters.Fields);

            var shapedBooksWithLinks = shapedBooks.Select(book =>
            {
                var bookAsDictionary = book as IDictionary <string, object>;
                var bookLinks        = CreateLinksForBook((long)bookAsDictionary["AuthorId"], (long)bookAsDictionary["Id"], null);
                bookAsDictionary.Add("links", bookLinks);
                return(bookAsDictionary);
            });

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

            return(Ok(linkedCollectionResource));
        }
Пример #9
0
        public static IQueryable <Book> FilterBooks(this IQueryable <Book> source, BooksResourceParameters parameters)
        {
            source = source.Where(b => b.IsDeleted == parameters.Deleted);

            if (parameters.SentKindle.HasValue)
            {
                source = source.Where(b => b.IsSentToKindle == parameters.SentKindle.Value);
            }
            if (parameters.IsPublic.HasValue)
            {
                source = source.Where(b => b.IsPublic == parameters.IsPublic.Value);
            }

            return(source);
        }
Пример #10
0
        public PagedList <Book> GetBooks(BooksResourceParameters booksResourceParameters)
        {
            var collectionBeforePaging = _context.Books
                                         .OrderBy(b => b.Title)
                                         .AsQueryable();

            if (!string.IsNullOrEmpty(booksResourceParameters.BookType))
            {
                var bookTypeForWhereClause = booksResourceParameters.BookType
                                             .Trim().ToLowerInvariant();
                collectionBeforePaging = collectionBeforePaging
                                         .Where(b => b.BookTypeTypeName.ToLowerInvariant() == bookTypeForWhereClause);
            }
            if (!string.IsNullOrEmpty(booksResourceParameters.Title))
            {
                var bookTitleForWhereClause = booksResourceParameters.Title
                                              .Trim().ToLowerInvariant();
                collectionBeforePaging = collectionBeforePaging
                                         .Where(b => b.Title.Replace(" ", "").ToLowerInvariant() == bookTitleForWhereClause);
            }

            if (!string.IsNullOrEmpty(booksResourceParameters.Publisher))
            {
                var bookPublisherForWhereClause = booksResourceParameters.Publisher
                                                  .Trim().ToLowerInvariant();
                collectionBeforePaging = collectionBeforePaging
                                         .Where(b => b.PublisherPublisherName.Replace(" ", "").ToLowerInvariant() ==
                                                bookPublisherForWhereClause);
            }

            if (!string.IsNullOrEmpty(booksResourceParameters.SearchQuery))
            {
                var searchQueryForWhereClause = booksResourceParameters.SearchQuery
                                                .Trim().ToLowerInvariant();

                collectionBeforePaging = collectionBeforePaging
                                         .Where(b => b.Title.ToLowerInvariant().Contains(searchQueryForWhereClause) ||
                                                b.BookTypeTypeName.ToLowerInvariant().Contains(searchQueryForWhereClause) ||
                                                b.PublisherPublisherName.ToLowerInvariant().Contains(searchQueryForWhereClause))
                                         .OrderBy(b => b.Title)
                                         .ThenBy(b => b.BookTypeTypeName)
                                         .ThenBy(b => b.PublisherPublisherName);
            }

            return(PagedList <Book> .Create(collectionBeforePaging,
                                            booksResourceParameters.PageNumber,
                                            booksResourceParameters.PageSize));
        }
Пример #11
0
        private string CreateBooksResourceUri(
            BooksResourceParameters booksResourceParameters,
            ResourceUriType type)
        {
            switch (type)
            {
            case ResourceUriType.PreviousPage:
                return(_urlHelper.Link("GetBooks",
                                       new
                {
                    searchQuery = booksResourceParameters.SearchQuery,
                    publisher = booksResourceParameters.Publisher,
                    title = booksResourceParameters.Title,
                    bookType = booksResourceParameters.BookType,
                    pageNumber = booksResourceParameters.PageNumber - 1,
                    pageSize = booksResourceParameters.PageSize
                }));

            case ResourceUriType.NextPage:
                return(_urlHelper.Link("GetBooks",
                                       new
                {
                    searchQuery = booksResourceParameters.SearchQuery,
                    publisher = booksResourceParameters.Publisher,
                    title = booksResourceParameters.Title,
                    bookType = booksResourceParameters.BookType,
                    pageNumber = booksResourceParameters.PageNumber + 1,
                    pageSize = booksResourceParameters.PageSize
                }));

            default:
                return(_urlHelper.Link("GetBooks",
                                       new
                {
                    searchQuery = booksResourceParameters.SearchQuery,
                    publisher = booksResourceParameters.Publisher,
                    title = booksResourceParameters.Title,
                    bookType = booksResourceParameters.BookType,
                    pageNumber = booksResourceParameters.PageNumber,
                    pageSize = booksResourceParameters.PageSize
                }));
            }
        }
Пример #12
0
        private string CreateBooksResourceUri(
            BooksResourceParameters booksResourceParameters,
            ResourceUriType type)
        {
            switch (type)
            {
            case ResourceUriType.PreviousPage:
                return(Url.Link("GetBooks",
                                new
                {
                    fields = booksResourceParameters.Fields,
                    orderBy = booksResourceParameters.OrderBy,
                    pageNumber = booksResourceParameters.PageNumber - 1,
                    pageSize = booksResourceParameters.PageSize,
                    title = booksResourceParameters.Title,
                    searchQuery = booksResourceParameters.SearchQuery
                }));

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

            default:
                return(Url.Link("GetBooks",
                                new
                {
                    fields = booksResourceParameters.Fields,
                    orderBy = booksResourceParameters.OrderBy,
                    pageNumber = booksResourceParameters.PageNumber,
                    pageSize = booksResourceParameters.PageSize,
                    title = booksResourceParameters.Title,
                    searchQuery = booksResourceParameters.SearchQuery
                }));
            }
        }
        public async Task <PagedList <Book> > GetBooksForAuthorAsync(Guid authorId, BooksResourceParameters booksResourceParameters)
        {
            if (booksResourceParameters == null)
            {
                throw new ArgumentNullException(nameof(booksResourceParameters));
            }

            if (authorId == null)
            {
                throw new ArgumentNullException(nameof(authorId));
            }

            var collection = _context.Books as IQueryable <Book>;

            // get property mapping dictionary
            var bookPropertyMappingDictionary =
                _propertyMappingService.GetPropertyMapping <BookDto, Book>();

            // Apply Searching ..
            if (!string.IsNullOrWhiteSpace(booksResourceParameters.SearchQuery))
            {
                var searchQuery = booksResourceParameters.SearchQuery.Trim();
                collection = collection.Include(b => b.Author)
                             .Include(b => b.Publisher)
                             .Include(b => b.BookCategories)
                             .Where(b => b.Description.Contains(searchQuery) ||
                                    b.ISBN.Contains(searchQuery) ||
                                    b.Publisher.Name.Contains(searchQuery) ||
                                    b.Author.FirstName.Contains(searchQuery) ||
                                    b.Author.LastName.Contains(searchQuery) ||
                                    b.Title.Contains(searchQuery) ||
                                    b.BookCategories.Select(bc => bc.Category.Name).Contains(searchQuery));
            }

            var finalCollectopn = collection.Include(c => c.Author)
                                  .Include(c => c.Publisher)
                                  .Include(c => c.BookCategories);

            return(await PagedList <Book> .Create(finalCollectopn,
                                                  booksResourceParameters.PageNumber,
                                                  booksResourceParameters.PageSize));
        }
Пример #14
0
        public IActionResult GetBooks(
            [FromQuery] BooksResourceParameters booksResourceParameters)
        {
            if (!_propertyMappingService.ValidMappingExistsFor <BookDto, Book>
                    (booksResourceParameters.OrderBy))
            {
                return(BadRequest());
            }

            if (!_propertyCheckerService.TypeHasProperties <BookDto>
                    (booksResourceParameters.Fields))
            {
                return(BadRequest());
            }

            var booksFromRepo = _repositoryWrapper.Books.GetBooks(booksResourceParameters);

            var previousPageLink = booksFromRepo.HasPrevious ?
                                   CreateBooksResourceUri(booksResourceParameters,
                                                          ResourceUriType.PreviousPage) : null;

            var nextPageLink = booksFromRepo.HasNext ?
                               CreateBooksResourceUri(booksResourceParameters,
                                                      ResourceUriType.NextPage) : null;

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

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

            return(Ok(_mapper.Map <IEnumerable <BookDto> >(booksFromRepo)
                      .ShapeData(booksResourceParameters.Fields)));
        }
Пример #15
0
        public PagedList <Book> GetBooks(BooksResourceParameters booksResourceParameters)
        {
            if (booksResourceParameters == null)
            {
                throw new ArgumentNullException(nameof(booksResourceParameters));
            }

            var collectionOfBooks = ApplicationDbContext.Books
                                    .Include(a => a.BookAuthors)
                                    .ThenInclude(ba => ba.Author) as IQueryable <Book>;

            if (!string.IsNullOrWhiteSpace(booksResourceParameters.Title))
            {
                var title = booksResourceParameters.Title.Trim();
                collectionOfBooks = collectionOfBooks.Where(book => book.Title == title);
            }

            if (!string.IsNullOrWhiteSpace(booksResourceParameters.SearchQuery))
            {
                var searchQuery = booksResourceParameters.SearchQuery.Trim();
                collectionOfBooks = collectionOfBooks.Where(book => book.Title.Contains(searchQuery) ||
                                                            book.Description.Contains(searchQuery) ||
                                                            book.Publisher.Contains(searchQuery)
                                                            );
            }

            if (!string.IsNullOrWhiteSpace(booksResourceParameters.OrderBy))
            {
                var bookPropertyMappingDictionary =
                    _propertyMappingService.GetPropertyMapping <BookDto, Book>();

                collectionOfBooks = collectionOfBooks.ApplySort(booksResourceParameters.OrderBy,
                                                                bookPropertyMappingDictionary);
            }

            return(PagedList <Book> .Create(collectionOfBooks,
                                            booksResourceParameters.PageNumber,
                                            booksResourceParameters.PageSize));
        }