162 lines
5.6 KiB
TypeScript
162 lines
5.6 KiB
TypeScript
/**
|
|
* RESTful API endpoints handling currently generated workflow management.
|
|
*/
|
|
|
|
import { Router } from 'express';
|
|
import logger from "../logger";
|
|
import { browserPool } from "../server";
|
|
import { readFile } from "../workflow-management/storage";
|
|
import { requireSignIn } from '../middlewares/auth';
|
|
import Robot from '../models/Robot';
|
|
|
|
export const router = Router();
|
|
|
|
/**
|
|
* Logs information about workflow API.
|
|
*/
|
|
router.all('/', requireSignIn, (req, res, next) => {
|
|
logger.log('debug', `The workflow API was invoked: ${req.url}`)
|
|
next() // pass control to the next handler
|
|
})
|
|
|
|
/**
|
|
* GET endpoint for a recording linked to a remote browser instance.
|
|
* returns session's id
|
|
*/
|
|
router.get('/:browserId', requireSignIn, (req, res) => {
|
|
const activeBrowser = browserPool.getRemoteBrowser(req.params.browserId);
|
|
let workflowFile = null;
|
|
if (activeBrowser && activeBrowser.generator) {
|
|
workflowFile = activeBrowser.generator.getWorkflowFile();
|
|
}
|
|
return res.send(workflowFile);
|
|
});
|
|
|
|
/**
|
|
* Get endpoint returning the parameter array of the recording associated with the browserId browser instance.
|
|
*/
|
|
router.get('/params/:browserId', requireSignIn, (req, res) => {
|
|
const activeBrowser = browserPool.getRemoteBrowser(req.params.browserId);
|
|
let params = null;
|
|
if (activeBrowser && activeBrowser.generator) {
|
|
params = activeBrowser.generator.getParams();
|
|
}
|
|
return res.send(params);
|
|
});
|
|
|
|
/**
|
|
* DELETE endpoint for deleting a pair from the generated workflow.
|
|
*/
|
|
router.delete('/pair/:index', requireSignIn, (req, res) => {
|
|
const id = browserPool.getActiveBrowserId();
|
|
if (id) {
|
|
const browser = browserPool.getRemoteBrowser(id);
|
|
if (browser) {
|
|
browser.generator?.removePairFromWorkflow(parseInt(req.params.index));
|
|
const workflowFile = browser.generator?.getWorkflowFile();
|
|
return res.send(workflowFile);
|
|
}
|
|
}
|
|
return res.send(null);
|
|
});
|
|
|
|
/**
|
|
* POST endpoint for adding a pair to the generated workflow.
|
|
*/
|
|
router.post('/pair/:index', requireSignIn, (req, res) => {
|
|
const id = browserPool.getActiveBrowserId();
|
|
if (id) {
|
|
const browser = browserPool.getRemoteBrowser(id);
|
|
logger.log('debug', `Adding pair to workflow`);
|
|
if (browser) {
|
|
logger.log('debug', `Adding pair to workflow: ${JSON.stringify(req.body)}`);
|
|
if (req.body.pair) {
|
|
browser.generator?.addPairToWorkflow(parseInt(req.params.index), req.body.pair);
|
|
const workflowFile = browser.generator?.getWorkflowFile();
|
|
return res.send(workflowFile);
|
|
}
|
|
}
|
|
}
|
|
return res.send(null);
|
|
});
|
|
|
|
/**
|
|
* PUT endpoint for updating a pair in the generated workflow.
|
|
*/
|
|
router.put('/pair/:index', requireSignIn, (req, res) => {
|
|
const id = browserPool.getActiveBrowserId();
|
|
if (id) {
|
|
const browser = browserPool.getRemoteBrowser(id);
|
|
logger.log('debug', `Updating pair in workflow`);
|
|
if (browser) {
|
|
logger.log('debug', `New value: ${JSON.stringify(req.body)}`);
|
|
if (req.body.pair) {
|
|
browser.generator?.updatePairInWorkflow(parseInt(req.params.index), req.body.pair);
|
|
const workflowFile = browser.generator?.getWorkflowFile();
|
|
return res.send(workflowFile);
|
|
}
|
|
}
|
|
}
|
|
return res.send(null);
|
|
});
|
|
|
|
/**
|
|
* PUT endpoint for updating the currently generated workflow file from the one in the storage.
|
|
*/
|
|
// router.put('/:browserId/:fileName', requireSignIn, async (req, res) => {
|
|
// try {
|
|
// const browser = browserPool.getRemoteBrowser(req.params.browserId);
|
|
// logger.log('debug', `Updating workflow file`);
|
|
// if (browser && browser.generator) {
|
|
// const recording = await readFile(`./../storage/recordings/${req.params.fileName}.json`)
|
|
// const parsedRecording = JSON.parse(recording);
|
|
// if (parsedRecording.recording) {
|
|
// browser.generator?.updateWorkflowFile(parsedRecording.recording, parsedRecording.recording_meta);
|
|
// const workflowFile = browser.generator?.getWorkflowFile();
|
|
// return res.send(workflowFile);
|
|
// }
|
|
// }
|
|
// return res.send(null);
|
|
// } catch (e) {
|
|
// const { message } = e as Error;
|
|
// logger.log('info', `Error while reading a recording with name: ${req.params.fileName}.json`);
|
|
// return res.send(null);
|
|
// }
|
|
// });
|
|
|
|
|
|
router.put('/:browserId/:robotId', requireSignIn, async (req, res) => {
|
|
try {
|
|
const browser = browserPool.getRemoteBrowser(req.params.browserId);
|
|
logger.log('debug', `Updating workflow for Robot ID: ${req.params.robotId}`);
|
|
|
|
if (browser && browser.generator) {
|
|
const robot = await Robot.findByPk(req.params.robotId);
|
|
|
|
if (!robot) {
|
|
logger.log('info', `Robot not found with ID: ${req.params.robotId}`);
|
|
return res.status(404).send({ error: 'Robot not found' });
|
|
}
|
|
|
|
const { recording, recording_meta } = robot;
|
|
|
|
if (recording && recording.workflow) {
|
|
browser.generator.updateWorkflowFile(recording, recording_meta);
|
|
const workflowFile = browser.generator.getWorkflowFile();
|
|
return res.send(workflowFile);
|
|
} else {
|
|
logger.log('info', `Invalid recording data for Robot ID: ${req.params.robotId}`);
|
|
return res.status(400).send({ error: 'Invalid recording data' });
|
|
}
|
|
}
|
|
|
|
logger.log('info', `Browser or generator not available for ID: ${req.params.browserId}`);
|
|
return res.status(400).send({ error: 'Browser or generator not available' });
|
|
} catch (e) {
|
|
const { message } = e as Error;
|
|
logger.log('error', `Error while updating workflow for Robot ID: ${req.params.robotId}. Error: ${message}`);
|
|
return res.status(500).send({ error: 'Internal server error' });
|
|
}
|
|
});
|
|
|
|
export default router; |