feat: add route for robot duplication
This commit is contained in:
@@ -145,6 +145,80 @@ router.put('/recordings/:id', requireSignIn, async (req: AuthenticatedRequest, r
|
||||
});
|
||||
|
||||
|
||||
/**
|
||||
* POST endpoint to duplicate a robot and update its target URL.
|
||||
*/
|
||||
router.post('/recordings/:id/duplicate', requireSignIn, async (req: AuthenticatedRequest, res) => {
|
||||
try {
|
||||
const { id } = req.params;
|
||||
const { targetUrl } = req.body;
|
||||
|
||||
if (!targetUrl) {
|
||||
return res.status(400).json({ error: 'The "targetUrl" field is required.' });
|
||||
}
|
||||
|
||||
const originalRobot = await Robot.findOne({ where: { 'recording_meta.id': id } });
|
||||
|
||||
if (!originalRobot) {
|
||||
return res.status(404).json({ error: 'Original robot not found.' });
|
||||
}
|
||||
|
||||
const lastWord = targetUrl.split('/').filter(Boolean).pop() || 'Unnamed';
|
||||
|
||||
const workflow = originalRobot.recording.workflow.map((step) => {
|
||||
if (step.where?.url && step.where.url !== "about:blank") {
|
||||
step.where.url = targetUrl;
|
||||
}
|
||||
|
||||
step.what.forEach((action) => {
|
||||
if (action.action === "goto" && action.args?.length) {
|
||||
action.args[0] = targetUrl;
|
||||
}
|
||||
});
|
||||
|
||||
return step;
|
||||
});
|
||||
|
||||
const currentTimestamp = new Date().toISOString();
|
||||
|
||||
const newRobot = await Robot.create({
|
||||
id: uuid(),
|
||||
userId: originalRobot.userId,
|
||||
recording_meta: {
|
||||
...originalRobot.recording_meta,
|
||||
id: uuid(),
|
||||
name: `${originalRobot.recording_meta.name} (${lastWord})`,
|
||||
createdAt: currentTimestamp,
|
||||
updatedAt: currentTimestamp,
|
||||
},
|
||||
recording: { ...originalRobot.recording, workflow },
|
||||
google_sheet_email: null,
|
||||
google_sheet_name: null,
|
||||
google_sheet_id: null,
|
||||
google_access_token: null,
|
||||
google_refresh_token: null,
|
||||
schedule: null,
|
||||
});
|
||||
|
||||
logger.log('info', `Robot with ID ${id} duplicated successfully as ${newRobot.id}.`);
|
||||
|
||||
return res.status(201).json({
|
||||
message: 'Robot duplicated and target URL updated successfully.',
|
||||
robot: newRobot,
|
||||
});
|
||||
} catch (error) {
|
||||
if (error instanceof Error) {
|
||||
logger.log('error', `Error duplicating robot with ID ${req.params.id}: ${error.message}`);
|
||||
return res.status(500).json({ error: error.message });
|
||||
} else {
|
||||
logger.log('error', `Unknown error duplicating robot with ID ${req.params.id}`);
|
||||
return res.status(500).json({ error: 'An unknown error occurred.' });
|
||||
}
|
||||
}
|
||||
});
|
||||
|
||||
|
||||
|
||||
|
||||
/**
|
||||
* DELETE endpoint for deleting a recording from the storage.
|
||||
|
||||
Reference in New Issue
Block a user