コード例 #1
0
        public void DispatchShouldSupportMultipleHandlers()
        {
            // Arrange.
            var evt = new OrderCancelledEvent();

            var executed = 0;
            var handler1 = new OrderCancelledEventHandler1(() => { executed++; });
            var handler2 = new OrderCancelledEventHandler2(() => { executed++; });

            var map = new MessageHandlerMap();

            map.Add(typeof(OrderCancelledEvent), handler1.GetType());
            map.Add(typeof(OrderCancelledEvent), handler2.GetType());

            var container = A.Fake <IContainer>();

            A.CallTo(() => container.Resolve(handler1.GetType())).Returns(handler1);
            A.CallTo(() => container.Resolve(handler2.GetType())).Returns(handler2);

            var dispatcher = new MessageDispatcher(container, map);

            // Act.
            dispatcher.Dispatch("CreateOrder", new Envelope <OrderCancelledEvent>(evt)).Wait();

            // Assert.
            Assert.Equal(2, executed);
        }
コード例 #2
0
        public void DispatchShouldThrowIfHandlerNull()
        {
            // Arrange.
            var evt = new OrderCancelledEvent();
            var map = new MessageHandlerMap();

            map.Add(typeof(OrderCancelledEvent), typeof(OrderCancelledEventHandler1));

            var container = A.Fake <IContainer>();

            A.CallTo(() => container.Resolve(typeof(OrderCancelledEventHandler1))).Returns(null);

            // Act.
            Assert.Throws <NullReferenceException>(() =>
            {
                try
                {
                    var dispatcher = new MessageDispatcher(container, map);
                    dispatcher.Dispatch("CreateOrder", new Envelope <OrderCancelledEvent>(evt)).Wait();
                }
                catch (AggregateException ex)
                {
                    throw ex.InnerException;
                }
            });
        }
コード例 #3
0
        public void DispatchShouldSupportGiveAccessToSession()
        {
            // Arrange.
            var evt     = new OrderCancelledEvent();
            var handler = new SessionOrderCancelledEventHandler();

            var map = new MessageHandlerMap();

            map.Add(typeof(OrderCancelledEvent), handler.GetType());

            var container = A.Fake <IContainer>();

            A.CallTo(() => container.Resolve(handler.GetType())).Returns(handler);

            var dispatcher = new MessageDispatcher(container, map);
            var session    = A.Fake <ISession>();

            // Act.
            var envelope = new Envelope <OrderCancelledEvent>(evt);

            dispatcher.Dispatch("CreateOrder", envelope, session).Wait();

            // Assert.
            Assert.Equal(session, handler.Session);
        }
コード例 #4
0
 private void Apply(OrderCancelledEvent e, bool isNew)
 {
     if (Status == State.Cancelled)
     {
         return;
     }
     AddEvent(e, isNew);
     Status = State.Cancelled;
 }
コード例 #5
0
        public void Cancel()
        {
            var e = new OrderCancelledEvent()
            {
                OrderNumber = this.OrderNumber,
                Version     = LastVersionNumber() + 1
            };

            Apply(e, true);
        }
コード例 #6
0
        public Task Handle(OrderCancelledEvent evnt)
        {
            var order = _dbContext.Orders.FirstOrDefault(o => o.OrderId == evnt.EntityId);

            if (order != null)
            {
                order.CancellationReason = evnt.CancellationReason;
                order.State = OrderState.Cancelled;
            }
            return(Task.CompletedTask);
        }
コード例 #7
0
        /// <summary>
        /// Handle order cancelled event
        /// </summary>
        /// <param name="eventMessage">Event message</param>
        public void HandleEvent(OrderCancelledEvent eventMessage)
        {
            if (eventMessage.Order == null)
            {
                return;
            }

            //ensure that Avalara tax provider is active
            if (_taxService.LoadActiveTaxProvider(eventMessage.Order.Customer) is AvalaraTaxProvider taxProvider)
            {
                //void tax transaction
                taxProvider.VoidTaxTransaction(eventMessage.Order);
            }
        }
コード例 #8
0
        /// <summary>
        /// Handle order cancelled event
        /// </summary>
        /// <param name="eventMessage">Event message</param>
        public void HandleEvent(OrderCancelledEvent eventMessage)
        {
            if (eventMessage.Order == null)
            {
                return;
            }

            //ensure that Avalara tax provider is active
            if (!_taxPluginManager.IsPluginActive(AvalaraTaxDefaults.SystemName))
            {
                return;
            }

            //void tax transaction
            _avalaraTaxManager.VoidTaxTransaction(eventMessage.Order);
        }
コード例 #9
0
ファイル: EventConsumer.cs プロジェクト: sjayjay005/hazina
        /// <summary>
        /// Handle order cancelled event
        /// </summary>
        /// <param name="eventMessage">Event message</param>
        /// <returns>A task that represents the asynchronous operation</returns>
        public async Task HandleEventAsync(OrderCancelledEvent eventMessage)
        {
            if (eventMessage.Order == null)
            {
                return;
            }

            //ensure that Avalara tax provider is active
            if (!await _taxPluginManager.IsPluginActiveAsync(AvalaraTaxDefaults.SystemName))
            {
                return;
            }

            //async Task tax transaction
            await _avalaraTaxManager.VoidTaxTransactionAsync(eventMessage.Order);
        }
コード例 #10
0
        public async Task CancelOrder(Guid orderId)
        {
            var player = await _playerRepo.GetPlayer(Context.User);

            var order = await _repo.GetOrder(orderId);

            if (order.OwnerId != player.PlayerId)
            {
                throw new UnauthorizedAccessException("User does not own the order");
            }

            var evnt = new OrderCancelledEvent(orderId, player)
            {
                CancellationReason = OrderCancellationReason.User,
            };
            await _eventStore.ProduceAsync(evnt);
        }
コード例 #11
0
        public async Task Handle(JObject jObject, ILog log, CancellationToken cancellationToken)
        {
            var orderValidated = jObject.ToObject <OrderValidatedEvent>();

            if (orderValidated.IsValid)
            {
                var orderShippedEvent = new OrderShippedEvent
                {
                    Id = orderValidated.OrderId
                };
                await _producer.Send(orderShippedEvent, "ReactiveMicroservices");
            }
            else
            {
                var orderCancelledEvent = new OrderCancelledEvent
                {
                    Id = orderValidated.OrderId
                };
                await _producer.Send(orderCancelledEvent, "ReactiveMicroservices");
            }
        }
コード例 #12
0
        public async Task Handle(JObject jObject, ILog log, CancellationToken cancellationToken)
        {
            var orderValidated = jObject.ToObject <OrderValidatedEvent>();

            if (orderValidated.IsValid)
            {
                var orderShippedEvent = new OrderShippedEvent {
                    Data = orderValidated.Data, OrderId = orderValidated.OrderId
                };
                await _shipedEventSources.InserEvent(orderShippedEvent, cancellationToken);

                await _producer.Send(orderShippedEvent, AppGlobalTopic.PosTopic);
            }
            else
            {
                var orderCanceledEvent = new OrderCancelledEvent {
                    Data = orderValidated.Data, OrderId = orderValidated.OrderId
                };
                await _cancelledEventSources.InserEvent(orderCanceledEvent, cancellationToken);

                await _producer.Send(orderCanceledEvent, AppGlobalTopic.PosTopic);
            }
        }
コード例 #13
0
 public async Task Handle(OrderCancelledEvent message, CancellationToken cancellationToken)
 {
     await _inventoryService.RefillOrderProducts(message.OrderProducts);
 }
コード例 #14
0
 public async Task When([FromBody] OrderCancelledEvent @event) =>
 ReadModelForOrderContext.locker.Lock(() =>
 {
     var existingOrder         = ReadModelForOrderContext.Orders.SingleOrDefault(o => o.Id == @event.OrderId);
     existingOrder.OrderStatus = "Cancelled";
 });
コード例 #15
0
        public void HandleEvent(OrderCancelledEvent eventMessage)
        {
            if (!_smsSettings.Enabled)
            {
                return;
            }
            if (!_smsSettings.EnableOrderCanceled)
            {
                return;
            }

            if (_smsSettings.IgnnoreUserIDs.Split(',').Contains(eventMessage.Order.CustomerId.ToString()))
            {
                eventMessage.Order.OrderNotes.Add(new OrderNote
                {
                    Note = "SMS alert not send. user:"******" in Ignore Lit",
                    DisplayToCustomer = false,
                    CreatedOnUtc      = DateTime.UtcNow
                });
                _orderService.UpdateOrder(eventMessage.Order);
                return;
            }


            string template = "";

            if (eventMessage.Order.CustomerLanguageId == _smsSettings.SecondLanguageID)
            {
                // second language
                template = _smsSettings.TemplateOrderCanceled2;
            }
            else
            {
                if (eventMessage.Order.CustomerLanguageId == _smsSettings.ThirdLanguageID)
                {
                    // Third language
                    template = _smsSettings.TemplateOrderCanceled3;
                }
                else
                {
                    // default
                    template = _smsSettings.TemplateOrderCanceled;
                }
            }
            if (string.IsNullOrEmpty(template))
            {
                template = _smsSettings.TemplateOrderCanceled;
            }

            try
            {
                template = string.Format(template, eventMessage.Order.Id, eventMessage.Order.OrderTotal);
            }
            catch { }
            var pluginDescriptor = _pluginFinder.GetPluginDescriptorBySystemName("SMS.Notifications");

            if (pluginDescriptor == null)
            {
                return;
            }
            if (!_pluginFinder.AuthenticateStore(pluginDescriptor, _storeContext.CurrentStore.Id))
            {
                return;
            }

            var plugin = pluginDescriptor.Instance() as SMSNotificationsProvider;

            if (plugin == null)
            {
                return;
            }
            string phonenum = string.IsNullOrEmpty(eventMessage.Order.Customer.BillingAddress.PhoneNumber) ?
                              eventMessage.Order.Customer.ShippingAddress.PhoneNumber :
                              eventMessage.Order.Customer.BillingAddress.PhoneNumber;

            phonenum = ParcePhoneNumbe(phonenum);
            string resText = "";

            if (plugin.SendSms(phonenum, template, out resText))
            {
                eventMessage.Order.OrderNotes.Add(new OrderNote
                {
                    Note = "\"Order canceled\" SMS alert has been sent to phone:" + phonenum,
                    DisplayToCustomer = false,
                    CreatedOnUtc      = DateTime.UtcNow
                });
                _orderService.UpdateOrder(eventMessage.Order);
            }
            else
            {
                eventMessage.Order.OrderNotes.Add(new OrderNote
                {
                    Note = "\"Order canceled\" SMS alert can't send to phone:" + phonenum + ". Error " + resText,
                    DisplayToCustomer = false,
                    CreatedOnUtc      = DateTime.UtcNow
                });
                _orderService.UpdateOrder(eventMessage.Order);
            }
        }
コード例 #16
0
        private Task ProcessMessageAsync(ExecutionEvent message)
        {
            var orders = message.Orders.Select(x => new OrderModel
            {
                Id              = Guid.Parse(x.ExternalId),
                WalletId        = Guid.Parse(x.WalletId),
                Volume          = decimal.Parse(x.Volume),
                AssetPairId     = x.AssetPairId,
                CreateDt        = x.CreatedAt,
                LowerLimitPrice = ParseNullabe(x.LowerLimitPrice),
                LowerPrice      = ParseNullabe(x.LowerPrice),
                MatchDt         = x.LastMatchTime,
                MatchingId      = Guid.Parse(x.Id),
                Price           = ParseNullabe(x.Price),
                RegisterDt      = x.Registered,
                RejectReason    = x.RejectReason,
                RemainingVolume = ParseNullabe(x.RemainingVolume),
                Side            = (Contracts.Cqrs.Models.Enums.OrderSide)(int) x.Side,
                Status          = (Contracts.Cqrs.Models.Enums.OrderStatus)(int) x.Status,
                StatusDt        = x.StatusDate,
                Straight        = x.OrderType == OrderType.Limit || x.OrderType == OrderType.StopLimit || x.Straight,
                Type            = (Contracts.Cqrs.Models.Enums.OrderType)(int) x.OrderType,
                UpperLimitPrice = ParseNullabe(x.UpperLimitPrice),
                UpperPrice      = ParseNullabe(x.UpperPrice),
                Trades          = x.Trades?.Select(t => new TradeModel
                {
                    Id               = Guid.Parse(t.TradeId),
                    WalletId         = Guid.Parse(x.WalletId),
                    AssetPairId      = x.AssetPairId,
                    BaseAssetId      = t.BaseAssetId,
                    BaseVolume       = decimal.Parse(t.BaseVolume),
                    Price            = decimal.Parse(t.Price),
                    Timestamp        = t.Timestamp,
                    QuotingAssetId   = t.QuotingAssetId,
                    QuotingVolume    = decimal.Parse(t.QuotingVolume),
                    Index            = t.Index,
                    Role             = (Contracts.Cqrs.Models.Enums.TradeRole)(int) t.Role,
                    FeeSize          = ParseNullabe(t.Fees?.FirstOrDefault()?.Volume),
                    FeeAssetId       = t.Fees?.FirstOrDefault()?.AssetId,
                    OppositeWalletId = Guid.Parse(t.OppositeWalletId),
                }).ToList()
            }).ToList();

            foreach (var order in orders.Where(x => _walletIds.Contains(x.WalletId.ToString())))
            {
                _log.Info("Order from ME", $"order: {new {order.Id, order.Status, message.Header.SequenceNumber}.ToJson()}");
            }

            var @event = new ExecutionProcessedEvent
            {
                SequenceNumber = message.Header.SequenceNumber,
                Orders         = orders
            };

            _cqrsEngine.PublishEvent(@event, BoundedContext.Name);

            foreach (var order in orders.Where(x => x.Trades != null && x.Trades.Any()))
            {
                var tradeProcessedEvent = new ManualOrderTradeProcessedEvent
                {
                    Order = order
                };
                _cqrsEngine.PublishEvent(tradeProcessedEvent, BoundedContext.Name);
            }

            foreach (var order in message.Orders.Where(x => x.Trades != null && x.Trades.Count > 0))
            {
                var orderType = order.OrderType == OrderType.Market ? FeeOperationType.Trade : FeeOperationType.LimitTrade;
                var orderId   = order.Id;
                foreach (var trade in order.Trades)
                {
                    if (trade.Fees != null)
                    {
                        var feeEvent = new FeeChargedEvent
                        {
                            OperationId   = orderId,
                            OperationType = orderType,
                            Fee           = trade.Fees.ToJson()
                        };
                        _cqrsEngine.PublishEvent(feeEvent, BoundedContext.Name);
                    }
                }
            }

            var limitOrders = orders.Where(x => x.Type == Contracts.Cqrs.Models.Enums.OrderType.Limit ||
                                           x.Type == Contracts.Cqrs.Models.Enums.OrderType.StopLimit).ToList();

            foreach (var order in limitOrders.Where(x => x.Status == OrderStatus.Cancelled))
            {
                var orderCancelledEvent = new OrderCancelledEvent
                {
                    OrderId     = order.Id,
                    Status      = order.Status,
                    AssetPairId = order.AssetPairId,
                    Price       = order.Price,
                    Timestamp   = order.StatusDt,
                    Volume      = order.Volume,
                    WalletId    = order.WalletId
                };
                _cqrsEngine.PublishEvent(orderCancelledEvent, BoundedContext.Name);
            }

            foreach (var order in limitOrders.Where(x => x.Status == OrderStatus.Placed))
            {
                var orderPlacedEvent = new OrderPlacedEvent
                {
                    OrderId     = order.Id,
                    Status      = order.Status,
                    AssetPairId = order.AssetPairId,
                    Price       = order.Price,
                    Timestamp   = order.StatusDt,
                    Volume      = order.Volume,
                    WalletId    = order.WalletId,
                    CreateDt    = order.CreateDt
                };
                _cqrsEngine.PublishEvent(orderPlacedEvent, BoundedContext.Name);
            }

            foreach (var order in limitOrders.Where(x =>
                                                    (x.Status == OrderStatus.Matched || x.Status == OrderStatus.PartiallyMatched) &&
                                                    x.Trades.Any(t => t.Role == TradeRole.Taker)))
            {
                var orderPlacedEvent = new OrderPlacedEvent
                {
                    OrderId     = order.Id,
                    Status      = order.Status,
                    AssetPairId = order.AssetPairId,
                    Price       = order.Price,
                    Timestamp   = order.StatusDt,
                    Volume      = order.Volume,
                    WalletId    = order.WalletId,
                    CreateDt    = order.CreateDt
                };
                _cqrsEngine.PublishEvent(orderPlacedEvent, BoundedContext.Name);
            }

            return(Task.CompletedTask);
        }
コード例 #17
0
        /// <param name="cancellationToken">A cancellation token that can be used by other objects or threads to receive notice of cancellation.</param>
        /// <returns>Success</returns>
        /// <exception cref="ApiException">A server side error occurred.</exception>
        public async System.Threading.Tasks.Task WhenAsync(OrderCancelledEvent @event, System.Threading.CancellationToken cancellationToken)
        {
            var urlBuilder_ = new System.Text.StringBuilder();

            urlBuilder_.Append(BaseUrl != null ? BaseUrl.TrimEnd('/') : "").Append("/api/v1/Projections/order-cancelled");

            var client_ = _httpClient;

            try
            {
                using (var request_ = new System.Net.Http.HttpRequestMessage())
                {
                    var content_ = new System.Net.Http.StringContent(Newtonsoft.Json.JsonConvert.SerializeObject(@event, _settings.Value));
                    content_.Headers.ContentType = System.Net.Http.Headers.MediaTypeHeaderValue.Parse("application/json");
                    request_.Content             = content_;
                    request_.Method = new System.Net.Http.HttpMethod("PUT");

                    PrepareRequest(client_, request_, urlBuilder_);
                    var url_ = urlBuilder_.ToString();
                    request_.RequestUri = new System.Uri(url_, System.UriKind.RelativeOrAbsolute);
                    PrepareRequest(client_, request_, url_);

                    var response_ = await client_.SendAsync(request_, System.Net.Http.HttpCompletionOption.ResponseHeadersRead, cancellationToken).ConfigureAwait(false);

                    try
                    {
                        var headers_ = System.Linq.Enumerable.ToDictionary(response_.Headers, h_ => h_.Key, h_ => h_.Value);
                        if (response_.Content != null && response_.Content.Headers != null)
                        {
                            foreach (var item_ in response_.Content.Headers)
                            {
                                headers_[item_.Key] = item_.Value;
                            }
                        }

                        ProcessResponse(client_, response_);

                        var status_ = ((int)response_.StatusCode).ToString();
                        if (status_ == "200")
                        {
                            return;
                        }
                        else
                        if (status_ != "200" && status_ != "204")
                        {
                            var responseData_ = response_.Content == null ? null : await response_.Content.ReadAsStringAsync().ConfigureAwait(false);

                            throw new ApiException("The HTTP status code of the response was not expected (" + (int)response_.StatusCode + ").", (int)response_.StatusCode, responseData_, headers_, null);
                        }
                    }
                    finally
                    {
                        if (response_ != null)
                        {
                            response_.Dispose();
                        }
                    }
                }
            }
            finally
            {
            }
        }
コード例 #18
0
 /// <returns>Success</returns>
 /// <exception cref="ApiException">A server side error occurred.</exception>
 public System.Threading.Tasks.Task WhenAsync(OrderCancelledEvent @event)
 {
     return(WhenAsync(@event, System.Threading.CancellationToken.None));
 }
コード例 #19
0
 private void When(OrderCancelledEvent @event) =>
 With(this, state =>
 {
     state.OrderStatus = OrderStatus.Cancelled;
 });