public void DespositMoney(WalletId walletId, Money amount) { var wallet = _wallets.SingleOrDefault(w => w.WalletId == walletId); if (wallet == null) { throw new WalletNotFoundException($"Wallet {walletId} was not found."); } var e = wallet.Deposit(amount); RaiseEvent(e); }
public void WithdrawMoney(WalletId walletId, Money amount) { var wallet = _wallets.SingleOrDefault(w => w.WalletId == walletId); if (wallet == null) { throw new WalletNotFoundException($"Wallet {walletId} was not found."); } if (amount > wallet.Balance) { throw new InsufficientFundsException($"Insufficient funds to withdraw {amount}."); } var e = wallet.Withdraw(amount); RaiseEvent(e); }
public void TransferToWallet(WalletId sourceId, WalletId destinationId, Money amount) { var source = _wallets.SingleOrDefault(w => w.WalletId == sourceId); var destination = _wallets.SingleOrDefault(w => w.WalletId == destinationId); if (source == null || destination == null) { throw new WalletNotFoundException("Could not find one of the specified wallets."); } if (source.Balance < amount) { throw new InsufficientFundsException("The source wallet does not have enough funds to transfer to the destination."); } // This *could* just call WithdrawnMoney and DepositMoney, but I want to separate them // in order to create an atomic transaction. If it errors before raising the events, // then the events will not persist. var withdrawn = source.Withdraw(amount); var deposited = destination.Deposit(amount); RaiseEvent(withdrawn); RaiseEvent(deposited); }