public async Task GetRequestInfoByCodeNoData_Test()
        {
            var user = new Users
            {
                Id         = 1,
                UserName   = "******",
                FirstName  = "A",
                MiddleName = "B",
                LastName   = "C"
            };

            _dbContext.Set <Users>().Add(user);

            var userBookRequests = new UserBookRequests
            {
                Id          = 1,
                UserId      = 1,
                RequestCode = "ABCD",
                RequestDate = DateTime.Now,
                User        = user
            };

            _dbContext.Set <UserBookRequests>().Add(userBookRequests);
            await _dbContext.SaveChangesAsync();

            var efRepository = new EfRepository <UserBookRequests>(_dbContext);
            var getRequestInfoByCodeQuery = new GetRequestInfoByCodeQuery(efRepository);
            var result = await getRequestInfoByCodeQuery.ExecuteAsync("ABCDE");

            Assert.Null(result);
        }
        public async Task <CommandResult> ExecuteAsync()
        {
            var userId = int.Parse(_httpContext?.User?.UserId());

            var slotAvaiable = 10 - (await _userBookRepository.TableNoTracking
                                     .Where(x => x.UserId == userId && (x.Status == (int)BookStatus.Borrowing || x.Status == (int)BookStatus.Pending))
                                     .CountAsync());

            if (slotAvaiable <= 0)
            {
                return(CommandResult.Failed(new CommandResultError()
                {
                    Code = (int)HttpStatusCode.LengthRequired,
                    Description = "Out of slot"
                }));
            }

            var bookCart = await _bookCartRepository.TableNoTracking.Where(x => x.UserId == userId && x.Status == (int)BookStatus.InOrder).ToListAsync();

            var listBookBorrow = await _bookRepository.TableNoTracking.Where(x => bookCart.Select(y => y.BookId).Contains(x.Id)).ToListAsync();

            if (listBookBorrow.Count() > slotAvaiable || listBookBorrow.Any(x => x.AmountAvailable == 0))
            {
                return(CommandResult.Failed(new CommandResultError()
                {
                    Code = (int)HttpStatusCode.LengthRequired,
                    Description = "Out of slot"
                }));
            }

            var listEnity = listBookBorrow.Select(x => new UserBooks
            {
                UserId       = userId,
                BookId       = x.Id,
                Status       = (int)BookStatus.Pending,
                DeadlineDate = DateTime.Now.Date.AddDays(x.MaximumDateBorrow)
            }).ToList();

            UserBookRequests request = new UserBookRequests();

            request.UserId      = userId;
            request.RequestDate = DateTime.Now;
            request.RequestCode = GenerationCode();
            request.UserBooks   = listEnity;

            if (await _bookRequestRepository.InsertAsync(request))
            {
                listBookBorrow.ForEach(book =>
                {
                    book.AmountAvailable = book.AmountAvailable - 1;
                });

                bookCart.ForEach(item =>
                {
                    item.Status = (int)BookStatus.Borrowing;
                });

                await _bookRepository.UpdateAsync(listBookBorrow);

                await _bookCartRepository.UpdateAsync(bookCart);

                return(CommandResult.SuccessWithData(request.RequestCode));
            }

            return(CommandResult.Failed());
        }