public async Task Execute(DepositInput input) { IAccount account = await _accountRepository.Get(input.AccountId); if (account == null) { _outputHandler.Error($"The account {input.AccountId} does not exist or is already closed."); return; } ICredit credit = account.Deposit(_entityFactory, input.Amount); await _accountRepository.Update(account, credit); // Publish the event to the enterprice service bus await _serviceBus.PublishEventAsync(new Shared.Events.DepositCompleted() { AccountId = input.AccountId, Amount = input.Amount.ToMoney().ToDecimal() }); await _unitOfWork.Save(); DepositOutput output = new DepositOutput( credit, account.GetCurrentBalance() ); _outputHandler.Default(output); }
public async Task Execute(CloseAccountInput closeAccountInput) { IAccount account = await _accountRepository.Get(closeAccountInput.AccountId); if (account == null) { _outputHandler.Error($"The account '{closeAccountInput.AccountId}' does not exist or is already closed."); return; } if (account.IsClosingAllowed()) { await _accountRepository.Delete(account); // Publish the event to the enterprice service bus await _serviceBus.PublishEventAsync(new Shared.Events.CloseAccountCompleted() { AccountId = account.Id }); await _unitOfWork.Save(); } var closeAccountOutput = new CloseAccountOutput(account); _outputHandler.Default(closeAccountOutput); }
public async Task Execute(RefundInput input) { IAccount account = await _accountRepository.Get(input.AccountId); if (account == null) { _outputHandler.Error($"The account {input.AccountId} does not exist or is already closed."); return; } IDebit debit = account.Withdraw(_entityFactory, input.Amount); if (debit == null) { _outputHandler.Error($"The account {input.AccountId} does not have enough funds to withdraw {input.Amount}."); return; } await _accountRepository.Update(account, debit); // Publish the event to the enterprice service bus await _serviceBus.PublishEventAsync(new Shared.Events.WithdrawCompleted() { AccountId = input.AccountId, Amount = input.Amount.ToMoney().ToDecimal() }); await _unitOfWork.Save(); RefundOutput output = new RefundOutput( debit, account.GetCurrentBalance() ); _outputHandler.Default(output); }
public async Task Execute(TransferInput input) { IAccount originAccount = await _accountRepository.Get(input.OriginAccountId); if (originAccount == null) { _outputHandler.Error($"The account {input.OriginAccountId} does not exist or is already closed."); return; } IAccount destinationAccount = await _accountRepository.Get(input.DestinationAccountId); if (destinationAccount == null) { _outputHandler.Error($"The account {input.DestinationAccountId} does not exist or is already closed."); return; } IDebit debit = originAccount.Withdraw(_entityFactory, input.Amount); ICredit credit = destinationAccount.Deposit(_entityFactory, input.Amount); await _accountRepository.Update(originAccount, debit); await _accountRepository.Update(destinationAccount, credit); // Publish the event to the enterprice service bus await _serviceBus.PublishEventAsync(new Shared.Events.TransferCompleted() { OriginalAccountId = originAccount.Id, DestinationAccountId = destinationAccount.Id, Amount = input.Amount.ToMoney().ToDecimal() }); await _unitOfWork.Save(); TransferOutput output = new TransferOutput( debit, originAccount.GetCurrentBalance(), input.OriginAccountId, input.DestinationAccountId); _outputHandler.Default(output); }
public async Task Execute(RegisterInput input) { if (input == null) { _outputHandler.Error("Input is null."); return; } var customer = _entityFactory.NewCustomer(input.SSN, input.Name); var account = _entityFactory.NewAccount(customer); ICredit credit = account.Deposit(_entityFactory, input.InitialAmount); if (credit == null) { _outputHandler.Error("An error happened when depositing the amount."); return; } customer.Register(account); // Call to an external Web Api await _customerRepository.Add(customer); await _accountRepository.Add(account, credit); // Publish the event to the enterprice service bus await _serviceBus.PublishEventAsync(new RegistrationCompleted() { CustomerId = customer.Id, AccountId = account.Id, CreditId = credit.Id }); await _unitOfWork.Save(); RegisterOutput output = new RegisterOutput(customer, account); _outputHandler.Standard(output); }