diff --git a/server/model/monitor.js b/server/model/monitor.js index aa3339582..741284f1e 100644 --- a/server/model/monitor.js +++ b/server/model/monitor.js @@ -1661,25 +1661,24 @@ class Monitor extends BeanModel { } /** - * Gets recursive all child ids + * Gets recursive all children ids * @param {number} monitorID ID of the monitor to get - * @returns {Promise} IDs of all children + * @returns {Promise} IDs of all children */ static async getAllChildrenIDs(monitorID) { - const childs = await Monitor.getChildren(monitorID); - - if (childs === null) { - return []; - } - - let childrenIDs = []; - - for (const child of childs) { - childrenIDs.push(child.id); - childrenIDs = childrenIDs.concat(await Monitor.getAllChildrenIDs(child.id)); - } + const children = await R.getAll(` + WITH RECURSIVE MonitorHierarchy(id) AS ( + SELECT id FROM monitor WHERE id = ? + UNION ALL + SELECT m.id FROM monitor m INNER JOIN MonitorHierarchy mh ON m.parent = mh.id + ) + SELECT id FROM MonitorHierarchy WHERE id != ?; + `, [ + monitorID, + monitorID + ]); - return childrenIDs; + return children.map((child) => child.id); } /** diff --git a/server/server.js b/server/server.js index 178b58b71..dc28a5100 100644 --- a/server/server.js +++ b/server/server.js @@ -1752,51 +1752,20 @@ async function startMonitor(userID, monitorID) { userID, ]); - let monitor = await R.findOne("monitor", " id = ? ", [ - monitorID, - ]); - - if (monitor.id in server.monitorList) { - await server.monitorList[monitor.id].stop(); - } - - server.monitorList[monitor.id] = monitor; - await monitor.start(io); + const childrenIDs = await Monitor.getAllChildrenIDs(monitorID); + console.log(childrenIDs); + const monitorIDs = [ monitorID, ...childrenIDs ]; - const children = await Monitor.getChildren(monitorID); - for (let child of children) { - await startMonitorAsChild(userID, child.id); - } -} + let monitors = await R.find("monitor", ` id IN (${monitorIDs.map((_) => "?").join(",")})`, monitorIDs); -/** - * Start the specified monitor as child - * @param {number} userID ID of user who owns monitor - * @param {number} monitorID ID of monitor to start - * @returns {Promise} - */ -async function startMonitorAsChild(userID, monitorID) { - - let monitor = await R.findOne("monitor", " id = ? ", [ - monitorID, - ]); - if (monitor.active !== 1) { - return; - } - - log.info("manage", `Resume Monitor: ${monitorID} User ID: ${userID}`); - - if (monitor.id in server.monitorList) { - await server.monitorList[monitor.id].stop(); - } - - server.monitorList[monitor.id] = monitor; - await monitor.start(io); + await Promise.all(monitors.map(async (monitor) => { + if (monitor.id in server.monitorList) { + await server.monitorList[monitor.id].stop(); + } - const children = await Monitor.getChildren(monitorID); - for (let child of children) { - await startMonitorAsChild(userID, child.id); - } + server.monitorList[monitor.id] = monitor; + await monitor.start(io); + })); } /** @@ -1825,41 +1794,16 @@ async function pauseMonitor(userID, monitorID) { userID, ]); - if (monitorID in server.monitorList) { - await server.monitorList[monitorID].stop(); - server.monitorList[monitorID].active = 0; - } - - const children = await Monitor.getChildren(monitorID); - for (let child of children) { - await pauseMonitorAsChild(userID, child.id); - } -} - -/** - * Pause a given monitor as child - * @param {number} userID ID of user who owns monitor - * @param {number} monitorID ID of monitor to start - * @returns {Promise} - */ -async function pauseMonitorAsChild(userID, monitorID) { - let monitor = await R.findOne("monitor", " id = ? ", [ - monitorID, - ]); - if (monitor.active !== 1) { - return; - } - - log.info("manage", `Pause Monitor: ${monitorID} User ID: ${userID}`); + const childrenIDs = await Monitor.getAllChildrenIDs(monitorID); + const monitorIDs = [ monitorID, ...childrenIDs ]; - if (monitorID in server.monitorList) { - await server.monitorList[monitorID].stop(); - } + await Promise.all(monitorIDs.map(async (currentMonitorID) => { + if (currentMonitorID in server.monitorList) { + await server.monitorList[currentMonitorID].stop(); + } + })); - const children = await Monitor.getChildren(monitorID); - for (let child of children) { - await pauseMonitorAsChild(userID, child.id); - } + server.monitorList[monitorID].active = 0; } /**