public override async Task <IResult <Account> > Execute(ValidateTransactionIntent argument) { var transactionResult = await _getTransactionQuery.Fetch(new GetTransactionIntent(argument.TransactionId)); if (!transactionResult.IsSuccessful) { return(transactionResult.FailureDetails.ToErrorResult <Account>()); } var transaction = transactionResult.Content; if (transaction == null) { return(FailureReason.ExpectationFailed.ToErrorResult <Account>("ValidateTransactionIntent", "not found transaction")); } if (transaction.TransactionStatus != Transaction.Status.Submitted && transaction.TransactionStatus != Transaction.Status.Error) { return(FailureReason.ExpectationFailed.ToErrorResult <Account>("ValidateTransactionIntent", $"invalid transaction status: {transaction.TransactionStatus.ToString()}")); } var senderResult = await _getAccountQuery.Fetch(new GetAccountIntent(transaction.SenderKey)); var recipientResult = await _getAccountQuery.Fetch(new GetAccountIntent(transaction.RecipientKey)); if (!(senderResult.IsSuccessful && recipientResult.IsSuccessful)) { return(senderResult.FailureDetails .Union(recipientResult.FailureDetails) .ToErrorResult <Account>()); } var updateStatusResult = await _updateStatusCommand.Execute(new UpdateTransactionStatusIntent(transaction.Id, Transaction.Status.Pending)); if (!updateStatusResult.IsSuccessful) { return(updateStatusResult.FailureDetails.ToErrorResult <Account>()); } IResult <Account> accountResult = null; try { accountResult = await _createOperationCommand.Execute(new CreateOperationIntent( transaction, senderResult.Content, recipientResult.Content)); var status = accountResult?.IsSuccessful ?? false ? Transaction.Status.Accepted : Transaction.Status.Error; updateStatusResult = await _updateStatusCommand.Execute(new UpdateTransactionStatusIntent( transaction.Id, status)); if (!updateStatusResult.IsSuccessful) { accountResult.AddFailureDetails(updateStatusResult.FailureDetails.ToArray()); } accountResult.Content.SetTransactionStatus(transaction.Id, status); return(accountResult); } catch (Exception exception) { throw new IntentException(argument, _createOperationCommand, exception); } }