public async Task Handle(RouteSegmentLocationChanged request, CancellationToken token) { _logger.LogInformation($"Starting {nameof(RouteSegmentLocationChangedHandler)}"); var geometryModifiedEvent = _routeSegmentEventFactory.CreateGeometryModified(request.RouteSegment); var cmdId = Guid.NewGuid(); var locationChangedCommand = new RouteNetworkCommand(nameof(RouteSegmentLocationChanged), cmdId, new List <RouteNetworkEvent> { geometryModifiedEvent }.ToArray()); _eventStore.Insert(locationChangedCommand); await Task.CompletedTask; }
public async Task Handle(RouteNodeLocationChanged request, CancellationToken token) { _logger.LogInformation($"Starting {nameof(RouteNodeLocationChangedHandler)}"); var intersectingSegmentsBeforeChange = (await _geoDatabase.GetIntersectingRouteSegments(request.RouteNodeBefore.Coord)).ToList(); var routeSegmentsToBeUpdated = new List <RouteSegment>(); if (intersectingSegmentsBeforeChange.Count > 0) { var anySegmentIntersectRouteNode = false; foreach (var intersectingSegment in intersectingSegmentsBeforeChange) { var startNode = (await _geoDatabase.GetIntersectingStartRouteNodes(intersectingSegment)).FirstOrDefault(); if (startNode is null) { var lineString = intersectingSegment.GetLineString(); lineString.Coordinates[0] = new Coordinate(request.RouteNodeAfter.GetPoint().Coordinate); intersectingSegment.Coord = lineString.AsBinary(); } else { var lineString = intersectingSegment.GetLineString(); lineString.Coordinates[lineString.Coordinates.Count() - 1] = new Coordinate(request.RouteNodeAfter.GetPoint().Coordinate); intersectingSegment.Coord = lineString.AsBinary(); } anySegmentIntersectRouteNode = (await _geoDatabase.GetAllIntersectingRouteNodesNotIncludingEdges(intersectingSegment.Coord, intersectingSegment.Mrid)).Any(); if (anySegmentIntersectRouteNode) { break; } routeSegmentsToBeUpdated.Add(intersectingSegment); } // Rollback in case of segment intersecting with any route nodes if (anySegmentIntersectRouteNode) { throw new Exception("Route segments intersects with any route nodes"); } } var routeNetworkEvents = new List <RouteNetworkEvent>(); var routeNodeGeometryModifiedEvent = _routeNodeEventFactory.CreateGeometryModified(request.RouteNodeAfter); routeNetworkEvents.Add(routeNodeGeometryModifiedEvent); for (var i = 0; i < routeSegmentsToBeUpdated.Count; i++) { var routeSegmentToBeUpdated = routeSegmentsToBeUpdated[i]; await _geoDatabase.UpdateRouteSegment(routeSegmentToBeUpdated); var routeSegmentGeometryModifiedEvent = _routeSegmentEventFactory.CreateGeometryModified(routeSegmentToBeUpdated, true); routeNetworkEvents.Add(routeSegmentGeometryModifiedEvent); } var cmdId = Guid.NewGuid(); var routeNodeLocationChangedCommand = new RouteNetworkCommand(nameof(RouteNodeLocationChanged), cmdId, routeNetworkEvents.ToArray()); _eventStore.Insert(routeNodeLocationChangedCommand); }