예제 #1
0
        public async Task <IActionResult> GetBooksByUser(int libraryId,
                                                         int pageNumber = 1,
                                                         int pageSize   = 10,
                                                         [FromQuery] BookStatuses status = BookStatuses.BeingTyped,
                                                         CancellationToken token         = default(CancellationToken))
        {
            var accountId         = _userHelper.Account.Id;
            var getBookPagesQuery = new GetUserBooksQuery(libraryId, accountId, pageNumber, pageSize)
            {
                StatusFilter = status,
            };
            var result = await _queryProcessor.ExecuteAsync(getBookPagesQuery, token);

            var args = new PageRendererArgs <BookModel, BookFilter>
            {
                Page           = result,
                RouteArguments = new PagedRouteArgs {
                    PageNumber = pageNumber, PageSize = pageSize
                },
                Filters = new BookFilter {
                    Status = status
                }
            };

            return(new OkObjectResult(_bookRenderer.Render(args, libraryId)));
        }
예제 #2
0
        public async Task <IActionResult> GetBooks(int libraryId,
                                                   string query,
                                                   int pageNumber                          = 1,
                                                   int pageSize                            = 10,
                                                   [FromQuery] int?authorId                = null,
                                                   [FromQuery] int?categoryId              = null,
                                                   [FromQuery] int?seriesId                = null,
                                                   [FromQuery] bool?favorite               = null,
                                                   [FromQuery] bool?read                   = null,
                                                   [FromQuery] BookStatuses status         = BookStatuses.Published,
                                                   [FromQuery] BookSortByType sortBy       = BookSortByType.Title,
                                                   [FromQuery] SortDirection sortDirection = SortDirection.Ascending,
                                                   CancellationToken token                 = default(CancellationToken))
        {
            var filter = new BookFilter
            {
                AuthorId   = authorId,
                CategoryId = categoryId,
                SeriesId   = seriesId,
                Favorite   = favorite,
                Read       = read,
                Status     = status
            };
            var request = new GetBooksQuery(libraryId, pageNumber, pageSize, _userHelper.Account?.Id)
            {
                Query         = query,
                Filter        = filter,
                SortBy        = sortBy,
                SortDirection = sortDirection
            };

            var books = await _queryProcessor.ExecuteAsync(request, cancellationToken : token);

            var args = new PageRendererArgs <BookModel, BookFilter>
            {
                Page           = books,
                RouteArguments = new PagedRouteArgs
                {
                    PageNumber    = pageNumber,
                    PageSize      = pageSize,
                    Query         = query,
                    SortBy        = sortBy,
                    SortDirection = sortDirection
                },
                Filters = filter,
            };

            return(new OkObjectResult(_bookRenderer.Render(args, libraryId)));
        }
예제 #3
0
        public async Task <Page <BookModel> > GetBooksByUser(int libraryId, int accountId, int pageNumber, int pageSize, BookStatuses status, BookSortByType sortBy, SortDirection direction, CancellationToken cancellationToken)
        {
            using (var connection = _connectionProvider.GetConnection())
            {
                var sortByQuery      = $"b.{GetSortByQuery(sortBy)}";
                var sortDirection    = direction == SortDirection.Descending ? "DESC" : "ASC";
                var assignmentfilter = string.Empty;
                if (status == BookStatuses.BeingTyped)
                {
                    assignmentfilter = "AND bp.WriterAccountId = @AccountId";
                }
                else if (status == BookStatuses.ProofRead)
                {
                    assignmentfilter = "AND bp.ReviewerAccountId = @AccountId";
                }
                var param = new
                {
                    LibraryId    = libraryId,
                    PageSize     = pageSize,
                    PageNumber   = pageNumber,
                    AccountId    = accountId,
                    StatusFilter = status
                };

                var sql = @"Select b.Id
                            From Book b
                            INNER Join BookPage bp on bp.BookId = b.Id
                            Where b.LibraryId = @LibraryId
                            AND b.Status = @StatusFilter " +
                          assignmentfilter +
                          $" ORDER BY {sortByQuery} {sortDirection} " +
                          @"OFFSET @PageSize * (@PageNumber - 1) ROWS
                            FETCH NEXT @PageSize ROWS ONLY";

                var command = new CommandDefinition(sql, param, cancellationToken: cancellationToken);

                var bookIds = await connection.QueryAsync(command);

                var sqlCount = @"Select COUNT(b.Id)
                            From Book b
                            INNER Join BookPage bp on bp.BookId = b.Id
                            Where b.LibraryId = @LibraryId
                            AND b.Status = @StatusFilter " +
                               assignmentfilter;

                var bookCount = await connection.QuerySingleAsync <int>(new CommandDefinition(sqlCount, param, cancellationToken : cancellationToken));

                var books = await GetBooks(connection, libraryId, bookIds.Select(b => (int)b.Id).ToList(), cancellationToken);

                return(new Page <BookModel>
                {
                    PageNumber = pageNumber,
                    PageSize = pageSize,
                    TotalCount = bookCount,
                    Data = books
                });
            }
        }