コード例 #1
0
        public override void Execute()
        {
            var eventAggregator = new EventAggregator();

            var orderPublisher     = new OrderPublisher(eventAggregator);
            var warehousePublisher = new WarehousePublisher(eventAggregator);

            var orderSubscriber            = new OrderSubscriber(eventAggregator);
            var businessTrackingSubscriber = new BusinessTrackingSubscriber(eventAggregator);

            Console.WriteLine("Preparing order 1...");
            orderPublisher.Publish("Order 1");

            Console.WriteLine("\nPreparing small delivery...");
            warehousePublisher.Publish("Small delivery to the warehouse.");

            Console.WriteLine("\nPreparing order 2...");
            orderPublisher.Publish("Order 2");

            Console.WriteLine("\nUnsubscribing order subscriber from further events...");
            orderSubscriber.Unsubscribe();

            Console.WriteLine("\nPreparing order 3...");
            orderPublisher.Publish("Order 3");
        }
コード例 #2
0
        public VarlikResult CancelTheOrder(long idMainOrder, long idUser)
        {
            var result = new VarlikResult();

            using (var ctx = new VarlikContext())
            {
                var mainOrder = ctx.MainOrderLog
                                .FirstOrDefault(l => l.Id == idMainOrder && l.IdUser == idUser);
                if (mainOrder == null)
                {
                    result.Status = ResultStatus.NoSuchObject;
                    return(result);
                }

                if (mainOrder.IdTransactionState != TransactionStateEnum.Processing)
                {
                    result.Status = ResultStatus.CannotBeCancelled;
                    return(result);
                }

                //sub orders
                var subOrders = ctx.UserCoinTransactionOrder.Where(l => l.IdMainOrderLog == mainOrder.Id).ToList();
                foreach (var item in subOrders)
                {
                    item.IdTransactionState = TransactionStateEnum.CancelledByUser;
                }

                mainOrder.IdTransactionState = TransactionStateEnum.CancelledByUser;

                try
                {
                    ctx.SaveChanges();
                    result.Success();

                    //push
                    OrderPublisher orderPublisher = new OrderPublisher();
                    foreach (var item in subOrders)
                    {
                        orderPublisher.PublishOrder(item.IdCoinType, new TransactinOrderListDto()
                        {
                            CoinAmount        = -1 * item.CoinAmount,
                            CoinUnitPrice     = item.CoinUnitPrice,
                            IdTransactionType = item.IdTransactionType,
                            Total             = -1 * item.CoinAmount * item.CoinUnitPrice
                        });
                    }
                }
                catch (Exception e)
                {
                }
            }

            return(result);
        }
コード例 #3
0
        public VarlikResult Save(UserCoinTransactionOrderDto userCoinTransactionOrderDto)
        {
            if (userCoinTransactionOrderDto == null)
            {
                var result = new VarlikResult();
                result.Status = ResultStatus.MissingRequiredParamater;
                return(result);
            }

            userCoinTransactionOrderDto.CoinUnitPrice = Math.Abs(userCoinTransactionOrderDto.CoinUnitPrice);
            userCoinTransactionOrderDto.CoinAmount    = Math.Abs(userCoinTransactionOrderDto.CoinAmount);

            var transactionManager = new UserCoinTransactionLogManager();

            //get current max price of coin
            if (userCoinTransactionOrderDto.IdTransactionType == TransactionTypeEnum.CoinSales)
            {
                var maxPriceR = transactionManager.GetMaxPriceOfCoin(userCoinTransactionOrderDto.IdCoinType);
                if (maxPriceR.IsSuccess)
                {
                    if (maxPriceR.Data > 0)
                    {
                        var limit = maxPriceR.Data * 20;
                        if (userCoinTransactionOrderDto.CoinUnitPrice > limit)
                        {
                            var result = new VarlikResult();
                            result.Status = ResultStatus.AboveTheLimit;
                            return(result);
                        }
                    }
                }
            }
            var idUser = IdentityHelper.Instance.CurrentUserId;

            userCoinTransactionOrderDto.IdUser = idUser;

            // does user have this address
            if (userCoinTransactionOrderDto.IdTransactionType == TransactionTypeEnum.FromWallet)
            {
                var userManager = new UserManager();
                var hasAddressR = userManager.DoesUserHaveThisAddress(idUser, userCoinTransactionOrderDto.IdCoinType, userCoinTransactionOrderDto.ToWalletAddress);
                if (!hasAddressR.IsSuccess)
                {
                    return(hasAddressR);
                }
                if (!hasAddressR.Data)
                {
                    var result = new VarlikResult();
                    result.Status = ResultStatus.UserDoesNotHaveThisAddress;
                    return(result);
                }
            }
            else if (userCoinTransactionOrderDto.IdTransactionType == TransactionTypeEnum.ToWallet)
            {
                var userManager = new UserManager();
                var hasAddressR = userManager.DoesUserHaveThisAddress(idUser, userCoinTransactionOrderDto.IdCoinType, userCoinTransactionOrderDto.FromWalletAddress);
                if (!hasAddressR.IsSuccess || !hasAddressR.Data)
                {
                    var result = new VarlikResult();
                    result.Status = ResultStatus.UserDoesNotHaveThisAddress;
                    return(result);
                }
            }

            var push       = new List <TransactinOrderListDto>();
            var saveResult = _userCoinTransactionOrderOperation.MakeOrder(userCoinTransactionOrderDto, ref push);

            // push to order list
            if (saveResult.IsSuccess)
            {
                OrderPublisher orderPublisher = new OrderPublisher();
                foreach (var transactinOrderListDto in push)
                {
                    orderPublisher.PublishOrder(userCoinTransactionOrderDto.IdCoinType, transactinOrderListDto);
                }
            }

            //push to price list
            transactionManager.PushPrice(userCoinTransactionOrderDto.IdCoinType);

            return(saveResult);
        }