diff --git a/server/src/repositories/monitors/IMonitorsRepository.ts b/server/src/repositories/monitors/IMonitorsRepository.ts index 63940f591..9d82d9987 100644 --- a/server/src/repositories/monitors/IMonitorsRepository.ts +++ b/server/src/repositories/monitors/IMonitorsRepository.ts @@ -17,7 +17,7 @@ export interface SummaryConfig { export interface IMonitorsRepository { // create create(monitor: Monitor, teamId: string, userId: string): Promise; - createBulkMonitors(monitors: Monitor[]): Promise; + createMonitors(monitors: Monitor[]): Promise; // single fetch findById(monitorId: string, teamId: string): Promise; diff --git a/server/src/repositories/monitors/MongoMonitorsRepository.ts b/server/src/repositories/monitors/MongoMonitorsRepository.ts index 728d2081f..4ae4394d4 100644 --- a/server/src/repositories/monitors/MongoMonitorsRepository.ts +++ b/server/src/repositories/monitors/MongoMonitorsRepository.ts @@ -12,13 +12,23 @@ class MongoMonitorsRepository implements IMonitorsRepository { return this.toEntity(saved); }; - createBulkMonitors = async (monitors: Monitor[]): Promise => { + createMonitors = async (monitors: Monitor[]): Promise => { if (!monitors.length) { return []; } const payload = monitors.map((monitor) => ({ ...monitor, notifications: undefined })); - const inserted = await MonitorModel.insertMany(payload, { ordered: false }); - return this.mapDocuments(inserted); + try { + const inserted = await MonitorModel.insertMany(payload, { ordered: false }); + return this.mapDocuments(inserted); + } catch (error: any) { + if (error.name === "MongoBulkWriteError" || error.name === "BulkWriteError") { + const insertedDocs = error.insertedDocs || []; + if (insertedDocs.length > 0) { + return this.mapDocuments(insertedDocs); + } + } + throw error; + } }; findById = async (monitorId: string, teamId: string): Promise => { diff --git a/server/src/service/business/monitorService.ts b/server/src/service/business/monitorService.ts index 87bb7eeda..a0591a74f 100644 --- a/server/src/service/business/monitorService.ts +++ b/server/src/service/business/monitorService.ts @@ -29,6 +29,7 @@ export interface IMonitorService { // create createMonitor(teamId: string, userId: string, body: Monitor): Promise; + createMonitors(monitors: Array, userId: string, teamId: string): Promise; addDemoMonitors(args: { userId: string; teamId: string }): Promise; // read @@ -157,11 +158,10 @@ export class MonitorService implements IMonitorService { this.jobQueue.addJob(monitor.id, monitor); }; - createBulkMonitors = async (monitors: Array, userId: string, teamId: string): Promise => { - // TDO rename createMonitors, change to accept JSON - const createdMonitors = await this.monitorsRepository.createBulkMonitors(monitors); + createMonitors = async (monitors: Array, userId: string, teamId: string): Promise => { + const createdMonitors = await this.monitorsRepository.createMonitors(monitors); if (!monitors || monitors.length === 0) { - throw new AppError({ message: "Failed to create monitors", status: 500, service: SERVICE_NAME, method: "createBulkMonitors" }); + throw new AppError({ message: "Failed to create monitors", status: 500, service: SERVICE_NAME, method: "createMonitors" }); } await Promise.all(createdMonitors.map((monitor) => this.jobQueue.addJob(monitor.id, monitor))); @@ -185,7 +185,7 @@ export class MonitorService implements IMonitorService { interval: 60000, }; }); - const demoMonitors = await this.monitorsRepository.createBulkMonitors(monitors); + const demoMonitors = await this.monitorsRepository.createMonitors(monitors); await Promise.all(demoMonitors.map((monitor) => this.jobQueue.addJob(monitor.id, monitor))); return demoMonitors; @@ -511,7 +511,7 @@ export class MonitorService implements IMonitorService { return cleanData; }); - const createdMonitors = await this.createBulkMonitors(cleanedMonitors, userId, teamId); + const createdMonitors = await this.createMonitors(cleanedMonitors, userId, teamId); if (!createdMonitors || createdMonitors.length === 0) { throw new AppError({