diff --git a/server/src/config/services.ts b/server/src/config/services.ts index 7cc908d0b..ce2472588 100644 --- a/server/src/config/services.ts +++ b/server/src/config/services.ts @@ -200,7 +200,8 @@ export const initializeServices = async ({ monitorStatsRepository, checksRepository, incidentsRepository, - geoChecksService + geoChecksService, + geoChecksRepository ); const superSimpleQueue = await SuperSimpleQueue.create(logger, superSimpleQueueHelper, monitorsRepository); diff --git a/server/src/repositories/geo-checks/IGeoChecksRepository.ts b/server/src/repositories/geo-checks/IGeoChecksRepository.ts index 69c9c68b6..516bbd7fc 100644 --- a/server/src/repositories/geo-checks/IGeoChecksRepository.ts +++ b/server/src/repositories/geo-checks/IGeoChecksRepository.ts @@ -26,4 +26,5 @@ export interface IGeoChecksRepository { ): Promise; deleteByMonitorId(monitorId: string): Promise; deleteByTeamId(teamId: string): Promise; + deleteByMonitorIdsNotIn(monitorIds: string[]): Promise; } diff --git a/server/src/repositories/geo-checks/MongoGeoChecksRepository.ts b/server/src/repositories/geo-checks/MongoGeoChecksRepository.ts index 6f7f4d064..e4a6e14e5 100644 --- a/server/src/repositories/geo-checks/MongoGeoChecksRepository.ts +++ b/server/src/repositories/geo-checks/MongoGeoChecksRepository.ts @@ -341,6 +341,21 @@ class MongoGeoChecksRepository implements IGeoChecksRepository { throw error; } }; + + deleteByMonitorIdsNotIn = async (monitorIds: string[]): Promise => { + try { + const objectIds = monitorIds.map((id) => new mongoose.Types.ObjectId(id)); + const result = await GeoCheckModel.deleteMany({ "metadata.monitorId": { $nin: objectIds } }); + return result.deletedCount || 0; + } catch (error: any) { + this.logger.error({ + message: `Error deleting orphaned geo checks: ${error.message}`, + service: SERVICE_NAME, + method: "deleteByMonitorIdsNotIn", + }); + throw error; + } + }; } export { MongoGeoChecksRepository }; diff --git a/server/src/service/infrastructure/SuperSimpleQueue/SuperSimpleQueueHelper.ts b/server/src/service/infrastructure/SuperSimpleQueue/SuperSimpleQueueHelper.ts index 1c57bd59f..454b52b0d 100644 --- a/server/src/service/infrastructure/SuperSimpleQueue/SuperSimpleQueueHelper.ts +++ b/server/src/service/infrastructure/SuperSimpleQueue/SuperSimpleQueueHelper.ts @@ -12,6 +12,7 @@ import { IMonitorStatsRepository, IChecksRepository, IIncidentsRepository, + IGeoChecksRepository, } from "@/repositories/index.js"; import { ILogger } from "@/utils/logger.js"; import { IBufferService } from "../bufferService.js"; @@ -55,6 +56,7 @@ class SuperSimpleQueueHelper implements ISuperSimpleQueueHelper { private checksRepository: IChecksRepository; private incidentsRepository: IIncidentsRepository; private geoChecksService: IGeoChecksService; + private geoChecksRepository: IGeoChecksRepository; constructor( logger: ILogger, @@ -70,7 +72,8 @@ class SuperSimpleQueueHelper implements ISuperSimpleQueueHelper { monitorStatsRepository: IMonitorStatsRepository, checksRepository: IChecksRepository, incidentsRepository: IIncidentsRepository, - geoChecksService: IGeoChecksService + geoChecksService: IGeoChecksService, + geoChecksRepository: IGeoChecksRepository ) { this.logger = logger; this.networkService = networkService; @@ -86,6 +89,7 @@ class SuperSimpleQueueHelper implements ISuperSimpleQueueHelper { this.checksRepository = checksRepository; this.incidentsRepository = incidentsRepository; this.geoChecksService = geoChecksService; + this.geoChecksRepository = geoChecksRepository; } get serviceName() { @@ -240,6 +244,16 @@ class SuperSimpleQueueHelper implements ISuperSimpleQueueHelper { }); } + // Remove orphaned geo checks + const deletedGeoChecksCount = await this.geoChecksRepository.deleteByMonitorIdsNotIn(allMonitorIds); + if (deletedGeoChecksCount > 0) { + this.logger.info({ + message: `Deleted ${deletedGeoChecksCount} orphaned geo checks`, + service: SERVICE_NAME, + method: "getCleanupOrphanedJob", + }); + } + this.logger.info({ message: "Cleanup of orphaned data completed", service: SERVICE_NAME,