public async Task HandleAsync(StocksTakedOffFromWalletEvent message) { var orderProcessManager = await _processManagerRepository.FindAsync(message.OrderId); try { orderProcessManager.When(message); } catch (StocqresException e) { orderProcessManager.When(new SellOrderCancelledEvent(e.Message)); } await _processManagerRepository.Save(orderProcessManager); }
public void When(StocksTakedOffFromWalletEvent message) { switch (State) { case SellOrderProcessManagerState.OrderPlaced: CompanyId = message.CompanyId; StockQuantity = message.Quantity; State = SellOrderProcessManagerState.StocksTakedOffFromWallet; ProcessCommand(new AddStocksToCompanyCommand(CompanyId, message.AggregateId, message.Quantity, StockCode)); break; // idempotence - same message sent twice case SellOrderProcessManagerState.StocksTakedOffFromWallet: break; default: throw new StocqresException("Invalid state for this message"); } }
private void Apply(StocksTakedOffFromWalletEvent @event) { var stock = StockList.First(s => s.CompanyId == @event.CompanyId); stock.Quantity -= @event.Quantity; }