コード例 #1
0
        public CheckTransaction CheckTransactionHash(string email, int buyId)
        {
            var user = UserBusiness.GetValidUser(email);
            var buy  = BuyBusiness.Get(buyId);

            if (buy == null || buy.UserId != user.Id || buy.LastTransaction == null)
            {
                throw new ArgumentException("Invalid purchase.");
            }

            var status = buy.LastTransaction.TransactionStatus;

            if (status == TransactionStatus.Success.Value || status == TransactionStatus.Pending.Value)
            {
                if (status == TransactionStatus.Pending.Value)
                {
                    status = CheckAndProcessTransaction(buy.LastTransaction, buy.Id).Value;
                }
                if (status == TransactionStatus.Success.Value)
                {
                    var portfolio = PortfolioBusiness.GetSimple(buy.PortfolioId);
                    return(new CheckTransaction()
                    {
                        Status = status,
                        Distribution = DistributionBusiness.ListByProjection(portfolio.ProjectionId.Value)
                    });
                }
            }
            return(new CheckTransaction()
            {
                Status = status
            });
        }
コード例 #2
0
        public void Cancel(string email, int buyId)
        {
            var user = UserBusiness.GetValidUser(email);
            var buy  = BuyBusiness.Get(buyId);

            if (buy == null || buy.UserId != user.Id || buy.ExpirationDate.HasValue)
            {
                throw new ArgumentException("Invalid purchase.");
            }

            if (buy.LastTransaction.TransactionStatus == TransactionStatus.Pending.Value)
            {
                if (string.IsNullOrEmpty(buy.LastTransaction.TransactionHash))
                {
                    TransactionBusiness.Process(buy.LastTransaction, TransactionStatus.Cancel);
                }
                else
                {
                    try
                    {
                        var transaction = Web3.Web3Business.CheckTransaction(buy.LastTransaction.TransactionHash);
                        throw new ArgumentException(transaction.BlockNumber.HasValue ? "The transaction is already minted." : "Pending transaction cannot be canceled.");
                    }
                    catch (DomainObjects.Web3.Web3Exception ex)
                    {
                        if (ex.Code == 404)
                        {
                            TransactionBusiness.Process(buy.LastTransaction, TransactionStatus.Cancel);
                        }
                        else
                        {
                            throw;
                        }
                    }
                }
            }
            else if (buy.LastTransaction.TransactionStatus == TransactionStatus.Error.Value)
            {
                using (var transaction = new TransactionalDapperCommand())
                {
                    var trans = TransactionBusiness.SetCanceled(user.Id);
                    transaction.Insert(trans);
                    var buyTrans = BuyTransactionBusiness.SetNew(buyId, trans.Id);
                    transaction.Insert(buyTrans);
                    transaction.Commit();
                }
            }
            else
            {
                throw new ArgumentException("Invalid transaction status.");
            }
        }
コード例 #3
0
        public void SetTransactionHash(string email, int buyId, string transactionHash)
        {
            var user = UserBusiness.GetValidUser(email);
            var buy  = BuyBusiness.Get(buyId);

            if (buy == null || buy.UserId != user.Id || buy.ExpirationDate.HasValue)
            {
                throw new ArgumentException("Invalid purchase.");
            }

            if (buy.LastTransaction.TransactionStatus == TransactionStatus.Pending.Value && string.IsNullOrEmpty(buy.LastTransaction.TransactionHash))
            {
                TransactionBusiness.SetTransactionHash(buy.LastTransaction, transactionHash);
            }
            else if (buy.LastTransaction.TransactionStatus == TransactionStatus.Error.Value)
            {
                Create(user.Id, buyId, transactionHash);
            }
            else if (buy.LastTransaction.TransactionStatus == TransactionStatus.Pending.Value && TransactionBusiness.TransactionCanBeConsideredLost(buy.LastTransaction) &&
                     buy.LastTransaction.TransactionHash != transactionHash.ToLower().Trim())
            {
                try
                {
                    var transaction = Web3.Web3Business.CheckTransaction(buy.LastTransaction.TransactionHash);
                    throw new ArgumentException(transaction.BlockNumber.HasValue ? "Before transaction was processed." : "Before transaction is still pending.");
                }
                catch (DomainObjects.Web3.Web3Exception ex)
                {
                    if (ex.Code == 404)
                    {
                        HandleLostTransaction(buy.LastTransaction, user.Id, buyId, transactionHash);
                    }
                    else
                    {
                        throw;
                    }
                }
            }
            else
            {
                throw new ArgumentException("Invalid transaction status.");
            }
        }