Files
elink-test-master/src/main/resources/static/js/APIScenarioExecutor.js
T
2024-01-08 10:20:58 +09:00

124 lines
4.4 KiB
JavaScript

class APIScenarioExecutor {
constructor(graph, apiTester) {
this.graph = graph; // The graph data
this.currentNodeId = this.findStartNodeId(); // Initialize at the 'start' node
this.apiClient = new APIClient();
this.apiTester = apiTester;
this.visitedNodes = new Set(); // Keep track of visited nodes
}
// Helper method to find the start node ID
findStartNodeId() {
for (let nodeId in this.graph) {
if (this.graph[nodeId].class === 'start') {
return nodeId;
}
}
return null; // Return null if no start node is found
}
// Method to execute the current node's API request if it's an 'api' node
executeCurrentNode() {
console.log(this.currentNodeId)
if (!this.currentNodeId) {
console.log('No current node to execute.');
return;
}
const currentNode = this.graph[this.currentNodeId];
if (currentNode && currentNode.class === 'api') {
// get API model with currentNode.id
let model = this.apiTester.getApiRequestModel(currentNode.id);
this.apiClient.sendAPIRequest(model)
.then(response => {
console.log(response);
})
.catch(error => {
console.log(error.name)
if (error.name === 'AbortError') {
console.log('Fetch aborted');
} else {
console.log('error3')
}
});
console.log(`Executing API request for node: ${currentNode.id} - ${currentNode.name}`);
} else {
console.log('Current node is not an API node or does not exist.');
}
this.visitedNodes.add(this.currentNodeId); // Mark this node as visited
}
// Method to move to the next node
moveToNextNode() {
const currentNode = this.graph[this.currentNodeId];
console.log(currentNode);
if (currentNode && currentNode.connections.length > 0) {
// Find the next unvisited node
const nextNode = currentNode.connections.find(nodeId => !this.visitedNodes.has(nodeId));
if (nextNode) {
this.currentNodeId = nextNode;
console.log(`Moved to node: ${this.currentNodeId}`);
} else {
console.log('No more unvisited connections to move to.');
this.currentNodeId = null; // No more nodes to visit
}
} else {
console.log('Current node has no connections or does not exist.');
this.currentNodeId = null; // No more nodes to visit
}
}
// Method to execute the entire scenario from start to end
executeAll() {
while (this.currentNodeId) {
console.log(this.currentNodeId)
this.executeCurrentNode();
this.moveToNextNode();
}
console.log('Completed execution of all API nodes.');
}
static extractGraphFromStart(homeData) {
console.log(homeData)
let graph = {};
// Helper function to recursively build the graph
function buildGraph(nodeId) {
const node = homeData[nodeId];
if (!node || graph[nodeId]) {
// If the node doesn't exist or has already been visited, stop the recursion
return;
}
// Initialize the node in the graph
graph[nodeId] = {
id: node.id,
name: node.name,
class: node.class,
connections: []
};
// If the node has outputs, recursively add connected nodes
if (node.outputs) {
Object.values(node.outputs).forEach(output => {
output.connections.forEach(connection => {
graph[nodeId].connections.push(connection.node);
buildGraph(connection.node); // Recurse
});
});
}
}
// Find the start node
for (let nodeId in homeData) {
if (homeData[nodeId].class === 'start') {
buildGraph(nodeId); // Start building the graph from the 'start' node
break; // Assuming there's only one start node
}
}
return graph;
}
}