diff --git a/server/src/config/services.ts b/server/src/config/services.ts index aa563fe85..0dc47278d 100644 --- a/server/src/config/services.ts +++ b/server/src/config/services.ts @@ -204,6 +204,7 @@ export const initializeServices = async ({ monitorsRepository, teamsRepository, monitorStatsRepository, + checksRepository, }); const superSimpleQueue = await SuperSimpleQueue.create({ diff --git a/server/src/repositories/checks/IChecksRepository.ts b/server/src/repositories/checks/IChecksRepository.ts index b75b18f13..31aac0ec9 100644 --- a/server/src/repositories/checks/IChecksRepository.ts +++ b/server/src/repositories/checks/IChecksRepository.ts @@ -39,4 +39,5 @@ export interface IChecksRepository { //delete deleteByMonitorId(monitorId: string): Promise; deleteByTeamId(teamId: string): Promise; + deleteByMonitorIdsNotIn(monitorIds: string[]): Promise; } diff --git a/server/src/repositories/checks/MongoChecksRepistory.ts b/server/src/repositories/checks/MongoChecksRepistory.ts index c9cdbffd6..97a81f565 100644 --- a/server/src/repositories/checks/MongoChecksRepistory.ts +++ b/server/src/repositories/checks/MongoChecksRepistory.ts @@ -417,6 +417,12 @@ class MongoChecksRepository implements IChecksRepository { return deleteResult.deletedCount; }; + deleteByMonitorIdsNotIn = async (monitorIds: string[]): Promise => { + const objectIds = monitorIds.map((id) => new mongoose.Types.ObjectId(id)); + const result = await CheckModel.deleteMany({ "metadata.monitorId": { $nin: objectIds } }); + return result.deletedCount ?? 0; + }; + private findUptimeDateRangeChecks = async ( monitorType: Exclude, monitorObjectId: mongoose.Types.ObjectId, diff --git a/server/src/repositories/incidents/IIncidentsRepository.ts b/server/src/repositories/incidents/IIncidentsRepository.ts index c4fcef2ae..42948a9ee 100644 --- a/server/src/repositories/incidents/IIncidentsRepository.ts +++ b/server/src/repositories/incidents/IIncidentsRepository.ts @@ -24,6 +24,5 @@ export interface IIncidentsRepository { updateById(incidentId: string, teamId: string, updateData: Partial): Promise; // delete deleteByMonitorId(monitorId: string, teamId: string): Promise; - deleteByMonitorIdsNotIn(monitorIds: string[]): Promise; // other } diff --git a/server/src/service/infrastructure/SuperSimpleQueue/SuperSimpleQueueHelper.ts b/server/src/service/infrastructure/SuperSimpleQueue/SuperSimpleQueueHelper.ts index 4d91088a1..05876cc45 100644 --- a/server/src/service/infrastructure/SuperSimpleQueue/SuperSimpleQueueHelper.ts +++ b/server/src/service/infrastructure/SuperSimpleQueue/SuperSimpleQueueHelper.ts @@ -4,7 +4,13 @@ import { AppError } from "@/utils/AppError.js"; import { INetworkService, INotificationsService, IStatusService } from "@/service/index.js"; import type { StatusChangeResult, MonitorStatusResponse, HardwareStatusPayload, MonitorStatus } from "@/types/index.js"; import IncidentService from "@/service/business/incidentService.js"; -import { IMaintenanceWindowsRepository, IMonitorsRepository, ITeamsRepository, IMonitorStatsRepository } from "@/repositories/index.js"; +import { + IMaintenanceWindowsRepository, + IMonitorsRepository, + ITeamsRepository, + IMonitorStatsRepository, + IChecksRepository, +} from "@/repositories/index.js"; export interface MonitorActionDecision { shouldCreateIncident: boolean; @@ -34,6 +40,7 @@ class SuperSimpleQueueHelper { private monitorsRepository: IMonitorsRepository; private teamsRepository: ITeamsRepository; private monitorStatsRepository: IMonitorStatsRepository; + private checksRepository: IChecksRepository; constructor({ logger, @@ -47,6 +54,7 @@ class SuperSimpleQueueHelper { monitorsRepository, teamsRepository, monitorStatsRepository, + checksRepository, }: { logger: any; networkService: INetworkService; @@ -59,6 +67,7 @@ class SuperSimpleQueueHelper { monitorsRepository: IMonitorsRepository; teamsRepository: ITeamsRepository; monitorStatsRepository: IMonitorStatsRepository; + checksRepository: IChecksRepository; }) { this.logger = logger; this.networkService = networkService; @@ -71,6 +80,7 @@ class SuperSimpleQueueHelper { this.monitorsRepository = monitorsRepository; this.teamsRepository = teamsRepository; this.monitorStatsRepository = monitorStatsRepository; + this.checksRepository = checksRepository; } get serviceName() { @@ -206,6 +216,15 @@ class SuperSimpleQueueHelper { } // Remove orphaned checks + const deletedChecksCount = await this.checksRepository.deleteByMonitorIdsNotIn(allMonitorIds); + if (deletedChecksCount > 0) { + this.logger.info({ + message: `Deleted ${deletedChecksCount} orphaned checks`, + service: SERVICE_NAME, + method: "getCleanupOrphanedJob", + }); + } + // Remove orphaned incidents this.logger.info({