diff --git a/server/controllers/authController.js b/server/controllers/authController.js index fdd589c1c..b05a9635a 100755 --- a/server/controllers/authController.js +++ b/server/controllers/authController.js @@ -414,9 +414,6 @@ class AuthController { (await Promise.all( result.monitors.map(async (monitor) => { await this.jobQueue.deleteJob(monitor); - await this.db.deleteChecks(monitor._id); - await this.db.deletePageSpeedChecksByMonitorId(monitor._id); - await this.db.deleteNotificationsByMonitorId(monitor._id); }) )); diff --git a/server/controllers/monitorController.js b/server/controllers/monitorController.js index 447027c57..00b525125 100755 --- a/server/controllers/monitorController.js +++ b/server/controllers/monitorController.js @@ -389,51 +389,8 @@ class MonitorController { try { const monitor = await this.db.deleteMonitor(req, res, next); - // Delete associated checks,alerts,and notifications - - try { - 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: "deleteHardwareChecks", - fn: () => this.db.deleteHardwareChecksByMonitorId(monitor._id), - }, - - // TODO We don't actually want to delete the status page if there are other monitors in it - // We actually just want to remove the monitor being deleted from the status page. - // Only delete he status page if there are no other monitors in it. - { - 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}`, - service: SERVICE_NAME, - method: "deleteMonitor", - stack: error.stack, - }); - } + await this.jobQueue.deleteJob(monitor); + await this.db.deleteStatusPagesByMonitorId(monitor._id); return res.success({ msg: this.stringService.monitorDelete }); } catch (error) { next(handleError(error, SERVICE_NAME, "deleteMonitor")); diff --git a/server/db/models/Monitor.js b/server/db/models/Monitor.js index 3079abfba..26a79b815 100755 --- a/server/db/models/Monitor.js +++ b/server/db/models/Monitor.js @@ -1,4 +1,8 @@ import mongoose from "mongoose"; +import HardwareCheck from "./HardwareCheck.js"; +import PageSpeedCheck from "./PageSpeedCheck.js"; +import Check from "./Check.js"; +import MonitorStats from "./MonitorStats.js"; const MonitorSchema = mongoose.Schema( { @@ -88,6 +92,42 @@ const MonitorSchema = mongoose.Schema( } ); +MonitorSchema.pre("findOneAndDelete", async function (next) { + // Delete checks and stats + try { + const doc = await this.model.findOne(this.getFilter()); + + if (doc.type === "pagespeed") { + await PageSpeedCheck.deleteMany({ monitorId: doc._id }); + } else if (doc.type === "hardware") { + await HardwareCheck.deleteMany({ monitorId: doc._id }); + } else { + await Check.deleteMany({ monitorId: doc._id }); + } + + await MonitorStats.deleteMany({ monitorId: doc._id.toString() }); + next(); + } catch (error) { + next(error); + } +}); + +MonitorSchema.pre("deleteMany", async function (next) { + const filter = this.getFilter(); + const monitors = await this.model.find(filter).select(["_id", "type"]).lean(); + for (const monitor of monitors) { + if (monitor.type === "pagespeed") { + await PageSpeedCheck.deleteMany({ monitorId: monitor._id }); + } else if (monitor.type === "hardware") { + await HardwareCheck.deleteMany({ monitorId: monitor._id }); + } else { + await Check.deleteMany({ monitorId: monitor._id }); + } + await MonitorStats.deleteMany({ monitorId: monitor._id.toString() }); + } + next(); +}); + MonitorSchema.index({ teamId: 1, type: 1 }); export default mongoose.model("Monitor", MonitorSchema);