From 052b9377bc80e6379efae00adb2b3bff7173a94a Mon Sep 17 00:00:00 2001 From: Alex Holliday Date: Tue, 6 Jan 2026 21:08:41 +0000 Subject: [PATCH] delete many --- server/src/init/services.ts | 6 ++-- .../incidents/IIncidentsRepository.ts | 1 + .../incidents/MongoIncidentsRepository.ts | 9 +++++ .../src/services/business/IncidentService.ts | 33 +++++++++++-------- 4 files changed, 33 insertions(+), 16 deletions(-) diff --git a/server/src/init/services.ts b/server/src/init/services.ts index a8c756c0a..ef52e288d 100644 --- a/server/src/init/services.ts +++ b/server/src/init/services.ts @@ -64,7 +64,6 @@ export const initServices = async () => { monitorRepository, monitorStatsRepository ); - // If desired in future, use repository for stats as well const settingsService = new SettingsService(); const stripeService = new StripeService(); const billingService = new BillingService(); @@ -74,7 +73,10 @@ export const initServices = async () => { userService, settingsService ); - const incidentService = new IncidentService(incidentsRepository); + const incidentService = new IncidentService( + incidentsRepository, + monitorRepository + ); const statsAggregationService = new StatsAggregationService(); const jobGenerator = new JobGenerator( networkService, diff --git a/server/src/repositories/incidents/IIncidentsRepository.ts b/server/src/repositories/incidents/IIncidentsRepository.ts index c8e136c11..d036e8740 100644 --- a/server/src/repositories/incidents/IIncidentsRepository.ts +++ b/server/src/repositories/incidents/IIncidentsRepository.ts @@ -44,6 +44,7 @@ export interface IIncidentsRepository { ): Promise; // delete deleteById(incidentId: string, teamId: string): Promise; + deleteManyExcludedByMonitorIds(monitorIds: string[]): Promise; } export default IIncidentsRepository; diff --git a/server/src/repositories/incidents/MongoIncidentsRepository.ts b/server/src/repositories/incidents/MongoIncidentsRepository.ts index d5f44bb93..4b329d97a 100644 --- a/server/src/repositories/incidents/MongoIncidentsRepository.ts +++ b/server/src/repositories/incidents/MongoIncidentsRepository.ts @@ -187,6 +187,15 @@ class MongoIncidentsRepository implements IIncidentsRepository { }); return result.deletedCount === 1; }; + + deleteManyExcludedByMonitorIds = async (monitorIds: string[]) => { + const result = await Incident.deleteMany({ + monitorId: { + $nin: monitorIds.map((id) => new mongoose.Types.ObjectId(id)), + }, + }); + return result.deletedCount || 0; + }; } export default MongoIncidentsRepository; diff --git a/server/src/services/business/IncidentService.ts b/server/src/services/business/IncidentService.ts index a68d7cc17..2514c6edf 100644 --- a/server/src/services/business/IncidentService.ts +++ b/server/src/services/business/IncidentService.ts @@ -1,10 +1,4 @@ -import { - IIncident, - Incident, - IMonitor, - Monitor, - IUser, -} from "@/db/models/index.js"; +import { Incident, Monitor } from "@/db/models/index.js"; import type { ResolutionType } from "@/types/domain/index.js"; import { getChildLogger } from "@/logger/Logger.js"; import { ThresholdEvaluationResult } from "@/services/infrastructure/StatusService.js"; @@ -15,7 +9,10 @@ import type { Incident as IncidentEntity, IncidentWithDetails, } from "@/types/domain/index.js"; -import type { IIncidentsRepository } from "@/repositories/index.js"; +import type { + IIncidentsRepository, + IMonitorRepository, +} from "@/repositories/index.js"; export interface IIncidentService { handleStatusChange: ( @@ -63,9 +60,14 @@ const logger = getChildLogger(SERVICE_NAME); class IncidentService implements IIncidentService { public SERVICE_NAME: string; private incidentsRepository: IIncidentsRepository; - constructor(incidentsRepository: IIncidentsRepository) { + private monitorRepository: IMonitorRepository; + constructor( + incidentsRepository: IIncidentsRepository, + monitorRepository: IMonitorRepository + ) { this.SERVICE_NAME = SERVICE_NAME; this.incidentsRepository = incidentsRepository; + this.monitorRepository = monitorRepository; } handleStatusChange = async ( @@ -263,11 +265,14 @@ class IncidentService implements IIncidentService { async cleanupOrphanedIncidents() { try { - const monitorIds = await Monitor.find().distinct("_id"); - const result = await Incident.deleteMany({ - monitorId: { $nin: monitorIds }, - }); - logger.info(`Deleted ${result.deletedCount} orphaned Incidents.`); + const monitorIds = (await this.monitorRepository.findAll()).map( + (m) => m.id + ); + const deletedCount = + await this.incidentsRepository.deleteManyExcludedByMonitorIds( + monitorIds + ); + logger.info(`Deleted ${deletedCount} orphaned Incidents.`); return true; } catch (error) { logger.error("Error cleaning up orphaned Incidents:", error);