From 97750da889bb8b1685376b361105219951862d44 Mon Sep 17 00:00:00 2001 From: Alex Holliday Date: Tue, 17 Feb 2026 18:30:22 +0000 Subject: [PATCH] remove incidents on delete --- server/src/config/services.ts | 1 + .../incidents/IIncidentsRepository.ts | 1 + .../incidents/MongoIncidentRepository.ts | 8 +++++++ server/src/service/business/monitorService.ts | 21 ++++++++++++++++++- .../SuperSimpleQueueHelper.ts | 19 +++++++++++++++++ 5 files changed, 49 insertions(+), 1 deletion(-) diff --git a/server/src/config/services.ts b/server/src/config/services.ts index a3fdcdad3..6843fe64b 100644 --- a/server/src/config/services.ts +++ b/server/src/config/services.ts @@ -245,6 +245,7 @@ export const initializeServices = async ({ checksRepository, monitorStatsRepository, statusPagesRepository, + incidentsRepository, }); const statusPageService = new StatusPageService(statusPagesRepository); diff --git a/server/src/repositories/incidents/IIncidentsRepository.ts b/server/src/repositories/incidents/IIncidentsRepository.ts index 3c136bf43..42948a9ee 100644 --- a/server/src/repositories/incidents/IIncidentsRepository.ts +++ b/server/src/repositories/incidents/IIncidentsRepository.ts @@ -23,5 +23,6 @@ export interface IIncidentsRepository { // update updateById(incidentId: string, teamId: string, updateData: Partial): Promise; // delete + deleteByMonitorId(monitorId: string, teamId: string): Promise; // other } diff --git a/server/src/repositories/incidents/MongoIncidentRepository.ts b/server/src/repositories/incidents/MongoIncidentRepository.ts index 9746471a9..b34af4ba7 100644 --- a/server/src/repositories/incidents/MongoIncidentRepository.ts +++ b/server/src/repositories/incidents/MongoIncidentRepository.ts @@ -273,5 +273,13 @@ class MongoIncidentRepository implements IIncidentsRepository { })), }; }; + + deleteByMonitorId = async (monitorId: string, teamId: string) => { + const result = await IncidentModel.deleteMany({ + monitorId: new mongoose.Types.ObjectId(monitorId), + teamId: new mongoose.Types.ObjectId(teamId), + }); + return result.deletedCount || 0; + }; } export default MongoIncidentRepository; diff --git a/server/src/service/business/monitorService.ts b/server/src/service/business/monitorService.ts index 2360b6617..8ea83c509 100644 --- a/server/src/service/business/monitorService.ts +++ b/server/src/service/business/monitorService.ts @@ -8,7 +8,13 @@ import type { PageSpeedDetailsResult, GamesMap, } from "@/types/monitor.js"; -import type { IChecksRepository, IMonitorsRepository, IMonitorStatsRepository, IStatusPagesRepository } from "@/repositories/index.js"; +import type { + IChecksRepository, + IIncidentsRepository, + IMonitorsRepository, + IMonitorStatsRepository, + IStatusPagesRepository, +} from "@/repositories/index.js"; import fs from "fs"; import { fileURLToPath } from "url"; import path from "path"; @@ -79,6 +85,7 @@ export class MonitorService implements IMonitorService { private checksRepository: IChecksRepository; private monitorStatsRepository: IMonitorStatsRepository; private statusPagesRepository: IStatusPagesRepository; + private incidentsRepository: IIncidentsRepository; constructor({ jobQueue, @@ -89,6 +96,7 @@ export class MonitorService implements IMonitorService { checksRepository, monitorStatsRepository, statusPagesRepository, + incidentsRepository, }: { jobQueue: ISuperSimpleQueue; emailService: any; @@ -98,6 +106,7 @@ export class MonitorService implements IMonitorService { checksRepository: IChecksRepository; monitorStatsRepository: IMonitorStatsRepository; statusPagesRepository: IStatusPagesRepository; + incidentsRepository: IIncidentsRepository; }) { this.jobQueue = jobQueue; this.emailService = emailService; @@ -107,6 +116,7 @@ export class MonitorService implements IMonitorService { this.checksRepository = checksRepository; this.monitorStatsRepository = monitorStatsRepository; this.statusPagesRepository = statusPagesRepository; + this.incidentsRepository = incidentsRepository; } get serviceName(): string { @@ -418,6 +428,15 @@ export class MonitorService implements IMonitorService { stack: err.stack, }); }); + + await this.incidentsRepository.deleteByMonitorId(monitor.id, teamId).catch((err: any) => { + this.logger.warn({ + message: `Error deleting incidents for monitor ${monitor.id} with name ${monitor.name}`, + service: SERVICE_NAME, + stack: err.stack, + }); + }); + await this.jobQueue.deleteJob(monitor); return monitor; }; diff --git a/server/src/service/infrastructure/SuperSimpleQueue/SuperSimpleQueueHelper.ts b/server/src/service/infrastructure/SuperSimpleQueue/SuperSimpleQueueHelper.ts index 72a0b03f9..08bc5e257 100644 --- a/server/src/service/infrastructure/SuperSimpleQueue/SuperSimpleQueueHelper.ts +++ b/server/src/service/infrastructure/SuperSimpleQueue/SuperSimpleQueueHelper.ts @@ -153,6 +153,25 @@ class SuperSimpleQueueHelper { }; }; + getCleanupOrphanedJob = () => { + return async () => { + try { + // Remove orphaned monitors + // remove orphaned monitorStats + // Remove orphaned checks + // Remove orphaned incidents + } catch (error: any) { + this.logger.warn({ + message: error.message, + service: SERVICE_NAME, + method: "getCleanupOrphanedJob", + stack: error.stack, + }); + throw error; + } + }; + }; + async isInMaintenanceWindow(monitorId: string, teamId: string) { const maintenanceWindows = await this.maintenanceWindowsRepository.findByMonitorId(monitorId, teamId); // Check for active maintenance window: