示例#1
0
        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);
            }
        }