示例#1
0
        private async Task DecreaseStock(long productId, int count, long stockActionId, DateTime stockActionDate, CancellationToken cancellationToken)
        {
            StockSnapshotModel stockSnapshotModel = await _dataContext.StockSnapshotModels
                                                    .FirstOrDefaultAsync(s => s.ProductId == productId, cancellationToken);

            if (stockSnapshotModel == null)
            {
                throw new StockSnapshotNotFoundException(productId);
            }

            if (stockSnapshotModel.AvailableStock < count)
            {
                throw new InsufficientStockException(productId, stockSnapshotModel.AvailableStock, count);
            }

            stockSnapshotModel.DecreaseStock(count, stockActionId, stockActionDate);
            await _dataContext.SaveChangesAsync(cancellationToken);

            var stockCountDecreasedIntegrationEvent = new StockCountDecreasedIntegrationEvent(stockSnapshotModel.ProductId, stockSnapshotModel.StockActionId, count, stockSnapshotModel.AvailableStock, stockSnapshotModel.LastStockActionDate);

            _integrationEventPublisher.AddEvent(stockCountDecreasedIntegrationEvent);
        }
        public async Task Consume(ConsumeContext <StockCountDecreasedIntegrationEvent> context)
        {
            StockCountDecreasedIntegrationEvent stockCountDecreasedIntegrationEvent = context.Message;

            await SyncAvailableStock(stockCountDecreasedIntegrationEvent.ProductId, stockCountDecreasedIntegrationEvent.StockActionId, stockCountDecreasedIntegrationEvent.AvailableStock);
        }