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); }
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)); }
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)); }
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); } }); }