From 456237ba4e4c33d8b52b6ac56b28e17b7f4e3c8b Mon Sep 17 00:00:00 2001 From: Alex Holliday Date: Wed, 11 Mar 2026 12:00:19 -0700 Subject: [PATCH] tighten date typing --- .../src/controllers/maintenanceWindowController.ts | 4 ++-- .../service/business/maintenanceWindowService.ts | 2 -- .../src/validation/maintenanceWindowValidation.ts | 14 ++++++++------ 3 files changed, 10 insertions(+), 10 deletions(-) diff --git a/server/src/controllers/maintenanceWindowController.ts b/server/src/controllers/maintenanceWindowController.ts index cd2174c1b..d2338cd51 100644 --- a/server/src/controllers/maintenanceWindowController.ts +++ b/server/src/controllers/maintenanceWindowController.ts @@ -19,9 +19,9 @@ class MaintenanceWindowController { createMaintenanceWindows = async (req: Request, res: Response, next: NextFunction) => { try { - createMaintenanceWindowBodyValidation.parse(req.body); + const validatedBody = createMaintenanceWindowBodyValidation.parse(req.body); const teamId = requireTeamId(req?.user?.teamId); - await this.maintenanceWindowService.createMaintenanceWindow({ teamId, body: req.body }); + await this.maintenanceWindowService.createMaintenanceWindow({ teamId, body: validatedBody }); return res.status(200).json({ success: true, diff --git a/server/src/service/business/maintenanceWindowService.ts b/server/src/service/business/maintenanceWindowService.ts index 1db2df9ca..98b803bd1 100644 --- a/server/src/service/business/maintenanceWindowService.ts +++ b/server/src/service/business/maintenanceWindowService.ts @@ -1,6 +1,5 @@ import { IMaintenanceWindowsRepository, IMonitorsRepository } from "@/repositories/index.js"; import type { MaintenanceWindow } from "@/types/index.js"; -import { ParseBoolean } from "@/utils/utils.js"; import { AppError } from "@/utils/AppError.js"; const SERVICE_NAME = "maintenanceWindowService"; @@ -91,7 +90,6 @@ export class MaintenanceWindowService implements IMaintenanceWindowService { field?: string; order?: string; }) => { - active = typeof active === "undefined" ? undefined : ParseBoolean(active); page = page ?? 0; rowsPerPage = rowsPerPage ?? 10; diff --git a/server/src/validation/maintenanceWindowValidation.ts b/server/src/validation/maintenanceWindowValidation.ts index 3470f4c38..7cac8d1ad 100644 --- a/server/src/validation/maintenanceWindowValidation.ts +++ b/server/src/validation/maintenanceWindowValidation.ts @@ -1,6 +1,8 @@ import { z } from "zod"; import { booleanCoercion } from "./shared.js"; +const dateToString = z.coerce.date().transform((d) => d.toISOString()); + //**************************************** // Maintenance Window Validations //**************************************** @@ -11,10 +13,10 @@ export const createMaintenanceWindowBodyValidation = z.object({ active: z.boolean().optional(), duration: z.number().min(1, "Duration is required"), durationUnit: z.enum(["seconds", "minutes", "hours", "days"]), - start: z.coerce.date(), - end: z.coerce.date(), + start: dateToString, + end: dateToString, repeat: z.number().min(0, "Repeat must be a non-negative number"), - expiry: z.coerce.date().optional(), + expiry: dateToString.optional(), }); export const getMaintenanceWindowByIdParamValidation = z.object({ @@ -45,9 +47,9 @@ export const editMaintenanceByIdWindowBodyValidation = z.object({ active: z.boolean().optional(), name: z.string().optional(), repeat: z.number().optional(), - start: z.string().optional(), - end: z.string().optional(), - expiry: z.string().optional(), + start: dateToString.optional(), + end: dateToString.optional(), + expiry: dateToString.optional(), monitors: z.array(z.unknown()).optional(), duration: z.number().optional(), durationUnit: z.enum(["seconds", "minutes", "hours", "days"]).optional(),