public async Task Handle(StockReserveTaken 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.ReserveTaken, reserve.Quantity);

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

                FillNewQuantities(history, skuStock);

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

                await context.SaveChangesAsync();
            }
        }
Exemple #2
0
        public async Task Given_no_reserve_When_reserve_taken_projected_Then_error_occurs()
        {
            var stockId           = Guid.NewGuid();
            var stockCreatedEvent = new SkuStockCreated(stockId, Guid.NewGuid(), 1, TimeSpan.FromDays(2));
            var reserveTaken      = new StockReserveTaken(stockId, Guid.NewGuid());

            await ProjectionBuilder.Handle(stockCreatedEvent);

            await Assert.ThrowsAsync <ReserveEntryNotFoundException>(() => ProjectionBuilder.Handle(reserveTaken));
        }
        public SkuStock_reserve_taken_tests()// Given_sku_created_and_stock_added_and_stock_reserved_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);
            _stockReserveTakenEvent = new StockReserveTaken(stockId, _stockReservedEvent.ReserveId);

            ProjectionBuilder.Handle(_stockCreatedEvent).Wait();
            ProjectionBuilder.Handle(_stockReservedEvent).Wait();
            ProjectionBuilder.Handle(_stockReserveTakenEvent).Wait();
        }
Exemple #4
0
        public async Task Given_sku_created_and_stock_added_and_stock_reserved_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 stockReserveTakenEvent = new StockReserveTaken(stockId, stockReservedEvent.ReserveId);

            await ProjectionBuilder.Handle(stockCreatedEvent);

            await ProjectionBuilder.Handle(stockReservedEvent);

            await ProjectionBuilder.Handle(stockReserveTakenEvent);

            await Assert.ThrowsAsync <ReserveEntryNotFoundException>(() => ProjectionBuilder.Handle(stockReserveTakenEvent));
        }
Exemple #5
0
 public async Task Given_no_stock_When_reserve_taken_projected_Then_error_occurs()
 {
     var reserveTaken = new StockReserveTaken(Guid.NewGuid(), Guid.NewGuid());
     await Assert.ThrowsAsync <SkuStockEntryNotFoundException>(() => ProjectionBuilder.Handle(reserveTaken));
 }