private RouteNetworkEditOperationOccuredEvent CreateEditOperationOccuredEvent(object updateMessage)
        {
            Guid?  workTaskMrid = null;
            string username     = null;

            if (updateMessage is RouteSegmentMessage)
            {
                workTaskMrid = ((RouteSegmentMessage)updateMessage).After.WorkTaskMrid;
                username     = ((RouteSegmentMessage)updateMessage).After.Username;
            }
            if (updateMessage is RouteNodeMessage)
            {
                workTaskMrid = ((RouteNodeMessage)updateMessage).After.WorkTaskMrid;
                username     = ((RouteNodeMessage)updateMessage).After.Username;
            }

            var editOperationOccuredEvent = new RouteNetworkEditOperationOccuredEvent(
                nameof(RouteNetworkEditOperationOccuredEvent),
                Guid.NewGuid(),
                DateTime.UtcNow,
                workTaskMrid,
                username,
                _applicationSettings.ApplicationName,
                String.Empty,
                _eventStore.Get().ToArray());

            return(editOperationOccuredEvent);
        }
        public void HandleEvent(RouteNetworkEditOperationOccuredEvent request)
        {
            _logger.LogDebug("Got route network edit opreation occured message:");
            _logger.LogDebug(JsonConvert.SerializeObject(request, Formatting.Indented));

            var trans = _networkState.GetTransaction();

            if (request.RouteNetworkCommands != null)
            {
                foreach (var command in request.RouteNetworkCommands)
                {
                    if (command.RouteNetworkEvents != null)
                    {
                        foreach (var routeNetworkEvent in command.RouteNetworkEvents)
                        {
                            switch (routeNetworkEvent)
                            {
                            case RouteNodeAdded domainEvent:
                                HandleEvent(domainEvent, trans);
                                break;

                            case RouteNodeMarkedForDeletion domainEvent:
                                HandleEvent(domainEvent, trans);
                                break;

                            case RouteSegmentAdded domainEvent:
                                HandleEvent(domainEvent, trans);
                                break;

                            case RouteSegmentMarkedForDeletion domainEvent:
                                HandleEvent(domainEvent, trans);
                                break;

                            case RouteSegmentRemoved domainEvent:
                                HandleEvent(domainEvent, trans);
                                break;
                            }
                        }
                    }
                }
            }

            _networkState.FinishWithTransaction();
        }
        private bool IsOperationEditEventValid(RouteNetworkEditOperationOccuredEvent operationOccuredEvent)
        {
            var existingSplittedCmds = operationOccuredEvent.RouteNetworkCommands
                                       .Where(x => x.CmdType == nameof(ExistingRouteSegmentSplitted));

            if (existingSplittedCmds.Count() > 0)
            {
                foreach (var splittedCmd in existingSplittedCmds)
                {
                    var removedEvents = splittedCmd.RouteNetworkEvents
                                        .Where(x => x.EventType == nameof(Events.RouteNetwork.RouteSegmentRemoved));
                    var routeSegmentAdded = splittedCmd.RouteNetworkEvents
                                            .Where(x => x.EventType == nameof(Events.RouteNetwork.RouteSegmentAdded));

                    if (removedEvents.Count() != 1 || routeSegmentAdded.Count() != 2)
                    {
                        return(false);
                    }
                }
            }

            return(true);
        }