Files
parcer/server/src/routes/workflow.ts
2024-10-06 04:12:42 +05:30

125 lines
4.1 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';
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}.waw.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}.waw.json`);
return res.send(null);
}
});