public async void TestAddFirstTerminalEquipmentInFP2Rack1() { var sutRouteNetworkElement = TestRouteNetwork.FP_2; var sutNodeContainer = TestUtilityNetwork.NodeContainer_FP_2; var utilityNetwork = _eventStore.Projections.Get <UtilityNetworkProjection>(); utilityNetwork.TryGetEquipment <NodeContainer>(sutNodeContainer, out var nodeContainerBeforeCommand); // Act var placeEquipmentCmd = new PlaceTerminalEquipmentInNodeContainer( correlationId: Guid.NewGuid(), userContext: new UserContext("test", Guid.Empty), nodeContainerId: sutNodeContainer, terminalEquipmentSpecificationId: TestSpecifications.Subrack_GPS_144_LC, numberOfEquipments: 3, startSequenceNumber: 1, namingMethod: TerminalEquipmentNamingMethodEnum.NameAndNumber, namingInfo: new Events.Core.Infos.NamingInfo() { Name = "GPS" } ) { SubrackPlacementInfo = new SubrackPlacementInfo(nodeContainerBeforeCommand.Racks[0].Id, 2, SubrackPlacmentMethod.TopDown) }; var placeEquipmentResult = await _commandDispatcher.HandleAsync <PlaceTerminalEquipmentInNodeContainer, Result>(placeEquipmentCmd); // Assert placeEquipmentResult.IsSuccess.Should().BeTrue(); var getDiagramQueryResult = await _queryDispatcher.HandleAsync <GetDiagram, Result <GetDiagramResult> >(new GetDiagram(sutRouteNetworkElement)); var diagram = getDiagramQueryResult.Value.Diagram; if (System.Environment.OSVersion.Platform.ToString() == "Win32NT") { new GeoJsonExporter(diagram).Export("c:/temp/diagram/test.geojson"); } // Assert getDiagramQueryResult.IsSuccess.Should().BeTrue(); diagram.DiagramObjects.Count(o => o.Style == "TerminalEquipment").Should().Be(4); diagram.DiagramObjects.Count(o => o.Style == "TerminalEquipmentNameLabel").Should().Be(4); diagram.DiagramObjects.Count(o => o.Style == "TerminalEquipmentTypeLabel").Should().Be(4); }
private Result PlaceTerminalEquipment(NpgsqlCommand logCmd, TerminalEquipmentForConversion terminalEquipment, Guid specId, RelatedEquipmentInfo relatedInfo) { Guid correlationId = Guid.NewGuid(); var commandUserContext = new UserContext("conversion", _workTaskId) { EditingRouteNodeId = terminalEquipment.NodeId }; // Check if node container already exists if (relatedInfo.NodeContainer == null) { if (_utilityNetwork.TryGetEquipment <NodeContainer>(relatedInfo.NodeContainer.Id, out var existingNodeContainer)) { System.Diagnostics.Debug.WriteLine($"No container exists in node: {terminalEquipment.NodeId}"); return(Result.Fail(new Error($"No container exists in node: {terminalEquipment.NodeId}"))); } } var terminalEquipmentSpecificationId = GetTerminalEquipmentSpecificationIdFromName(terminalEquipment.Specification); if (terminalEquipmentSpecificationId == null) { return(Result.Fail(new Error($"Cannot find terminal equipment specfication: {terminalEquipment.Specification}"))); } // Stand-alone splice equipment in node if (terminalEquipment.RackId == Guid.Empty) { var placeEqCmd = new PlaceTerminalEquipmentInNodeContainer( correlationId: Guid.NewGuid(), userContext: commandUserContext, nodeContainerId: relatedInfo.NodeContainer.Id, terminalEquipmentId: terminalEquipment.TerminalEquipmentId, terminalEquipmentSpecificationId: terminalEquipmentSpecificationId.Value, numberOfEquipments: 1, startSequenceNumber: 1, namingMethod: TerminalEquipmentNamingMethodEnum.NameOnly, namingInfo: new NamingInfo(terminalEquipment.Name, null) ) { AddressInfo = terminalEquipment.AccessAddressId == null ? null : new AddressInfo(terminalEquipment.AccessAddressId, terminalEquipment.UnitAddressId, null) }; var placeEqResult = _commandDispatcher.HandleAsync <PlaceTerminalEquipmentInNodeContainer, Result>(placeEqCmd).Result; LogStatus((NpgsqlCommand)logCmd, _terminalEquipmentTableName, "external_id", terminalEquipment.ExternalId, placeEqResult); return(placeEqResult); } else { // Rack equipment var placeEqCmd = new PlaceTerminalEquipmentInNodeContainer( correlationId: Guid.NewGuid(), userContext: commandUserContext, nodeContainerId: relatedInfo.NodeContainer.Id, terminalEquipmentId: terminalEquipment.TerminalEquipmentId, terminalEquipmentSpecificationId: terminalEquipmentSpecificationId.Value, numberOfEquipments: 1, startSequenceNumber: 80 - terminalEquipment.RackPosition, namingMethod: TerminalEquipmentNamingMethodEnum.NumberOnly, namingInfo: null ) { SubrackPlacementInfo = new SubrackPlacementInfo(terminalEquipment.RackId, terminalEquipment.RackPosition, SubrackPlacmentMethod.BottomUp) }; var placeEqResult = _commandDispatcher.HandleAsync <PlaceTerminalEquipmentInNodeContainer, Result>(placeEqCmd).Result; LogStatus((NpgsqlCommand)logCmd, _terminalEquipmentTableName, "external_id", terminalEquipment.ExternalId, placeEqResult); return(placeEqResult); } }
public NodeContainerMutations(ICommandDispatcher commandDispatcher, IQueryDispatcher queryDispatcher, IEventStore eventStore) { Description = "Node container mutations"; FieldAsync <CommandResultType>( "placeNodeContainerInRouteNetwork", description: "Place a node container (i.e. conduit closure, well, cabinet whatwever) in a route network node", arguments: new QueryArguments( new QueryArgument <NonNullGraphType <IdGraphType> > { Name = "routeNodeId" }, new QueryArgument <NonNullGraphType <IdGraphType> > { Name = "nodeContainerId" }, new QueryArgument <NonNullGraphType <IdGraphType> > { Name = "nodeContainerSpecificationId" }, new QueryArgument <IdGraphType> { Name = "manufacturerId" } ), resolve: async context => { var routeNodeId = context.GetArgument <Guid>("routeNodeId"); var nodeContainerId = context.GetArgument <Guid>("nodeContainerId"); var nodeContainerSpecificationId = context.GetArgument <Guid>("nodeContainerSpecificationId"); var manufacturerId = context.GetArgument <Guid>("manufacturerId"); var userContext = context.UserContext as GraphQLUserContext; var userName = userContext.Username; Guid correlationId = Guid.NewGuid(); // TODO: Get from work manager var workTaskId = Guid.Parse("54800ae5-13a5-4b03-8626-a63b66a25568"); var commandUserContext = new UserContext(userName, workTaskId) { EditingRouteNodeId = routeNodeId }; // First register the walk in the route network where the client want to place the node container var nodeOfInterestId = Guid.NewGuid(); var walk = new RouteNetworkElementIdList(); var registerNodeOfInterestCommand = new RegisterNodeOfInterest(correlationId, commandUserContext, nodeOfInterestId, routeNodeId); var registerNodeOfInterestCommandResult = await commandDispatcher.HandleAsync <RegisterNodeOfInterest, Result <RouteNetworkInterest> >(registerNodeOfInterestCommand); if (registerNodeOfInterestCommandResult.IsFailed) { return(new CommandResult(registerNodeOfInterestCommandResult)); } // Now place the conduit in the walk var placeNodeContainerCommand = new PlaceNodeContainerInRouteNetwork(correlationId, commandUserContext, nodeContainerId, nodeContainerSpecificationId, registerNodeOfInterestCommandResult.Value) { ManufacturerId = manufacturerId, LifecycleInfo = new LifecycleInfo(DeploymentStateEnum.InService, null, null) }; var placeNodeContainerResult = await commandDispatcher.HandleAsync <PlaceNodeContainerInRouteNetwork, Result>(placeNodeContainerCommand); // Unregister interest if place node container failed if (placeNodeContainerResult.IsFailed) { var unregisterCommandResult = await commandDispatcher.HandleAsync <UnregisterInterest, Result>(new UnregisterInterest(correlationId, commandUserContext, nodeOfInterestId)); if (unregisterCommandResult.IsFailed) { return(new CommandResult(unregisterCommandResult)); } } return(new CommandResult(placeNodeContainerResult)); } ); FieldAsync <CommandResultType>( "reverseVerticalContentAlignment", description: "Toggle whether the content in the node container should be drawed from bottom up or top down", arguments: new QueryArguments( new QueryArgument <NonNullGraphType <IdGraphType> > { Name = "nodeContainerId" } ), resolve: async context => { var userContext = context.UserContext as GraphQLUserContext; var userName = userContext.Username; Guid correlationId = Guid.NewGuid(); // TODO: Get from work manager var workTaskId = Guid.Parse("54800ae5-13a5-4b03-8626-a63b66a25568"); var commandUserContext = new UserContext(userName, workTaskId); var nodeContainerId = context.GetArgument <Guid>("nodeContainerId"); var reverseAlignmentCmd = new ReverseNodeContainerVerticalContentAlignment(correlationId, commandUserContext, nodeContainerId); var reverseAlignmentCmdResult = await commandDispatcher.HandleAsync <ReverseNodeContainerVerticalContentAlignment, Result>(reverseAlignmentCmd); return(new CommandResult(reverseAlignmentCmdResult)); } ); FieldAsync <CommandResultType>( "updateProperties", description: "Mutation that can be used to change the node container specification and/or manufacturer", arguments: new QueryArguments( new QueryArgument <NonNullGraphType <IdGraphType> > { Name = "nodeContainerId" }, new QueryArgument <IdGraphType> { Name = "specificationId" }, new QueryArgument <IdGraphType> { Name = "manufacturerId" } ), resolve: async context => { var nodeContainerId = context.GetArgument <Guid>("nodeContainerId"); var correlationId = Guid.NewGuid(); var userContext = context.UserContext as GraphQLUserContext; var userName = userContext.Username; // TODO: Get from work manager var workTaskId = Guid.Parse("54800ae5-13a5-4b03-8626-a63b66a25568"); var commandUserContext = new UserContext(userName, workTaskId); var updateCmd = new UpdateNodeContainerProperties(correlationId, commandUserContext, nodeContainerId) { SpecificationId = context.HasArgument("specificationId") ? context.GetArgument <Guid>("specificationId") : null, ManufacturerId = context.HasArgument("manufacturerId") ? context.GetArgument <Guid>("manufacturerId") : null, }; var updateResult = await commandDispatcher.HandleAsync <UpdateNodeContainerProperties, Result>(updateCmd); return(new CommandResult(updateResult)); } ); FieldAsync <CommandResultType>( "remove", description: "Remove node container from the route network node", arguments: new QueryArguments( new QueryArgument <NonNullGraphType <IdGraphType> > { Name = "nodeContainerId" } ), resolve: async context => { var nodeContainerId = context.GetArgument <Guid>("nodeContainerId"); var correlationId = Guid.NewGuid(); var userContext = context.UserContext as GraphQLUserContext; var userName = userContext.Username; // TODO: Get from work manager var workTaskId = Guid.Parse("54800ae5-13a5-4b03-8626-a63b66a25568"); var commandUserContext = new UserContext(userName, workTaskId); var removeNodeContainer = new RemoveNodeContainerFromRouteNetwork( correlationId: correlationId, userContext: commandUserContext, nodeContainerId: nodeContainerId ); var removeResult = await commandDispatcher.HandleAsync <RemoveNodeContainerFromRouteNetwork, Result>(removeNodeContainer); return(new CommandResult(removeResult)); } ); FieldAsync <CommandResultType>( "placeRackInNodeContainer", description: "Place a rack in the node container", arguments: new QueryArguments( new QueryArgument <NonNullGraphType <IdGraphType> > { Name = "nodeContainerId" }, new QueryArgument <NonNullGraphType <IdGraphType> > { Name = "rackId" }, new QueryArgument <NonNullGraphType <IdGraphType> > { Name = "rackSpecificationId" }, new QueryArgument <NonNullGraphType <StringGraphType> > { Name = "rackName" }, new QueryArgument <NonNullGraphType <IntGraphType> > { Name = "rackHeightInUnits" } ), resolve: async context => { var nodeContainerId = context.GetArgument <Guid>("nodeContainerId"); var rackId = context.GetArgument <Guid>("rackId"); var rackSpecificationId = context.GetArgument <Guid>("rackSpecificationId"); var rackName = context.GetArgument <string>("rackName"); var rackHeightInUnits = context.GetArgument <int>("rackHeightInUnits"); var correlationId = Guid.NewGuid(); var userContext = context.UserContext as GraphQLUserContext; var userName = userContext.Username; // TODO: Get from work manager var workTaskId = Guid.Parse("54800ae5-13a5-4b03-8626-a63b66a25568"); var commandUserContext = new UserContext(userName, workTaskId); var placeRackInNodeContainer = new PlaceRackInNodeContainer( correlationId: correlationId, userContext: commandUserContext, nodeContainerId: nodeContainerId, rackSpecificationId: rackSpecificationId, rackId: Guid.NewGuid(), rackName: rackName, rackHeightInUnits: rackHeightInUnits ); var removeResult = await commandDispatcher.HandleAsync <PlaceRackInNodeContainer, Result>(placeRackInNodeContainer); return(new CommandResult(removeResult)); } ); FieldAsync <CommandResultType>( "placeTerminalEquipmentInNodeContainer", description: "Place a terminal directly in a node container or in a node container rack", arguments: new QueryArguments( new QueryArgument <NonNullGraphType <IdGraphType> > { Name = "routeNodeId" }, new QueryArgument <NonNullGraphType <IdGraphType> > { Name = "terminalEquipmentSpecificationId" }, new QueryArgument <IdGraphType> { Name = "manufacturerId" }, new QueryArgument <NonNullGraphType <IntGraphType> > { Name = "numberOfEquipments" }, new QueryArgument <NonNullGraphType <IntGraphType> > { Name = "startSequenceNumber" }, new QueryArgument <NonNullGraphType <TerminalEquipmentNamingMethodEnumType> > { Name = "terminalEquipmentNamingMethod" }, new QueryArgument <NamingInfoInputType> { Name = "namingInfo" }, new QueryArgument <SubrackPlacementInfoInputType> { Name = "subrackPlacementInfo" }, new QueryArgument <AddressInfoInputType> { Name = "addressInfo" } ), resolve: async context => { var routeNodeId = context.GetArgument <Guid>("routeNodeId"); var terminalEquipmentSpecificationId = context.GetArgument <Guid>("terminalEquipmentSpecificationId"); var manufacturerId = context.GetArgument <Guid?>("manufacturerId"); var numberOfEquipments = context.GetArgument <int>("numberOfEquipments"); var startSequenceNumber = context.GetArgument <int>("startSequenceNumber"); var terminalEquipmentNamingMethod = context.GetArgument <TerminalEquipmentNamingMethodEnum>("terminalEquipmentNamingMethod"); var namingInfo = context.GetArgument <NamingInfo>("namingInfo"); var subrackPlacementInfo = context.GetArgument <SubrackPlacementInfo>("subrackPlacementInfo"); var addressInfo = context.GetArgument <AddressInfo>("addressInfo"); var getNodeContainerResult = QueryHelper.GetNodeContainerFromRouteNodeId(queryDispatcher, routeNodeId); if (getNodeContainerResult.IsFailed) { foreach (var error in getNodeContainerResult.Errors) { context.Errors.Add(new ExecutionError(error.Message)); } return(null); } var nodeContainer = getNodeContainerResult.Value; var correlationId = Guid.NewGuid(); var userContext = context.UserContext as GraphQLUserContext; var userName = userContext.Username; // TODO: Get from work manager var workTaskId = Guid.Parse("54800ae5-13a5-4b03-8626-a63b66a25568"); var commandUserContext = new UserContext(userName, workTaskId); var placeEquipmentInNodeContainer = new PlaceTerminalEquipmentInNodeContainer( correlationId: correlationId, userContext: commandUserContext, nodeContainerId: nodeContainer.Id, terminalEquipmentSpecificationId: terminalEquipmentSpecificationId, terminalEquipmentId: Guid.NewGuid(), numberOfEquipments: numberOfEquipments, startSequenceNumber: startSequenceNumber, namingMethod: terminalEquipmentNamingMethod, namingInfo: namingInfo ) { AddressInfo = addressInfo, SubrackPlacementInfo = subrackPlacementInfo, ManufacturerId = manufacturerId }; var removeResult = await commandDispatcher.HandleAsync <PlaceTerminalEquipmentInNodeContainer, Result>(placeEquipmentInNodeContainer); return(new CommandResult(removeResult)); } ); }