public async Task Handle(ReserveRenewed msg, IMessageMetadata metadata = null)
        {
            using (var context = _contextFactory())
            {
                var skuStock = await context.SkuStocks.FindAsync(msg.SourceId);

                if (skuStock == null)
                {
                    throw new SkuStockEntryNotFoundException(msg.SourceId);
                }

                var reserve = await context.StockReserves.FindAsync(msg.SourceId, msg.ReserveId);

                if (reserve == null)
                {
                    throw new ReserveEntryNotFoundException(msg.SourceId);
                }

                var history = CreateHistory(skuStock, StockOperation.ReserveRenewed, reserve.Quantity);

                skuStock.ReservedQuantity  -= reserve.Quantity;
                skuStock.AvailableQuantity += reserve.Quantity;
                skuStock.LastModified       = msg.CreatedTime;
                skuStock.CustomersReservationsTotal--;

                FillNewQuantities(history, skuStock);

                context.StockReserves.Remove(reserve);
                context.StockHistory.Add(history);

                await context.SaveChangesAsync();
            }
        }
示例#2
0
        public async Task Given_no_reserve_When_reserve_renewed_projected_Then_error_occurs()
        {
            var stockId           = Guid.NewGuid();
            var stockCreatedEvent = new SkuStockCreated(stockId, Guid.NewGuid(), 1, TimeSpan.FromDays(2));
            var reserveRenewed    = new ReserveRenewed(stockId, Guid.NewGuid());

            await ProjectionBuilder.Handle(stockCreatedEvent);

            await Assert.ThrowsAsync <ReserveEntryNotFoundException>(() => ProjectionBuilder.Handle(reserveRenewed));
        }
示例#3
0
        public SkuStock_renewed_tests()// Given_sku_created_and_reserved_and_reserve_expired_messages_When_projected()
        {
            var stockId = Guid.NewGuid();

            _stockCreatedEvent = new SkuStockCreated(stockId, Guid.NewGuid(), 1, TimeSpan.FromDays(2));
            _stockReservedEvent = new StockReserved(stockId, Guid.NewGuid(), DateTime.Now.AddDays(1), 7);
            _stockReserveRenewedEvent = new ReserveRenewed(stockId, _stockReservedEvent.ReserveId);

            ProjectionBuilder.Handle(_stockCreatedEvent).Wait();
            ProjectionBuilder.Handle(_stockReservedEvent).Wait();
            ProjectionBuilder.Handle(_stockReserveRenewedEvent).Wait();
        }
示例#4
0
        public async Task Given_sku_created_and_reserved_and_renewed_messages_When_projected()
        {
            var stockId = Guid.NewGuid();

            var stockCreatedEvent  = new SkuStockCreated(stockId, Guid.NewGuid(), 1, TimeSpan.FromDays(2));
            var stockReservedEvent = new StockReserved(stockId, Guid.NewGuid(), DateTime.Now.AddDays(1), 7);
            var reserveRenewed     = new ReserveRenewed(stockId, stockReservedEvent.ReserveId);

            await ProjectionBuilder.Handle(stockCreatedEvent);

            await ProjectionBuilder.Handle(stockReservedEvent);

            await ProjectionBuilder.Handle(reserveRenewed);

            await Assert.ThrowsAsync <ReserveEntryNotFoundException>(() => ProjectionBuilder.Handle(reserveRenewed));
        }
示例#5
0
 public async Task Given_no_stock_When_reserve_taken_projected_Then_error_occurs()
 {
     var reserveRenewed = new ReserveRenewed(Guid.NewGuid(), Guid.NewGuid());
     await Assert.ThrowsAsync <SkuStockEntryNotFoundException>(() => ProjectionBuilder.Handle(reserveRenewed));
 }