public async Task <PaginatedCollection <StockResponse> > Handle(QueryStockCommand request, CancellationToken cancellationToken)
        {
            IExpressionSpecification <Stock> specification = ExpressionSpecification <Stock> .Default;

            if (!string.IsNullOrEmpty(request.ProductId))
            {
                specification = specification.And(new ProductIdIs(request.ProductId));
            }

            if (request.InStock.HasValue)
            {
                if (request.InStock.Value)
                {
                    specification = specification.And(new StockCountGreaterThan(0));
                }
                else
                {
                    specification = specification.And(new StockCountLessThan(1));
                }
            }

            IStockRepository            stockRepository     = _stockDbContext.StockRepository;
            PaginatedCollection <Stock> paginatedCollection = await stockRepository.GetAsync(specification, request.Offset, request.Limit, cancellationToken);

            PaginatedCollection <StockResponse> result = new PaginatedCollection <StockResponse>(paginatedCollection.TotalCount,
                                                                                                 paginatedCollection.Data
                                                                                                 .Select(stock => new StockResponse(stock.ProductId,
                                                                                                                                    stock.AvailableStock))
                                                                                                 .ToList());

            return(result);
        }
예제 #2
0
        public async Task <IActionResult> GetStocks([FromQuery] GetStockHttpRequest?getStockHttpRequest)
        {
            QueryStockCommand queryStockCommand = new QueryStockCommand
            {
                ProductId = getStockHttpRequest?.ProductId,
                InStock   = getStockHttpRequest?.InStock,
                Offset    = 0,
                Limit     = 10
            };
            PaginatedCollection <StockResponse> paginatedCollection = await _executionContext.ExecuteAsync(queryStockCommand, CancellationToken.None);

            return(StatusCode((int)HttpStatusCode.OK, paginatedCollection));
        }
예제 #3
0
        public async Task <StockCollectionResponse> Handle(QueryStockCommand request, CancellationToken cancellationToken)
        {
            if (request == null)
            {
                throw new RequestException();
            }

            IQueryable <StockModel> stockModels = _dataContext.StockModels.AsQueryable();

            if (request.StockId.HasValue)
            {
                stockModels = stockModels.Where(s => s.Id == request.StockId);
            }

            if (request.ProductId.HasValue)
            {
                stockModels = stockModels.Where(s => s.ProductId == request.ProductId);
            }

            if (request.PartialProductCode != null)
            {
                stockModels = stockModels.Where(s => s.ProductCode.Contains(request.PartialProductCode));
            }

            if (request.StockUpdatedLaterThan.HasValue)
            {
                stockModels = stockModels.Where(s => s.LastStockOperationDate > request.StockUpdatedLaterThan);
            }

            int totalCount = await stockModels.CountAsync(cancellationToken : cancellationToken);

            List <StockModel> stockModelList = await stockModels.Skip(request.Offset)
                                               .Take(request.Take)
                                               .ToListAsync(cancellationToken: cancellationToken);

            if (!stockModelList.Any())
            {
                throw new StockNotFoundException();
            }

            List <StockResponse> stockResponseList = stockModelList.Select(s => s.ToStockResponse())
                                                     .ToList();

            return(new StockCollectionResponse(totalCount, stockResponseList));
        }
예제 #4
0
        public async Task <IActionResult> GetStock([FromQuery] GetStockCollectionHttpRequest getStockCollectionHttpRequest)
        {
            var queryStockCommand = new QueryStockCommand(getStockCollectionHttpRequest?.Offset ?? 0,
                                                          getStockCollectionHttpRequest?.Take ?? 1)
            {
                StockId               = getStockCollectionHttpRequest?.StockId,
                ProductId             = getStockCollectionHttpRequest?.ProductId,
                PartialProductCode    = getStockCollectionHttpRequest?.ProductCode,
                StockUpdatedLaterThan = getStockCollectionHttpRequest?.StockUpdatedLaterThan
            };
            StockCollectionResponse stockCollectionResponse = await _mediator.Send(queryStockCommand);

            var stockCollectionHttpResponse = new StockCollectionHttpResponse
            {
                TotalCount = stockCollectionResponse.TotalCount,
                Data       = stockCollectionResponse.Data
                             .Select(s => s.ToStockHttpResponse())
                             .ToList()
            };

            return(StatusCode((int)HttpStatusCode.OK, stockCollectionHttpResponse));
        }
        private async Task SyncAvailableStock(long productId, long stockActionId, int availableStock)
        {
            await _distributedLockManager.LockAsync(UpdateAvailableStockLockKey(productId),
                                                    async() =>
            {
                var queryStockCommand = new QueryStockCommand(0, 1)
                {
                    ProductId = productId
                };

                StockCollectionResponse stockCollectionResponse = await _mediator.Send(queryStockCommand);
                StockResponse stockResponse = stockCollectionResponse.Data.First();

                var updateAvailableStockCommand = new UpdateAvailableStockCommand(stockResponse.StockId, availableStock, stockActionId, stockResponse.LastStockOperationDate);
                try
                {
                    await _mediator.Send(updateAvailableStockCommand);
                }
                catch (StockTimeLineException e)
                {
                    _logger.LogInformation(e.Message);
                }
            });
        }