public IHttpActionResult CompleteOrder(OrderReadModel OrderItem) //give it a read model
        {
            IHttpActionResult newOrder;

            if (!ModelState.IsValid)
            {
                return(BadRequest(ModelState));
            }

            var listOfOrderItemIDs = this.addOrderItems(OrderItem);

            using (OrderSystemEntitiesCtx entities = new OrderSystemEntitiesCtx())
            {
                Order currentOrder = new Order()
                {
                    CustomerID = OrderItem.CustomerID,
                    Completed  = true,
                    Cancelled  = false,
                    TotalPrice = OrderItem.TotalPrice,
                    Tax        = OrderItem.TotalPrice - OrderItem.Price,
                    Date       = DateTime.Now,
                    MonthYear  = string.Format("{0:MMMM yyyy}", DateTime.Now)
                };
                entities.Orders.Add(currentOrder);

                entities.SaveChanges();
                newOrder = CreatedAtRoute("GetOrder", new
                {
                    OrderID = currentOrder.OrderID
                }, currentOrder);
                this.addOrderDetails(listOfOrderItemIDs, currentOrder.OrderID);
            }

            return(newOrder);
        }
Exemple #2
0
        private void Handle(OrderCompleted @event)
        {
            var oldOrder = _state.Orders.Single(x => x.Id == @event.OrderId);
            var order    = new OrderReadModel(@event.OrderId, OrderStateReadModel.Finalized);

            _state.Orders.Replace(oldOrder, order);
        }
Exemple #3
0
        private Guid InnerCreateOrder(Guid customerId, OrderCreateModel order)
        {
            var rnd   = new Random(10000);
            var model = new OrderReadModel()
            {
                Goods    = order.Goods,
                ArriveAt = DateTime.UtcNow.AddDays(2),
                OrderId  = Guid.NewGuid(),
                Cost     = (decimal)rnd.NextDouble(),
                Currency = order.Currency
            };

            if (!Orders.ContainsKey(customerId))
            {
                Orders.Add(customerId, new List <OrderReadModel>()
                {
                    model
                });
            }
            else
            {
                Orders[customerId].Add(model);
            }

            return(model.OrderId);
        }
Exemple #4
0
        private void Handle(OrderDiscarded @event)
        {
            var oldOrder = _state.Orders.Single(x => x.Id == @event.OrderId);
            var order    = new OrderReadModel(@event.OrderId, OrderStateReadModel.Canceled);

            _state.Orders.Replace(oldOrder, order);
        }
        public void GetOpenOrders_IfTraderIdIsProvided_RetrievedOrdersShouldBeDateTimeSortedAsDescending()
        {
            ManualResetEvent resetEvent = new ManualResetEvent(false);
            Order            order      = OrderFactory.CreateOrder("100", "XBTUSD", "limit", "buy", 5, 10,
                                                                   new StubbedOrderIdGenerator());

            resetEvent.WaitOne(2000);
            resetEvent.Reset();
            Order order1 = OrderFactory.CreateOrder("100", "XBTUSD", "limit", "buy", 5, 10,
                                                    new StubbedOrderIdGenerator());

            resetEvent.WaitOne(2000);
            resetEvent.Reset();
            Order order2 = OrderFactory.CreateOrder("100", "XBTUSD", "limit", "buy", 5, 10,
                                                    new StubbedOrderIdGenerator());

            resetEvent.WaitOne(2000);
            resetEvent.Reset();
            OrderReadModel model = ReadModelAdapter.GetOrderReadModel(order);

            _persistanceRepository.SaveOrUpdate(model);
            OrderReadModel model1 = ReadModelAdapter.GetOrderReadModel(order1);

            _persistanceRepository.SaveOrUpdate(model1);
            OrderReadModel model2 = ReadModelAdapter.GetOrderReadModel(order2);

            _persistanceRepository.SaveOrUpdate(model2);
            IList <OrderReadModel> getReadModel = _orderRepository.GetOpenOrders("100");

            Assert.NotNull(getReadModel);
            Assert.AreEqual(getReadModel.Count, 3);
            Assert.True(getReadModel[0].DateTime > getReadModel[1].DateTime);
            Assert.True(getReadModel[1].DateTime > getReadModel[2].DateTime);
        }
        public List <int> addOrderItems(OrderReadModel OrderItem)
        {
            IHttpActionResult newOrderItem;
            List <int>        listOfOrderItemIDs = new List <int>();

            using (OrderSystemEntitiesCtx entities = new OrderSystemEntitiesCtx())
            {
                //for each item
                foreach (var item in OrderItem.Items)
                {
                    foreach (var extra in item.ExtraItems)
                    {
                        OrderItem currentOrderItem = new OrderItem()
                        {
                            ItemID  = item.ItemID,
                            ExtraID = extra.ExtraID
                        };
                        OrderItem createdOrderItem = entities.OrderItems.Add(currentOrderItem);
                        entities.SaveChanges();
                        newOrderItem = CreatedAtRoute("GetOrderItem", new
                        {
                            OrderItemID = currentOrderItem.OrderItemID
                        }, currentOrderItem);
                        listOfOrderItemIDs.Add(createdOrderItem.OrderItemID);
                    }
                }
            }
            return(listOfOrderItemIDs);
        }
Exemple #7
0
 /// <summary>
 /// paramterized constructor
 /// </summary>
 /// <param name="order"></param>
 /// <param name="executionDateTime"></param>
 /// <param name="executionPrice"></param>
 public TradeDetailsRepresentation(OrderReadModel order, DateTime executionDateTime, decimal executionPrice, decimal volume, string tradeId)
 {
     Order             = order;
     ExecutionDateTime = executionDateTime;
     ExecutionPrice    = executionPrice;
     Volume            = volume;
     TradeId           = tradeId;
 }
        public OrderReadModel GetOrderById(TraderId traderId, OrderId orderId)
        {
            OrderReadModel model = CurrentSession.Get <OrderReadModel>(orderId.Id);

            if (model.TraderId.Equals(traderId.Id, StringComparison.InvariantCultureIgnoreCase))
            {
                return(model);
            }
            return(null);
        }
 private void AssertAreEqual(OrderReadModel expected, OrderReadModel actual)
 {
     Assert.AreEqual(expected.OrderId, actual.OrderId);
     Assert.AreEqual(expected.Side, actual.Side);
     Assert.AreEqual(expected.Type, actual.Type);
     Assert.AreEqual(expected.Price, actual.Price);
     Assert.AreEqual(expected.Status, actual.Status);
     Assert.AreEqual(expected.TraderId, actual.TraderId);
     Assert.AreEqual(expected.VolumeExecuted, actual.VolumeExecuted);
     Assert.AreEqual(expected.CurrencyPair, actual.CurrencyPair);
 }
Exemple #10
0
        public void Handle(OrderPlaced @event, TicketManagementDbContext db)
        {
            var orderReadModel = new OrderReadModel()
            {
                EventName   = @event.Order.Event.Name,
                OrderId     = @event.Order.Id,
                TicketCount = @event.Order.TicketCount
            };

            db.Set <OrderReadModel>().Add(orderReadModel);
        }
        public object GetOrderById(TraderId traderId, OrderId orderId)
        {
            OrderReadModel             order = _orderRepository.GetOrderById(traderId, orderId);
            Tuple <decimal, DateTime?> data  = CalculateAveragePrice(_tradeRepository.GetTradesByorderId(orderId.Id));

            order.AveragePrice = data.Item1;
            if (order.Status == OrderState.Complete.ToString())
            {
                order.ClosingDateTime = data.Item2;
            }
            return(order);
        }
        public void ValidateCancelOrderCommand_IfOrderIdAndTraderIdIsValidAndOrderStatusIsNotCompleteOrCancelled_CommandWillBeValidated()
        {
            Order order = OrderFactory.CreateOrder("1234", "XBTUSD", "limit", "buy", 5, 10,
                                                   new StubbedOrderIdGenerator());
            OrderReadModel model = ReadModelAdapter.GetOrderReadModel(order);

            _persistanceRepository.SaveOrUpdate(model);
            CancelOrderCommand            command    = new CancelOrderCommand(order.OrderId, order.TraderId);
            ICancelOrderCommandValidation validation = new CancelOrderCommandValidation(_orderRepository);

            Assert.True(validation.ValidateCancelOrderCommand(command));
        }
        public void ValidateCancelOrderCommand_IfOrderIdAndTraderIdIsValidAndOrderStatusIsCancelled_InvalidOperationException()
        {
            Order order = OrderFactory.CreateOrder("1234", "XBTUSD", "limit", "buy", 5, 10,
                                                   new StubbedOrderIdGenerator());

            order.OrderState = OrderState.Cancelled;
            OrderReadModel model = ReadModelAdapter.GetOrderReadModel(order);

            _persistanceRepository.SaveOrUpdate(model);
            CancelOrderCommand            command    = new CancelOrderCommand(order.OrderId, order.TraderId);
            ICancelOrderCommandValidation validation = new CancelOrderCommandValidation(_orderRepository);

            validation.ValidateCancelOrderCommand(command);
        }
        public void PublishOrderToOutputDisruptor_IfOrderListenerIsInitiated_ItShouldSaveInDatabase()
        {
            Order order = OrderFactory.CreateOrder("1234", "XBTUSD", "limit", "buy", 5, 10,
                                                   new StubbedOrderIdGenerator());

            OutputDisruptor.Publish(order);
            _manualResetEvent.WaitOne(5000);
            OrderReadModel receivedOrder = _orderRepository.GetOrderById(order.OrderId.Id.ToString());

            Assert.NotNull(receivedOrder);
            Assert.AreEqual(receivedOrder.OrderId, order.OrderId.Id.ToString());
            Assert.AreEqual(receivedOrder.Side, order.OrderSide.ToString());
            Assert.AreEqual(receivedOrder.Type, order.OrderType.ToString());
            Assert.AreEqual(receivedOrder.Price, order.Price.Value);
            Assert.AreEqual(receivedOrder.CurrencyPair, order.CurrencyPair);
        }
        public void SaveOrderReadModel_IfStateIsAccepted_ClosingTimeShouldBeNull()
        {
            Order order = OrderFactory.CreateOrder("1234", "XBTUSD", "limit", "buy", 5, 10,
                                                   new StubbedOrderIdGenerator());
            string id = DateTime.Now.ToString();

            order.OrderState = OrderState.Accepted;
            OrderReadModel model = ReadModelAdapter.GetOrderReadModel(order);

            _persistanceRepository.SaveOrUpdate(model);
            OrderReadModel getReadModel = _orderRepository.GetOrderById(order.OrderId.Id.ToString());

            Assert.NotNull(getReadModel);
            AssertAreEqual(getReadModel, model);
            Assert.Null(getReadModel.ClosingDateTime);
        }
        public void SaveOrderReadModel_IfSaveOrUpdateMethodIsCalled_ItShouldGetSavedInTheDatabase()
        {
            Order order = OrderFactory.CreateOrder("1234", "XBTUSD", "limit", "buy", 5, 10,
                                                   new StubbedOrderIdGenerator());
            string id = DateTime.Now.ToString();

            order.OrderState = OrderState.Complete;
            OrderReadModel model = ReadModelAdapter.GetOrderReadModel(order);

            _persistanceRepository.SaveOrUpdate(model);
            OrderReadModel getReadModel = _orderRepository.GetOrderById(order.OrderId.Id.ToString());

            Assert.NotNull(getReadModel);
            AssertAreEqual(getReadModel, model);
            Assert.NotNull(getReadModel.ClosingDateTime);
        }
        public void GetClosedOrders_IfTraderIdIsProvided_ItShouldRetireveAllClosedOrdersOfTrader()
        {
            Order order = OrderFactory.CreateOrder("999", "XBTUSD", "limit", "buy", 5, 10,
                                                   new StubbedOrderIdGenerator());

            order.OrderState = OrderState.Complete;
            string         id    = DateTime.Now.ToString();
            OrderReadModel model = ReadModelAdapter.GetOrderReadModel(order);

            _persistanceRepository.SaveOrUpdate(model);
            IList <OrderReadModel> getReadModel = _orderRepository.GetClosedOrders("999");

            Assert.NotNull(getReadModel);
            Assert.AreEqual(getReadModel.Count, 1);
            AssertAreEqual(getReadModel[0], model);
        }
        /// <summary>
        /// Trade Details
        /// </summary>
        /// <param name="traderId"></param>
        /// <param name="tradeId"></param>
        /// <returns></returns>
        public TradeDetailsRepresentation GetTradeDetails(string traderId, string tradeId)
        {
            TradeReadModel model     = _tradeRepository.GetByIdAndTraderId(traderId, tradeId);
            OrderReadModel buyOrder  = _orderRepository.GetOrderById(model.BuyOrderId);
            OrderReadModel sellOrder = _orderRepository.GetOrderById(model.SellOrderId);

            if (buyOrder.TraderId == traderId && sellOrder.TraderId == traderId)
            {
                OrderReadModel fillingOrder = buyOrder.DateTime > sellOrder.DateTime ? buyOrder : sellOrder;
                return(new TradeDetailsRepresentation(fillingOrder, model.ExecutionDateTime, model.Price, model.Volume, model.TradeId));
            }
            if (buyOrder.TraderId == traderId)
            {
                return(new TradeDetailsRepresentation(buyOrder, model.ExecutionDateTime, model.Price, model.Volume, model.TradeId));
            }
            return(new TradeDetailsRepresentation(sellOrder, model.ExecutionDateTime, model.Price, model.Volume, model.TradeId));
        }
        public void Handle(OrderPlacedEvent @event, DatabaseContext db)
        {
            var order         = @event.Order;
            var orderItemJson = order.OrderItems?.Any() ?? true?JsonConvert.SerializeObject(order.OrderItems) :
                                    string.Empty;

            var orderStatus = (int)order.OrderStatus;

            var orderReadModel = new OrderReadModel(order.Id,
                                                    orderStatus,
                                                    order.TotalAmount,
                                                    order.BoothId,
                                                    orderItemJson);

            db.Set <OrderReadModel>()
            .Add(orderReadModel);
        }
Exemple #20
0
        static void Main(string[] args)
        {
            Menu menu = new Menu();
            Bus  bus  = new Bus();

            Manager manager      = new Manager();
            var     managerQueue = new QueuedHandler <OrderCompleted>(manager, "Manager Queue");

            cashier = new Cashier(bus);
            var cashierQueue = new QueuedHandler <PayForOrder>(cashier, "Cashier Queue");

            AssistantManager assistantManager = new AssistantManager(bus);
            var assistantManagerQueue         = new QueuedHandler <PriceOrder>(assistantManager, "Assistant Manager Queue");

            Cook cook1      = new Cook(bus, 200);
            var  cook1Queue = new QueuedHandler <CookOrder>(cook1, "Cook Queue1");

            Cook cook2      = new Cook(bus, 400);
            var  cook2Queue = new QueuedHandler <CookOrder>(cook2, "Cook Queue2");

            Cook cook3      = new Cook(bus, 600);
            var  cook3Queue = new QueuedHandler <CookOrder>(cook3, "Cook Queue3");

            EvilActor evilActor = new EvilActor(bus);

            var cookdispatcher = new QueueDispatcher <CookOrder>(new List <QueuedHandler <CookOrder> > {
                cook1Queue, cook2Queue, cook3Queue
            });
            //var dropper = new MessageDropper<CookOrder>(cookdispatcher);
            //var ttlh = new TimeToLiveHandler<CookOrder>(dropper);
            var cookDispatcherQueue = new QueuedHandler <CookOrder>(cookdispatcher, "Cook Dispatcher");

            UkRestaurantProcessManagerPool processManagerPool = new UkRestaurantProcessManagerPool(bus);

            bus.Subscribe(processManagerPool);

            AlarmClock <OrderPlaced> orderPlacedReminder = new AlarmClock <OrderPlaced>(bus);
            AlarmClock <CookOrder>   cookReminder        = new AlarmClock <CookOrder>(bus);

            Waiter waiter = new Waiter(bus, menu);

            var orderReadModel = new OrderReadModel();

            bus.Subscribe(orderPlacedReminder);
            bus.Subscribe(cookReminder);
            bus.Subscribe(cookDispatcherQueue);
            bus.Subscribe(assistantManagerQueue);
            bus.Subscribe(cashierQueue);
            bus.Subscribe(managerQueue);
            //bus.Subscribe(evilActor);
            bus.Subscribe <HumanInterventionRequired>(manager);

            List <IStartable> startable = new List <IStartable> {
                managerQueue, cashierQueue, assistantManagerQueue, cook1Queue, cook2Queue, cook3Queue, cookDispatcherQueue, orderReadModel
            };

            queues = new List <IMonitorableQueue>()
            {
                managerQueue, cashierQueue, assistantManagerQueue, cook1Queue, cook2Queue, cook3Queue, cookDispatcherQueue
            };
            startable.ForEach(s => s.Start());

            //Thread monitor = new Thread(Printout) { IsBackground = true };
            KeepOnMonitoring = true;
            //monitor.Start();

            Stopwatch sw = new Stopwatch();

            sw.Start();

            bus.SubscribeToAll <OrderPlaced>(orderReadModel);
            bus.SubscribeToAll <OrderCooked>(orderReadModel);
            bus.SubscribeToAll <OrderPriced>(orderReadModel);
            bus.SubscribeToAll <OrderPaid>(orderReadModel);
            bus.SubscribeToAll <OrderCompleted>(orderReadModel);

            for (int i = 0; i <= 20; i++)
            {
                Customer cust = new Customer(bus, waiter, cashier);
                cust.PlaceOrder();
            }

            Console.ReadLine();
            KeepOnMonitoring = false;

            sw.Stop();
            Console.WriteLine("Completed in {0} milliseconds", sw.ElapsedMilliseconds);
            Console.WriteLine("Paid Orders: {0}, Completed Orders: {1}, Total: {2}", paidOrders, manager.Count, manager.Total);

            Console.ReadLine();
        }