private async Task <int> CountMatchingProducts(GetProductsForCategoryQuery request, CancellationToken cancellationToken)
 {
     return(await _context.Products
            .Where(product => product.CategoryId == request.CategoryId &&
                   !product.IsDeleted)
            .CountAsync(cancellationToken));
 }
 private async Task <List <Product> > getProducts(GetProductsForCategoryQuery request, int amountToSkip, CancellationToken cancellationToken)
 {
     return(await _context.Products
            .Where(product => product.CategoryId == request.CategoryId &&
                   !product.IsDeleted)
            .OrderByString(request.OrderBy)
            .Include(product => product.Manufacturer)
            .Skip(amountToSkip)
            .Take(request.PageSize)
            .ToListAsync(cancellationToken));
 }
        public async Task <ActionResult <PagedList <ProductSimplifiedDto> > > GetProductsForCategory(Guid id,
                                                                                                     int?pageNumber, int?pageSize, string?orderBy)
        {
            var query = new GetProductsForCategoryQuery(pageNumber, pageSize)
            {
                CategoryId = id,
                OrderBy    = orderBy
            };
            var result = await _mediator.Send(query);

            return(Ok(result));
        }
        public async Task <PagedList <ProductSimplifiedDto> > Handle(GetProductsForCategoryQuery request, CancellationToken cancellationToken)
        {
            var amountToSkip          = (request.PageNumber - 1) * request.PageSize;
            int totalMatchingProducts = await CountMatchingProducts(request, cancellationToken);

            var pageNumber = request.PageNumber;
            var totalPages = (int)(Math.Ceiling(totalMatchingProducts / (double)request.PageSize));

            if (amountToSkip >= totalMatchingProducts)
            {
                amountToSkip = (totalMatchingProducts - request.PageSize) > 0 ? (totalMatchingProducts - request.PageSize) : 0;
                pageNumber   = totalPages;
            }
            List <Product> returnedProducts = await getProducts(request, amountToSkip, cancellationToken);

            var mappedProducts = _mapper.Map <IEnumerable <ProductSimplifiedDto> >(returnedProducts);

            var pagedResult = new PagedList <ProductSimplifiedDto>(mappedProducts, pageNumber, request.PageSize, totalMatchingProducts);

            return(pagedResult);
        }