diff --git a/Server/controllers/monitorController.js b/Server/controllers/monitorController.js index f65113cd7..eb3d93cd8 100644 --- a/Server/controllers/monitorController.js +++ b/Server/controllers/monitorController.js @@ -295,12 +295,45 @@ class MonitorController { try { const monitor = await this.db.deleteMonitor(req, res, next); // Delete associated checks,alerts,and notifications + try { - await this.jobQueue.deleteJob(monitor); - await this.db.deleteChecks(monitor._id); - await this.db.deletePageSpeedChecksByMonitorId(monitor._id); - await this.db.deleteNotificationsByMonitorId(monitor._id); - await this.db.deleteHardwareChecksByMonitorId(monitor._id); + const operations = [ + { name: "deleteJob", fn: () => this.jobQueue.deleteJob(monitor) }, + { name: "deleteChecks", fn: () => this.db.deleteChecks(monitor._id) }, + { + name: "deletePageSpeedChecks", + fn: () => this.db.deletePageSpeedChecksByMonitorId(monitor._id), + }, + { + name: "deleteNotifications", + fn: () => this.db.deleteNotificationsByMonitorId(monitor._id), + }, + { + name: "deleteHardwareChecks", + fn: () => this.db.deleteHardwareChecksByMonitorId(monitor._id), + }, + { + name: "deleteDistributedUptimeChecks", + fn: () => this.db.deleteDistributedChecksByMonitorId(monitor._id), + }, + { + name: "deleteStatusPages", + fn: () => this.db.deleteStatusPagesByMonitorId(monitor._id), + }, + ]; + const results = await Promise.allSettled(operations.map((op) => op.fn())); + + results.forEach((result, index) => { + if (result.status === "rejected") { + const operationName = operations[index].name; + logger.error({ + message: `Failed to ${operationName} for monitor ${monitor._id}`, + service: SERVICE_NAME, + method: "deleteMonitor", + stack: result.reason.stack, + }); + } + }); } catch (error) { logger.error({ message: `Error deleting associated records for monitor ${monitor._id} with name ${monitor.name}`, @@ -390,10 +423,10 @@ class MonitorController { await Promise.all( notifications && - notifications.map(async (notification) => { - notification.monitorId = editedMonitor._id; - await this.db.createNotification(notification); - }) + notifications.map(async (notification) => { + notification.monitorId = editedMonitor._id; + await this.db.createNotification(notification); + }) ); // Delete the old job(editedMonitor has the same ID as the old monitor) diff --git a/Server/db/mongo/modules/monitorModule.js b/Server/db/mongo/modules/monitorModule.js index e1db09f0a..14d883c23 100644 --- a/Server/db/mongo/modules/monitorModule.js +++ b/Server/db/mongo/modules/monitorModule.js @@ -313,7 +313,7 @@ const calculateGroupStats = (group) => { avgResponseTime: checksWithResponseTime.length > 0 ? checksWithResponseTime.reduce((sum, check) => sum + check.responseTime, 0) / - checksWithResponseTime.length + checksWithResponseTime.length : 0, }; }; @@ -372,7 +372,10 @@ const getUptimeDetailsById = async (req) => { const getDistributedUptimeDetailsById = async (req) => { try { - const { monitorId } = req.params; + const { monitorId } = req?.params ?? {}; + if (typeof monitorId === "undefined") { + throw new Error(); + } const monitor = await Monitor.findById(monitorId); if (monitor === null || monitor === undefined) { throw new Error(this.stringService.dbFindMonitorById(monitorId)); @@ -605,98 +608,98 @@ const getMonitorsByTeamId = async (req) => { filteredMonitors: [ ...(filter !== undefined ? [ - { - $match: { - $or: [ - { name: { $regex: filter, $options: "i" } }, - { url: { $regex: filter, $options: "i" } }, - ], + { + $match: { + $or: [ + { name: { $regex: filter, $options: "i" } }, + { url: { $regex: filter, $options: "i" } }, + ], + }, }, - }, - ] + ] : []), { $sort: sort }, { $skip: skip }, ...(rowsPerPage ? [{ $limit: rowsPerPage }] : []), ...(limit ? [ - { - $lookup: { - from: "checks", - let: { monitorId: "$_id" }, - pipeline: [ - { - $match: { - $expr: { $eq: ["$monitorId", "$$monitorId"] }, + { + $lookup: { + from: "checks", + let: { monitorId: "$_id" }, + pipeline: [ + { + $match: { + $expr: { $eq: ["$monitorId", "$$monitorId"] }, + }, }, - }, - { $sort: { createdAt: -1 } }, - ...(limit ? [{ $limit: limit }] : []), - ], - as: "standardchecks", + { $sort: { createdAt: -1 } }, + ...(limit ? [{ $limit: limit }] : []), + ], + as: "standardchecks", + }, }, - }, - ] + ] : []), ...(limit ? [ - { - $lookup: { - from: "pagespeedchecks", - let: { monitorId: "$_id" }, - pipeline: [ - { - $match: { - $expr: { $eq: ["$monitorId", "$$monitorId"] }, + { + $lookup: { + from: "pagespeedchecks", + let: { monitorId: "$_id" }, + pipeline: [ + { + $match: { + $expr: { $eq: ["$monitorId", "$$monitorId"] }, + }, }, - }, - { $sort: { createdAt: -1 } }, - ...(limit ? [{ $limit: limit }] : []), - ], - as: "pagespeedchecks", + { $sort: { createdAt: -1 } }, + ...(limit ? [{ $limit: limit }] : []), + ], + as: "pagespeedchecks", + }, }, - }, - ] + ] : []), ...(limit ? [ - { - $lookup: { - from: "hardwarechecks", - let: { monitorId: "$_id" }, - pipeline: [ - { - $match: { - $expr: { $eq: ["$monitorId", "$$monitorId"] }, + { + $lookup: { + from: "hardwarechecks", + let: { monitorId: "$_id" }, + pipeline: [ + { + $match: { + $expr: { $eq: ["$monitorId", "$$monitorId"] }, + }, }, - }, - { $sort: { createdAt: -1 } }, - ...(limit ? [{ $limit: limit }] : []), - ], - as: "hardwarechecks", + { $sort: { createdAt: -1 } }, + ...(limit ? [{ $limit: limit }] : []), + ], + as: "hardwarechecks", + }, }, - }, - ] + ] : []), ...(limit ? [ - { - $lookup: { - from: "distributeduptimechecks", - let: { monitorId: "$_id" }, - pipeline: [ - { - $match: { - $expr: { $eq: ["$monitorId", "$$monitorId"] }, + { + $lookup: { + from: "distributeduptimechecks", + let: { monitorId: "$_id" }, + pipeline: [ + { + $match: { + $expr: { $eq: ["$monitorId", "$$monitorId"] }, + }, }, - }, - { $sort: { createdAt: -1 } }, - ...(limit ? [{ $limit: limit }] : []), - ], - as: "distributeduptimechecks", + { $sort: { createdAt: -1 } }, + ...(limit ? [{ $limit: limit }] : []), + ], + as: "distributeduptimechecks", + }, }, - }, - ] + ] : []), {