From d8ec8d777532f9711d79b10c1bf100ea79930550 Mon Sep 17 00:00:00 2001 From: Alex Holliday Date: Fri, 20 Mar 2026 10:09:29 -0700 Subject: [PATCH] fix validation --- server/src/service/business/monitorService.ts | 24 ++++++---- server/src/validation/monitorValidation.ts | 47 +++++++++---------- 2 files changed, 37 insertions(+), 34 deletions(-) diff --git a/server/src/service/business/monitorService.ts b/server/src/service/business/monitorService.ts index b6db59fca..8a08a7003 100644 --- a/server/src/service/business/monitorService.ts +++ b/server/src/service/business/monitorService.ts @@ -81,7 +81,7 @@ export interface IMonitorService { // other exportMonitorsToJSON(args: { teamId: string }): Promise; - importMonitorsFromJSON(args: { teamId: string; userId: string; monitors: Monitor[] }): Promise<{ imported: number; errors: string[] }>; + importMonitorsFromJSON(args: { teamId: string; userId: string; monitors: Partial[] }): Promise<{ imported: number; errors: string[] }>; } export class MonitorService implements IMonitorService { @@ -526,22 +526,26 @@ export class MonitorService implements IMonitorService { return monitors; }; - importMonitorsFromJSON = async ({ teamId, monitors }: { teamId: string; monitors: Monitor[] }): Promise<{ imported: number; errors: string[] }> => { + importMonitorsFromJSON = async ({ + teamId, + monitors, + }: { + teamId: string; + monitors: Partial[]; + }): Promise<{ imported: number; errors: string[] }> => { const errors: string[] = []; const cleanedMonitors = monitors.map((monitor) => { - const cleanData = { - ...monitor, - _id: monitor.id, - _createdAt: monitor.createdAt, - _updatedAt: monitor.updatedAt, - recentChecks: monitor.recentChecks, - }; + const cleanData = { ...monitor }; + delete cleanData.id; + delete cleanData.createdAt; + delete cleanData.updatedAt; + delete cleanData.recentChecks; cleanData.teamId = teamId; return cleanData; }); - const createdMonitors = await this.createMonitors(cleanedMonitors); + const createdMonitors = await this.createMonitors(cleanedMonitors as Monitor[]); if (!createdMonitors || createdMonitors.length === 0) { throw new AppError({ diff --git a/server/src/validation/monitorValidation.ts b/server/src/validation/monitorValidation.ts index 783f1a029..bfd5b9126 100644 --- a/server/src/validation/monitorValidation.ts +++ b/server/src/validation/monitorValidation.ts @@ -128,39 +128,38 @@ const importedMonitorSchema = z.object({ teamId: z.string().optional(), name: z.string().min(1, "Name is required"), description: z.union([z.string(), z.literal("")]).optional(), - status: z.enum(["up", "down", "paused", "initializing", "maintenance", "breached"]).optional(), - statusWindow: z.array(z.boolean()).optional(), - statusWindowSize: z.number().optional(), - statusWindowThreshold: z.number().optional(), + status: z.enum(["up", "down", "paused", "initializing", "maintenance", "breached"]).default("initializing"), + statusWindow: z.array(z.boolean()).default([]), + statusWindowSize: z.number().min(1).max(20).default(5), + statusWindowThreshold: z.number().min(1).max(100).default(60), type: z.enum(MonitorTypes, "Invalid monitor type"), - ignoreTlsErrors: z.boolean().optional(), - useAdvancedMatching: z.boolean().optional(), + ignoreTlsErrors: z.boolean().default(false), + useAdvancedMatching: z.boolean().default(false), jsonPath: z.union([z.string(), z.literal("")]).optional(), expectedValue: z.union([z.string(), z.literal("")]).optional(), matchMethod: z.union([z.enum(MonitorMatchMethods), z.literal("")]).optional(), url: z.string().min(1, "URL is required"), port: z.number().optional(), - isActive: z.boolean().optional(), - interval: z.number().optional(), + isActive: z.boolean().default(true), + interval: z.number().default(60000), uptimePercentage: z.number().optional(), - notifications: z.array(z.string()).optional(), + notifications: z.array(z.string()).default([]), secret: z.string().optional(), - cpuAlertThreshold: z.number().optional(), - cpuAlertCounter: z.number().optional(), - memoryAlertThreshold: z.number().optional(), - memoryAlertCounter: z.number().optional(), - diskAlertThreshold: z.number().optional(), - diskAlertCounter: z.number().optional(), - tempAlertThreshold: z.number().optional(), - tempAlertCounter: z.number().optional(), - selectedDisks: z.array(z.string()).optional(), + cpuAlertThreshold: z.number().default(100), + cpuAlertCounter: z.number().default(5), + memoryAlertThreshold: z.number().default(100), + memoryAlertCounter: z.number().default(5), + diskAlertThreshold: z.number().default(100), + diskAlertCounter: z.number().default(5), + tempAlertThreshold: z.number().default(100), + tempAlertCounter: z.number().default(5), + selectedDisks: z.array(z.string()).default([]), gameId: z.union([z.string(), z.literal("")]).optional(), - grpcServiceName: z.union([z.string(), z.literal("")]).optional(), - group: z.union([z.string(), z.null()]).optional(), - geoCheckEnabled: z.boolean().optional(), - geoCheckLocations: z.array(z.enum(GeoContinents)).optional(), - geoCheckInterval: z.number().optional(), - recentChecks: z.array(z.unknown()).optional(), + grpcServiceName: z.union([z.string(), z.literal("")]).default(""), + group: z.union([z.string().max(50).trim(), z.null()]).default(null), + geoCheckEnabled: z.boolean().default(false), + geoCheckLocations: z.array(z.enum(GeoContinents)).default([]), + geoCheckInterval: z.number().min(300000).default(300000), createdAt: z.string().optional(), updatedAt: z.string().optional(), });