From 9cec711427d1fdf953bee668eb04e6f7dfe48a82 Mon Sep 17 00:00:00 2001 From: "copilot-swe-agent[bot]" <198982749+Copilot@users.noreply.github.com> Date: Sun, 17 May 2026 06:38:44 +0000 Subject: [PATCH] Fix custom parser OpenAPI types and add structured default response schema Agent-Logs-Url: https://github.com/fosrl/pangolin/sessions/73990123-9c27-444b-bc6e-77e890a0d57c Co-authored-by: oschwartz10612 <4999704+oschwartz10612@users.noreply.github.com> --- server/integrationApiServer.ts | 12 +++++++++--- server/lib/ip.ts | 8 +++++++- .../routers/approvals/processPendingApproval.ts | 2 +- .../routers/certificates/restartCertificate.ts | 4 ++-- .../private/routers/re-key/reGenerateClientSecret.ts | 2 +- .../private/routers/re-key/reGenerateSiteSecret.ts | 2 +- server/private/routers/user/addUserRole.ts | 2 +- server/private/routers/user/removeUserRole.ts | 2 +- server/routers/accessToken/generateAccessToken.ts | 2 +- server/routers/auth/checkResourceSession.ts | 2 +- server/routers/blueprints/getBlueprint.ts | 2 +- server/routers/client/archiveClient.ts | 2 +- server/routers/client/blockClient.ts | 2 +- server/routers/client/deleteClient.ts | 2 +- server/routers/client/unarchiveClient.ts | 2 +- server/routers/client/unblockClient.ts | 2 +- server/routers/client/updateClient.ts | 2 +- .../routers/resource/addEmailToResourceWhitelist.ts | 2 +- server/routers/resource/authWithPassword.ts | 2 +- server/routers/resource/authWithPincode.ts | 2 +- server/routers/resource/authWithWhitelist.ts | 2 +- server/routers/resource/createResourceRule.ts | 2 +- server/routers/resource/deleteResource.ts | 2 +- server/routers/resource/deleteResourceRule.ts | 4 ++-- server/routers/resource/getExchangeToken.ts | 2 +- server/routers/resource/getResourceWhitelist.ts | 2 +- server/routers/resource/listResourceRoles.ts | 2 +- server/routers/resource/listResourceRules.ts | 2 +- server/routers/resource/listResourceUsers.ts | 2 +- .../resource/removeEmailFromResourceWhitelist.ts | 2 +- server/routers/resource/setResourceHeaderAuth.ts | 2 +- server/routers/resource/setResourcePassword.ts | 2 +- server/routers/resource/setResourcePincode.ts | 2 +- server/routers/resource/setResourceRoles.ts | 2 +- server/routers/resource/setResourceUsers.ts | 2 +- server/routers/resource/setResourceWhitelist.ts | 2 +- server/routers/resource/updateResource.ts | 2 +- server/routers/resource/updateResourceRule.ts | 4 ++-- server/routers/role/addRoleAction.ts | 2 +- server/routers/role/addRoleSite.ts | 4 ++-- server/routers/role/deleteRole.ts | 4 ++-- server/routers/role/getRole.ts | 2 +- server/routers/role/listRoleActions.ts | 2 +- server/routers/role/listRoleResources.ts | 2 +- server/routers/role/listRoleSites.ts | 2 +- server/routers/role/removeRoleAction.ts | 2 +- server/routers/role/removeRoleResource.ts | 4 ++-- server/routers/role/removeRoleSite.ts | 4 ++-- server/routers/role/updateRole.ts | 2 +- server/routers/site/deleteSite.ts | 2 +- server/routers/site/listSiteRoles.ts | 2 +- server/routers/site/socketIntegration.ts | 2 +- server/routers/site/updateSite.ts | 2 +- .../siteResource/batchAddClientToSiteResources.ts | 2 +- server/routers/siteResource/createSiteResource.ts | 7 ++++++- server/routers/siteResource/deleteSiteResource.ts | 2 +- server/routers/siteResource/listSiteResources.ts | 2 +- server/routers/siteResource/updateSiteResource.ts | 9 +++++++-- server/routers/target/createTarget.ts | 2 +- server/routers/target/deleteTarget.ts | 2 +- server/routers/target/getTarget.ts | 2 +- server/routers/target/listTargets.ts | 2 +- server/routers/target/updateTarget.ts | 2 +- server/routers/user/addUserRoleLegacy.ts | 2 +- server/routers/user/addUserSite.ts | 2 +- server/routers/user/removeUserResource.ts | 2 +- 66 files changed, 98 insertions(+), 76 deletions(-) diff --git a/server/integrationApiServer.ts b/server/integrationApiServer.ts index ce029d9b5..5c6d50a85 100644 --- a/server/integrationApiServer.ts +++ b/server/integrationApiServer.ts @@ -152,11 +152,17 @@ function getOpenApiDocumentation() { if (!hasExistingResponses) { def.route.responses = { - "*": { - description: "", + "200": { + description: "Successful response", content: { "application/json": { - schema: z.object({}) + schema: z.object({ + data: z.unknown().nullable(), + success: z.boolean(), + error: z.boolean(), + message: z.string(), + status: z.number() + }) } } } diff --git a/server/lib/ip.ts b/server/lib/ip.ts index 9989b978f..170b63ad4 100644 --- a/server/lib/ip.ts +++ b/server/lib/ip.ts @@ -873,7 +873,13 @@ export const portRangeStringSchema = z message: 'Port range must be "*" for all ports, or a comma-separated list of ports and ranges (e.g., "80,443,8000-9000"). Ports must be between 1 and 65535, and ranges must have start <= end.' } - ); + ) + .openapi({ + type: "string", + description: + 'Port range string. Use "*" for all ports, a comma-separated list of ports, or ranges (e.g., "80,443,8000-9000"). Ports must be between 1 and 65535.', + example: "80,443,8000-9000" + }); /** * Parses a port range string into an array of port range objects diff --git a/server/private/routers/approvals/processPendingApproval.ts b/server/private/routers/approvals/processPendingApproval.ts index 39497bd6c..dce8692bc 100644 --- a/server/private/routers/approvals/processPendingApproval.ts +++ b/server/private/routers/approvals/processPendingApproval.ts @@ -24,7 +24,7 @@ import type { NextFunction, Request, Response } from "express"; const paramsSchema = z.strictObject({ orgId: z.string(), - approvalId: z.string().transform(Number).pipe(z.int().positive()) + approvalId: z.coerce.number().int().positive() }); const bodySchema = z.strictObject({ diff --git a/server/private/routers/certificates/restartCertificate.ts b/server/private/routers/certificates/restartCertificate.ts index 492aacc09..6d80c27b9 100644 --- a/server/private/routers/certificates/restartCertificate.ts +++ b/server/private/routers/certificates/restartCertificate.ts @@ -25,7 +25,7 @@ import { fromError } from "zod-validation-error"; import { OpenAPITags, registry } from "@server/openApi"; const restartCertificateParamsSchema = z.strictObject({ - certId: z.string().transform(stoi).pipe(z.int().positive()), + certId: z.coerce.number().int().positive(), orgId: z.string() }); @@ -36,7 +36,7 @@ registry.registerPath({ tags: ["Certificate"], request: { params: z.object({ - certId: z.string().transform(stoi).pipe(z.int().positive()), + certId: z.coerce.number().int().positive(), orgId: z.string() }) }, diff --git a/server/private/routers/re-key/reGenerateClientSecret.ts b/server/private/routers/re-key/reGenerateClientSecret.ts index 48ec60c51..c0c160f7e 100644 --- a/server/private/routers/re-key/reGenerateClientSecret.ts +++ b/server/private/routers/re-key/reGenerateClientSecret.ts @@ -28,7 +28,7 @@ import { OlmErrorCodes, sendOlmError } from "@server/routers/olm/error"; import { sendTerminateClient } from "@server/routers/client/terminate"; const reGenerateSecretParamsSchema = z.strictObject({ - clientId: z.string().transform(Number).pipe(z.int().positive()) + clientId: z.coerce.number().int().positive() }); const reGenerateSecretBodySchema = z.strictObject({ diff --git a/server/private/routers/re-key/reGenerateSiteSecret.ts b/server/private/routers/re-key/reGenerateSiteSecret.ts index 6abf037b2..6e69eb3f1 100644 --- a/server/private/routers/re-key/reGenerateSiteSecret.ts +++ b/server/private/routers/re-key/reGenerateSiteSecret.ts @@ -27,7 +27,7 @@ import { getAllowedIps } from "@server/routers/target/helpers"; import { disconnectClient, sendToClient } from "#private/routers/ws"; const updateSiteParamsSchema = z.strictObject({ - siteId: z.string().transform(Number).pipe(z.int().positive()) + siteId: z.coerce.number().int().positive() }); const updateSiteBodySchema = z.strictObject({ diff --git a/server/private/routers/user/addUserRole.ts b/server/private/routers/user/addUserRole.ts index 1789ca9c4..7989a6fdb 100644 --- a/server/private/routers/user/addUserRole.ts +++ b/server/private/routers/user/addUserRole.ts @@ -27,7 +27,7 @@ import { rebuildClientAssociationsFromClient } from "@server/lib/rebuildClientAs const addUserRoleParamsSchema = z.strictObject({ userId: z.string(), - roleId: z.string().transform(stoi).pipe(z.number()) + roleId: z.coerce.number() }); registry.registerPath({ diff --git a/server/private/routers/user/removeUserRole.ts b/server/private/routers/user/removeUserRole.ts index 7cd805240..382cc0508 100644 --- a/server/private/routers/user/removeUserRole.ts +++ b/server/private/routers/user/removeUserRole.ts @@ -27,7 +27,7 @@ import { rebuildClientAssociationsFromClient } from "@server/lib/rebuildClientAs const removeUserRoleParamsSchema = z.strictObject({ userId: z.string(), - roleId: z.string().transform(stoi).pipe(z.number()) + roleId: z.coerce.number() }); registry.registerPath({ diff --git a/server/routers/accessToken/generateAccessToken.ts b/server/routers/accessToken/generateAccessToken.ts index 9d0a7a7df..9181eb8de 100644 --- a/server/routers/accessToken/generateAccessToken.ts +++ b/server/routers/accessToken/generateAccessToken.ts @@ -31,7 +31,7 @@ export const generateAccessTokenBodySchema = z.strictObject({ }); export const generateAccssTokenParamsSchema = z.strictObject({ - resourceId: z.string().transform(Number).pipe(z.int().positive()) + resourceId: z.coerce.number().int().positive() }); export type GenerateAccessTokenResponse = Omit< diff --git a/server/routers/auth/checkResourceSession.ts b/server/routers/auth/checkResourceSession.ts index 74a94a843..521869d1f 100644 --- a/server/routers/auth/checkResourceSession.ts +++ b/server/routers/auth/checkResourceSession.ts @@ -9,7 +9,7 @@ import logger from "@server/logger"; export const params = z.strictObject({ token: z.string(), - resourceId: z.string().transform(Number).pipe(z.int().positive()) + resourceId: z.coerce.number().int().positive() }); export type CheckResourceSessionParams = z.infer; diff --git a/server/routers/blueprints/getBlueprint.ts b/server/routers/blueprints/getBlueprint.ts index ea2ac2d05..f173d95fd 100644 --- a/server/routers/blueprints/getBlueprint.ts +++ b/server/routers/blueprints/getBlueprint.ts @@ -13,7 +13,7 @@ import { OpenAPITags, registry } from "@server/openApi"; import { BlueprintData } from "./types"; const getBlueprintSchema = z.strictObject({ - blueprintId: z.string().transform(stoi).pipe(z.int().positive()), + blueprintId: z.coerce.number().int().positive(), orgId: z.string() }); diff --git a/server/routers/client/archiveClient.ts b/server/routers/client/archiveClient.ts index 34b7bb912..a7cc29ebc 100644 --- a/server/routers/client/archiveClient.ts +++ b/server/routers/client/archiveClient.ts @@ -11,7 +11,7 @@ import { fromError } from "zod-validation-error"; import { OpenAPITags, registry } from "@server/openApi"; const archiveClientSchema = z.strictObject({ - clientId: z.string().transform(Number).pipe(z.int().positive()) + clientId: z.coerce.number().int().positive() }); registry.registerPath({ diff --git a/server/routers/client/blockClient.ts b/server/routers/client/blockClient.ts index bd760b3da..90adab008 100644 --- a/server/routers/client/blockClient.ts +++ b/server/routers/client/blockClient.ts @@ -13,7 +13,7 @@ import { sendTerminateClient } from "./terminate"; import { OlmErrorCodes } from "../olm/error"; const blockClientSchema = z.strictObject({ - clientId: z.string().transform(Number).pipe(z.int().positive()) + clientId: z.coerce.number().int().positive() }); registry.registerPath({ diff --git a/server/routers/client/deleteClient.ts b/server/routers/client/deleteClient.ts index 378639af6..d3672b0e2 100644 --- a/server/routers/client/deleteClient.ts +++ b/server/routers/client/deleteClient.ts @@ -14,7 +14,7 @@ import { sendTerminateClient } from "./terminate"; import { OlmErrorCodes } from "../olm/error"; const deleteClientSchema = z.strictObject({ - clientId: z.string().transform(Number).pipe(z.int().positive()) + clientId: z.coerce.number().int().positive() }); registry.registerPath({ diff --git a/server/routers/client/unarchiveClient.ts b/server/routers/client/unarchiveClient.ts index 62c5c17c8..8300b90df 100644 --- a/server/routers/client/unarchiveClient.ts +++ b/server/routers/client/unarchiveClient.ts @@ -11,7 +11,7 @@ import { fromError } from "zod-validation-error"; import { OpenAPITags, registry } from "@server/openApi"; const unarchiveClientSchema = z.strictObject({ - clientId: z.string().transform(Number).pipe(z.int().positive()) + clientId: z.coerce.number().int().positive() }); registry.registerPath({ diff --git a/server/routers/client/unblockClient.ts b/server/routers/client/unblockClient.ts index a16a1030a..977ff6276 100644 --- a/server/routers/client/unblockClient.ts +++ b/server/routers/client/unblockClient.ts @@ -11,7 +11,7 @@ import { fromError } from "zod-validation-error"; import { OpenAPITags, registry } from "@server/openApi"; const unblockClientSchema = z.strictObject({ - clientId: z.string().transform(Number).pipe(z.int().positive()) + clientId: z.coerce.number().int().positive() }); registry.registerPath({ diff --git a/server/routers/client/updateClient.ts b/server/routers/client/updateClient.ts index 8ef01a2fc..5ff36ee8c 100644 --- a/server/routers/client/updateClient.ts +++ b/server/routers/client/updateClient.ts @@ -11,7 +11,7 @@ import { fromError } from "zod-validation-error"; import { OpenAPITags, registry } from "@server/openApi"; const updateClientParamsSchema = z.strictObject({ - clientId: z.string().transform(Number).pipe(z.int().positive()) + clientId: z.coerce.number().int().positive() }); const updateClientSchema = z.strictObject({ diff --git a/server/routers/resource/addEmailToResourceWhitelist.ts b/server/routers/resource/addEmailToResourceWhitelist.ts index 27ba34699..bf1ad40dd 100644 --- a/server/routers/resource/addEmailToResourceWhitelist.ts +++ b/server/routers/resource/addEmailToResourceWhitelist.ts @@ -22,7 +22,7 @@ const addEmailToResourceWhitelistBodySchema = z.strictObject({ }); const addEmailToResourceWhitelistParamsSchema = z.strictObject({ - resourceId: z.string().transform(Number).pipe(z.int().positive()) + resourceId: z.coerce.number().int().positive() }); registry.registerPath({ diff --git a/server/routers/resource/authWithPassword.ts b/server/routers/resource/authWithPassword.ts index ecf61896b..5acb301a6 100644 --- a/server/routers/resource/authWithPassword.ts +++ b/server/routers/resource/authWithPassword.ts @@ -20,7 +20,7 @@ export const authWithPasswordBodySchema = z.strictObject({ }); export const authWithPasswordParamsSchema = z.strictObject({ - resourceId: z.string().transform(Number).pipe(z.int().positive()) + resourceId: z.coerce.number().int().positive() }); export type AuthWithPasswordResponse = { diff --git a/server/routers/resource/authWithPincode.ts b/server/routers/resource/authWithPincode.ts index 78e132d20..5480f3d04 100644 --- a/server/routers/resource/authWithPincode.ts +++ b/server/routers/resource/authWithPincode.ts @@ -19,7 +19,7 @@ export const authWithPincodeBodySchema = z.strictObject({ }); export const authWithPincodeParamsSchema = z.strictObject({ - resourceId: z.string().transform(Number).pipe(z.int().positive()) + resourceId: z.coerce.number().int().positive() }); export type AuthWithPincodeResponse = { diff --git a/server/routers/resource/authWithWhitelist.ts b/server/routers/resource/authWithWhitelist.ts index 6a2b7ee76..0f64cea4a 100644 --- a/server/routers/resource/authWithWhitelist.ts +++ b/server/routers/resource/authWithWhitelist.ts @@ -20,7 +20,7 @@ const authWithWhitelistBodySchema = z.strictObject({ }); const authWithWhitelistParamsSchema = z.strictObject({ - resourceId: z.string().transform(Number).pipe(z.int().positive()) + resourceId: z.coerce.number().int().positive() }); export type AuthWithWhitelistResponse = { diff --git a/server/routers/resource/createResourceRule.ts b/server/routers/resource/createResourceRule.ts index 200ee07d4..b75055414 100644 --- a/server/routers/resource/createResourceRule.ts +++ b/server/routers/resource/createResourceRule.ts @@ -25,7 +25,7 @@ const createResourceRuleSchema = z.strictObject({ }); const createResourceRuleParamsSchema = z.strictObject({ - resourceId: z.string().transform(Number).pipe(z.int().positive()) + resourceId: z.coerce.number().int().positive() }); registry.registerPath({ diff --git a/server/routers/resource/deleteResource.ts b/server/routers/resource/deleteResource.ts index 682fd6aa9..5353d85dd 100644 --- a/server/routers/resource/deleteResource.ts +++ b/server/routers/resource/deleteResource.ts @@ -15,7 +15,7 @@ import { OpenAPITags, registry } from "@server/openApi"; // Define Zod schema for request parameters validation const deleteResourceSchema = z.strictObject({ - resourceId: z.string().transform(Number).pipe(z.int().positive()) + resourceId: z.coerce.number().int().positive() }); registry.registerPath({ diff --git a/server/routers/resource/deleteResourceRule.ts b/server/routers/resource/deleteResourceRule.ts index 0fe9007f8..64ed684b3 100644 --- a/server/routers/resource/deleteResourceRule.ts +++ b/server/routers/resource/deleteResourceRule.ts @@ -11,8 +11,8 @@ import { fromError } from "zod-validation-error"; import { OpenAPITags, registry } from "@server/openApi"; const deleteResourceRuleSchema = z.strictObject({ - ruleId: z.string().transform(Number).pipe(z.int().positive()), - resourceId: z.string().transform(Number).pipe(z.int().positive()) + ruleId: z.coerce.number().int().positive(), + resourceId: z.coerce.number().int().positive() }); registry.registerPath({ diff --git a/server/routers/resource/getExchangeToken.ts b/server/routers/resource/getExchangeToken.ts index b0af4b7ff..23151d534 100644 --- a/server/routers/resource/getExchangeToken.ts +++ b/server/routers/resource/getExchangeToken.ts @@ -17,7 +17,7 @@ import { checkOrgAccessPolicy } from "#dynamic/lib/checkOrgAccessPolicy"; import { logAccessAudit } from "#dynamic/lib/logAccessAudit"; const getExchangeTokenParams = z.strictObject({ - resourceId: z.string().transform(Number).pipe(z.int().positive()) + resourceId: z.coerce.number().int().positive() }); export type GetExchangeTokenResponse = { diff --git a/server/routers/resource/getResourceWhitelist.ts b/server/routers/resource/getResourceWhitelist.ts index 5eb05184f..a33899a27 100644 --- a/server/routers/resource/getResourceWhitelist.ts +++ b/server/routers/resource/getResourceWhitelist.ts @@ -11,7 +11,7 @@ import { fromError } from "zod-validation-error"; import { OpenAPITags, registry } from "@server/openApi"; const getResourceWhitelistSchema = z.strictObject({ - resourceId: z.string().transform(Number).pipe(z.int().positive()) + resourceId: z.coerce.number().int().positive() }); async function queryWhitelist(resourceId: number) { diff --git a/server/routers/resource/listResourceRoles.ts b/server/routers/resource/listResourceRoles.ts index 4af631191..513bffdb0 100644 --- a/server/routers/resource/listResourceRoles.ts +++ b/server/routers/resource/listResourceRoles.ts @@ -11,7 +11,7 @@ import { fromError } from "zod-validation-error"; import { OpenAPITags, registry } from "@server/openApi"; const listResourceRolesSchema = z.strictObject({ - resourceId: z.string().transform(Number).pipe(z.int().positive()) + resourceId: z.coerce.number().int().positive() }); async function query(resourceId: number) { diff --git a/server/routers/resource/listResourceRules.ts b/server/routers/resource/listResourceRules.ts index 92d738cbb..067133219 100644 --- a/server/routers/resource/listResourceRules.ts +++ b/server/routers/resource/listResourceRules.ts @@ -11,7 +11,7 @@ import logger from "@server/logger"; import { OpenAPITags, registry } from "@server/openApi"; const listResourceRulesParamsSchema = z.strictObject({ - resourceId: z.string().transform(Number).pipe(z.int().positive()) + resourceId: z.coerce.number().int().positive() }); const listResourceRulesSchema = z.object({ diff --git a/server/routers/resource/listResourceUsers.ts b/server/routers/resource/listResourceUsers.ts index 2802ac827..083ead537 100644 --- a/server/routers/resource/listResourceUsers.ts +++ b/server/routers/resource/listResourceUsers.ts @@ -11,7 +11,7 @@ import { fromError } from "zod-validation-error"; import { OpenAPITags, registry } from "@server/openApi"; const listResourceUsersSchema = z.strictObject({ - resourceId: z.string().transform(Number).pipe(z.int().positive()) + resourceId: z.coerce.number().int().positive() }); async function queryUsers(resourceId: number) { diff --git a/server/routers/resource/removeEmailFromResourceWhitelist.ts b/server/routers/resource/removeEmailFromResourceWhitelist.ts index f419c4136..e5bfc0683 100644 --- a/server/routers/resource/removeEmailFromResourceWhitelist.ts +++ b/server/routers/resource/removeEmailFromResourceWhitelist.ts @@ -22,7 +22,7 @@ const removeEmailFromResourceWhitelistBodySchema = z.strictObject({ }); const removeEmailFromResourceWhitelistParamsSchema = z.strictObject({ - resourceId: z.string().transform(Number).pipe(z.int().positive()) + resourceId: z.coerce.number().int().positive() }); registry.registerPath({ diff --git a/server/routers/resource/setResourceHeaderAuth.ts b/server/routers/resource/setResourceHeaderAuth.ts index 9c28bf9f0..07f7948b5 100644 --- a/server/routers/resource/setResourceHeaderAuth.ts +++ b/server/routers/resource/setResourceHeaderAuth.ts @@ -15,7 +15,7 @@ import { hashPassword } from "@server/auth/password"; import { OpenAPITags, registry } from "@server/openApi"; const setResourceAuthMethodsParamsSchema = z.object({ - resourceId: z.string().transform(Number).pipe(z.int().positive()) + resourceId: z.coerce.number().int().positive() }); const setResourceAuthMethodsBodySchema = z.strictObject({ diff --git a/server/routers/resource/setResourcePassword.ts b/server/routers/resource/setResourcePassword.ts index d9fcb5f0b..4447d393e 100644 --- a/server/routers/resource/setResourcePassword.ts +++ b/server/routers/resource/setResourcePassword.ts @@ -13,7 +13,7 @@ import { hashPassword } from "@server/auth/password"; import { OpenAPITags, registry } from "@server/openApi"; const setResourceAuthMethodsParamsSchema = z.object({ - resourceId: z.string().transform(Number).pipe(z.int().positive()) + resourceId: z.coerce.number().int().positive() }); const setResourceAuthMethodsBodySchema = z.strictObject({ diff --git a/server/routers/resource/setResourcePincode.ts b/server/routers/resource/setResourcePincode.ts index 54057ba08..6cbfbe9a4 100644 --- a/server/routers/resource/setResourcePincode.ts +++ b/server/routers/resource/setResourcePincode.ts @@ -14,7 +14,7 @@ import { hashPassword } from "@server/auth/password"; import { OpenAPITags, registry } from "@server/openApi"; const setResourceAuthMethodsParamsSchema = z.object({ - resourceId: z.string().transform(Number).pipe(z.int().positive()) + resourceId: z.coerce.number().int().positive() }); const setResourceAuthMethodsBodySchema = z.strictObject({ diff --git a/server/routers/resource/setResourceRoles.ts b/server/routers/resource/setResourceRoles.ts index ff3cd7377..80880293d 100644 --- a/server/routers/resource/setResourceRoles.ts +++ b/server/routers/resource/setResourceRoles.ts @@ -15,7 +15,7 @@ const setResourceRolesBodySchema = z.strictObject({ }); const setResourceRolesParamsSchema = z.strictObject({ - resourceId: z.string().transform(Number).pipe(z.int().positive()) + resourceId: z.coerce.number().int().positive() }); registry.registerPath({ diff --git a/server/routers/resource/setResourceUsers.ts b/server/routers/resource/setResourceUsers.ts index 46b5d1523..288d1ae02 100644 --- a/server/routers/resource/setResourceUsers.ts +++ b/server/routers/resource/setResourceUsers.ts @@ -15,7 +15,7 @@ const setUserResourcesBodySchema = z.strictObject({ }); const setUserResourcesParamsSchema = z.strictObject({ - resourceId: z.string().transform(Number).pipe(z.int().positive()) + resourceId: z.coerce.number().int().positive() }); registry.registerPath({ diff --git a/server/routers/resource/setResourceWhitelist.ts b/server/routers/resource/setResourceWhitelist.ts index aa5dc8cdb..b7522df84 100644 --- a/server/routers/resource/setResourceWhitelist.ts +++ b/server/routers/resource/setResourceWhitelist.ts @@ -24,7 +24,7 @@ const setResourceWhitelistBodySchema = z.strictObject({ }); const setResourceWhitelistParamsSchema = z.strictObject({ - resourceId: z.string().transform(Number).pipe(z.int().positive()) + resourceId: z.coerce.number().int().positive() }); registry.registerPath({ diff --git a/server/routers/resource/updateResource.ts b/server/routers/resource/updateResource.ts index 0a7052dce..dd405df0d 100644 --- a/server/routers/resource/updateResource.ts +++ b/server/routers/resource/updateResource.ts @@ -31,7 +31,7 @@ import { tierMatrix } from "@server/lib/billing/tierMatrix"; import { isSubscribed } from "#dynamic/lib/isSubscribed"; const updateResourceParamsSchema = z.strictObject({ - resourceId: z.string().transform(Number).pipe(z.int().positive()) + resourceId: z.coerce.number().int().positive() }); const updateHttpResourceBodySchema = z diff --git a/server/routers/resource/updateResourceRule.ts b/server/routers/resource/updateResourceRule.ts index 4074fd93a..7fae5c959 100644 --- a/server/routers/resource/updateResourceRule.ts +++ b/server/routers/resource/updateResourceRule.ts @@ -18,8 +18,8 @@ import { isValidRegionId } from "@server/db/regions"; // Define Zod schema for request parameters validation const updateResourceRuleParamsSchema = z.strictObject({ - ruleId: z.string().transform(Number).pipe(z.int().positive()), - resourceId: z.string().transform(Number).pipe(z.int().positive()) + ruleId: z.coerce.number().int().positive(), + resourceId: z.coerce.number().int().positive() }); // Define Zod schema for request body validation diff --git a/server/routers/role/addRoleAction.ts b/server/routers/role/addRoleAction.ts index 5c258de7e..45f2fd92e 100644 --- a/server/routers/role/addRoleAction.ts +++ b/server/routers/role/addRoleAction.ts @@ -10,7 +10,7 @@ import { eq } from "drizzle-orm"; import { fromError } from "zod-validation-error"; const addRoleActionParamSchema = z.strictObject({ - roleId: z.string().transform(Number).pipe(z.int().positive()) + roleId: z.coerce.number().int().positive() }); const addRoleActionSchema = z.strictObject({ diff --git a/server/routers/role/addRoleSite.ts b/server/routers/role/addRoleSite.ts index ddd1f07e7..6bfa06811 100644 --- a/server/routers/role/addRoleSite.ts +++ b/server/routers/role/addRoleSite.ts @@ -10,11 +10,11 @@ import { eq } from "drizzle-orm"; import { fromError } from "zod-validation-error"; const addRoleSiteParamsSchema = z.strictObject({ - roleId: z.string().transform(Number).pipe(z.int().positive()) + roleId: z.coerce.number().int().positive() }); const addRoleSiteSchema = z.strictObject({ - siteId: z.string().transform(Number).pipe(z.int().positive()) + siteId: z.coerce.number().int().positive() }); export async function addRoleSite( diff --git a/server/routers/role/deleteRole.ts b/server/routers/role/deleteRole.ts index 4d2797250..28811d81e 100644 --- a/server/routers/role/deleteRole.ts +++ b/server/routers/role/deleteRole.ts @@ -11,11 +11,11 @@ import { fromError } from "zod-validation-error"; import { OpenAPITags, registry } from "@server/openApi"; const deleteRoleSchema = z.strictObject({ - roleId: z.string().transform(Number).pipe(z.int().positive()) + roleId: z.coerce.number().int().positive() }); const deelteRoleBodySchema = z.strictObject({ - roleId: z.string().transform(Number).pipe(z.int().positive()) + roleId: z.coerce.number().int().positive() }); registry.registerPath({ diff --git a/server/routers/role/getRole.ts b/server/routers/role/getRole.ts index a5c459968..a96926ff3 100644 --- a/server/routers/role/getRole.ts +++ b/server/routers/role/getRole.ts @@ -11,7 +11,7 @@ import { fromError } from "zod-validation-error"; import { OpenAPITags, registry } from "@server/openApi"; const getRoleSchema = z.strictObject({ - roleId: z.string().transform(Number).pipe(z.int().positive()) + roleId: z.coerce.number().int().positive() }); registry.registerPath({ diff --git a/server/routers/role/listRoleActions.ts b/server/routers/role/listRoleActions.ts index 31ef66044..8c0d309c2 100644 --- a/server/routers/role/listRoleActions.ts +++ b/server/routers/role/listRoleActions.ts @@ -10,7 +10,7 @@ import logger from "@server/logger"; import { fromError } from "zod-validation-error"; const listRoleActionsSchema = z.strictObject({ - roleId: z.string().transform(Number).pipe(z.int().positive()) + roleId: z.coerce.number().int().positive() }); export async function listRoleActions( diff --git a/server/routers/role/listRoleResources.ts b/server/routers/role/listRoleResources.ts index 7ba1fdab3..9a3bbf4d4 100644 --- a/server/routers/role/listRoleResources.ts +++ b/server/routers/role/listRoleResources.ts @@ -10,7 +10,7 @@ import logger from "@server/logger"; import { fromError } from "zod-validation-error"; const listRoleResourcesSchema = z.strictObject({ - roleId: z.string().transform(Number).pipe(z.int().positive()) + roleId: z.coerce.number().int().positive() }); export async function listRoleResources( diff --git a/server/routers/role/listRoleSites.ts b/server/routers/role/listRoleSites.ts index 1c9dcdbe1..6fe28ac6d 100644 --- a/server/routers/role/listRoleSites.ts +++ b/server/routers/role/listRoleSites.ts @@ -10,7 +10,7 @@ import logger from "@server/logger"; import { fromError } from "zod-validation-error"; const listRoleSitesSchema = z.strictObject({ - roleId: z.string().transform(Number).pipe(z.int().positive()) + roleId: z.coerce.number().int().positive() }); export async function listRoleSites( diff --git a/server/routers/role/removeRoleAction.ts b/server/routers/role/removeRoleAction.ts index 3c2ee7884..848fecf02 100644 --- a/server/routers/role/removeRoleAction.ts +++ b/server/routers/role/removeRoleAction.ts @@ -10,7 +10,7 @@ import logger from "@server/logger"; import { fromError } from "zod-validation-error"; const removeRoleActionParamsSchema = z.strictObject({ - roleId: z.string().transform(Number).pipe(z.int().positive()) + roleId: z.coerce.number().int().positive() }); const removeRoleActionSchema = z.strictObject({ diff --git a/server/routers/role/removeRoleResource.ts b/server/routers/role/removeRoleResource.ts index fac1c941a..db05eb952 100644 --- a/server/routers/role/removeRoleResource.ts +++ b/server/routers/role/removeRoleResource.ts @@ -10,11 +10,11 @@ import logger from "@server/logger"; import { fromError } from "zod-validation-error"; const removeRoleResourceParamsSchema = z.strictObject({ - roleId: z.string().transform(Number).pipe(z.int().positive()) + roleId: z.coerce.number().int().positive() }); const removeRoleResourceSchema = z.strictObject({ - resourceId: z.string().transform(Number).pipe(z.int().positive()) + resourceId: z.coerce.number().int().positive() }); export async function removeRoleResource( diff --git a/server/routers/role/removeRoleSite.ts b/server/routers/role/removeRoleSite.ts index 6c64820ea..b222fcfea 100644 --- a/server/routers/role/removeRoleSite.ts +++ b/server/routers/role/removeRoleSite.ts @@ -10,11 +10,11 @@ import logger from "@server/logger"; import { fromError } from "zod-validation-error"; const removeRoleSiteParamsSchema = z.strictObject({ - roleId: z.string().transform(Number).pipe(z.int().positive()) + roleId: z.coerce.number().int().positive() }); const removeRoleSiteSchema = z.strictObject({ - siteId: z.string().transform(Number).pipe(z.int().positive()) + siteId: z.coerce.number().int().positive() }); export async function removeRoleSite( diff --git a/server/routers/role/updateRole.ts b/server/routers/role/updateRole.ts index 7400e5823..feb5ecadc 100644 --- a/server/routers/role/updateRole.ts +++ b/server/routers/role/updateRole.ts @@ -14,7 +14,7 @@ import { OpenAPITags, registry } from "@server/openApi"; import { tierMatrix } from "@server/lib/billing/tierMatrix"; const updateRoleParamsSchema = z.strictObject({ - roleId: z.string().transform(Number).pipe(z.int().positive()) + roleId: z.coerce.number().int().positive() }); const sshSudoModeSchema = z.enum(["none", "full", "commands"]); diff --git a/server/routers/site/deleteSite.ts b/server/routers/site/deleteSite.ts index 10ecbbf1e..4c0c52dbe 100644 --- a/server/routers/site/deleteSite.ts +++ b/server/routers/site/deleteSite.ts @@ -16,7 +16,7 @@ import { usageService } from "@server/lib/billing/usageService"; import { FeatureId } from "@server/lib/billing"; const deleteSiteSchema = z.strictObject({ - siteId: z.string().transform(Number).pipe(z.int().positive()) + siteId: z.coerce.number().int().positive() }); registry.registerPath({ diff --git a/server/routers/site/listSiteRoles.ts b/server/routers/site/listSiteRoles.ts index a2cacf1d1..b0363325d 100644 --- a/server/routers/site/listSiteRoles.ts +++ b/server/routers/site/listSiteRoles.ts @@ -10,7 +10,7 @@ import logger from "@server/logger"; import { fromError } from "zod-validation-error"; const listSiteRolesSchema = z.strictObject({ - siteId: z.string().transform(Number).pipe(z.int().positive()) + siteId: z.coerce.number().int().positive() }); export async function listSiteRoles( diff --git a/server/routers/site/socketIntegration.ts b/server/routers/site/socketIntegration.ts index fe6e7b95e..85d5bc9dd 100644 --- a/server/routers/site/socketIntegration.ts +++ b/server/routers/site/socketIntegration.ts @@ -44,7 +44,7 @@ export interface Container { } const siteIdParamsSchema = z.strictObject({ - siteId: z.string().transform(stoi).pipe(z.int().positive()) + siteId: z.coerce.number().int().positive() }); const DockerStatusSchema = z.strictObject({ diff --git a/server/routers/site/updateSite.ts b/server/routers/site/updateSite.ts index 34d1341d7..22cd16f7b 100644 --- a/server/routers/site/updateSite.ts +++ b/server/routers/site/updateSite.ts @@ -12,7 +12,7 @@ import { OpenAPITags, registry } from "@server/openApi"; import { isValidCIDR } from "@server/lib/validators"; const updateSiteParamsSchema = z.strictObject({ - siteId: z.string().transform(Number).pipe(z.int().positive()) + siteId: z.coerce.number().int().positive() }); const updateSiteBodySchema = z diff --git a/server/routers/siteResource/batchAddClientToSiteResources.ts b/server/routers/siteResource/batchAddClientToSiteResources.ts index 34c7b58fe..8ee4b3068 100644 --- a/server/routers/siteResource/batchAddClientToSiteResources.ts +++ b/server/routers/siteResource/batchAddClientToSiteResources.ts @@ -22,7 +22,7 @@ import { const batchAddClientToSiteResourcesParamsSchema = z .object({ - clientId: z.string().transform(Number).pipe(z.number().int().positive()) + clientId: z.coerce.number().int().positive() }) .strict(); diff --git a/server/routers/siteResource/createSiteResource.ts b/server/routers/siteResource/createSiteResource.ts index bc80e8b41..9d0f786b3 100644 --- a/server/routers/siteResource/createSiteResource.ts +++ b/server/routers/siteResource/createSiteResource.ts @@ -42,7 +42,12 @@ const createSiteResourceParamsSchema = z.strictObject({ const createSiteResourceSchema = z .strictObject({ name: z.string().min(1).max(255), - niceId: z.string().optional(), + niceId: z.string().optional() + .openapi({ + description: + "Fully qualified domain name with optional wildcards, e.g., example.internal, *.example.internal, or host-0?.example.internal", + example: "service.example.internal" + }), // protocol: z.enum(["tcp", "udp"]).optional(), mode: z.enum(["host", "cidr", "http"]), ssl: z.boolean().optional(), // only used for http mode diff --git a/server/routers/siteResource/deleteSiteResource.ts b/server/routers/siteResource/deleteSiteResource.ts index 5a4eb1cc9..4326c6638 100644 --- a/server/routers/siteResource/deleteSiteResource.ts +++ b/server/routers/siteResource/deleteSiteResource.ts @@ -12,7 +12,7 @@ import { OpenAPITags, registry } from "@server/openApi"; import { rebuildClientAssociationsFromSiteResource } from "@server/lib/rebuildClientAssociations"; const deleteSiteResourceParamsSchema = z.strictObject({ - siteResourceId: z.string().transform(Number).pipe(z.int().positive()) + siteResourceId: z.coerce.number().int().positive() }); export type DeleteSiteResourceResponse = { diff --git a/server/routers/siteResource/listSiteResources.ts b/server/routers/siteResource/listSiteResources.ts index 61460c2d0..f199e815f 100644 --- a/server/routers/siteResource/listSiteResources.ts +++ b/server/routers/siteResource/listSiteResources.ts @@ -11,7 +11,7 @@ import logger from "@server/logger"; import { OpenAPITags, registry } from "@server/openApi"; const listSiteResourcesParamsSchema = z.strictObject({ - siteId: z.string().transform(Number).pipe(z.int().positive()), + siteId: z.coerce.number().int().positive(), orgId: z.string() }); diff --git a/server/routers/siteResource/updateSiteResource.ts b/server/routers/siteResource/updateSiteResource.ts index 7f8ef3e25..5e8695238 100644 --- a/server/routers/siteResource/updateSiteResource.ts +++ b/server/routers/siteResource/updateSiteResource.ts @@ -37,7 +37,7 @@ import { z } from "zod"; import { fromError } from "zod-validation-error"; const updateSiteResourceParamsSchema = z.strictObject({ - siteResourceId: z.string().transform(Number).pipe(z.int().positive()) + siteResourceId: z.coerce.number().int().positive() }); const updateSiteResourceSchema = z @@ -58,7 +58,12 @@ const updateSiteResourceSchema = z // mode: z.enum(["host", "cidr", "port"]).optional(), mode: z.enum(["host", "cidr", "http"]).optional(), ssl: z.boolean().optional(), - scheme: z.enum(["http", "https"]).nullish(), + scheme: z.enum(["http", "https"]).nullish() + .openapi({ + description: + "Fully qualified domain name with optional wildcards, e.g., example.internal, *.example.internal, or host-0?.example.internal", + example: "service.example.internal" + }), // proxyPort: z.int().positive().nullish(), destinationPort: z.int().positive().nullish(), destination: z.string().min(1).optional(), diff --git a/server/routers/target/createTarget.ts b/server/routers/target/createTarget.ts index c629e378e..31755eae8 100644 --- a/server/routers/target/createTarget.ts +++ b/server/routers/target/createTarget.ts @@ -26,7 +26,7 @@ import { } from "@server/lib/alerts"; const createTargetParamsSchema = z.strictObject({ - resourceId: z.string().transform(Number).pipe(z.int().positive()) + resourceId: z.coerce.number().int().positive() }); const createTargetSchema = z.strictObject({ diff --git a/server/routers/target/deleteTarget.ts b/server/routers/target/deleteTarget.ts index 685c41e7e..c9ef0eef2 100644 --- a/server/routers/target/deleteTarget.ts +++ b/server/routers/target/deleteTarget.ts @@ -13,7 +13,7 @@ import { OpenAPITags, registry } from "@server/openApi"; import { targetHealthCheck } from "@server/db"; const deleteTargetSchema = z.strictObject({ - targetId: z.string().transform(Number).pipe(z.int().positive()) + targetId: z.coerce.number().int().positive() }); registry.registerPath({ diff --git a/server/routers/target/getTarget.ts b/server/routers/target/getTarget.ts index 281c39906..e889a2149 100644 --- a/server/routers/target/getTarget.ts +++ b/server/routers/target/getTarget.ts @@ -11,7 +11,7 @@ import { fromError } from "zod-validation-error"; import { OpenAPITags, registry } from "@server/openApi"; const getTargetSchema = z.strictObject({ - targetId: z.string().transform(Number).pipe(z.int().positive()) + targetId: z.coerce.number().int().positive() }); type GetTargetResponse = Target & diff --git a/server/routers/target/listTargets.ts b/server/routers/target/listTargets.ts index df3d508c5..a64c5abdc 100644 --- a/server/routers/target/listTargets.ts +++ b/server/routers/target/listTargets.ts @@ -11,7 +11,7 @@ import logger from "@server/logger"; import { OpenAPITags, registry } from "@server/openApi"; const listTargetsParamsSchema = z.strictObject({ - resourceId: z.string().transform(Number).pipe(z.int().positive()) + resourceId: z.coerce.number().int().positive() }); const listTargetsSchema = z.object({ diff --git a/server/routers/target/updateTarget.ts b/server/routers/target/updateTarget.ts index 4533dc2e5..6eb319079 100644 --- a/server/routers/target/updateTarget.ts +++ b/server/routers/target/updateTarget.ts @@ -20,7 +20,7 @@ import { isTargetValid } from "@server/lib/validators"; import { OpenAPITags, registry } from "@server/openApi"; const updateTargetParamsSchema = z.strictObject({ - targetId: z.string().transform(Number).pipe(z.int().positive()) + targetId: z.coerce.number().int().positive() }); const updateTargetBodySchema = z diff --git a/server/routers/user/addUserRoleLegacy.ts b/server/routers/user/addUserRoleLegacy.ts index 6e5b805ab..2b5abf08f 100644 --- a/server/routers/user/addUserRoleLegacy.ts +++ b/server/routers/user/addUserRoleLegacy.ts @@ -14,7 +14,7 @@ import { rebuildClientAssociationsFromClient } from "@server/lib/rebuildClientAs /** Legacy path param order: /role/:roleId/add/:userId */ const addUserRoleLegacyParamsSchema = z.strictObject({ - roleId: z.string().transform(stoi).pipe(z.number()), + roleId: z.coerce.number(), userId: z.string() }); diff --git a/server/routers/user/addUserSite.ts b/server/routers/user/addUserSite.ts index ffb9f1ba9..bd60f8da7 100644 --- a/server/routers/user/addUserSite.ts +++ b/server/routers/user/addUserSite.ts @@ -11,7 +11,7 @@ import { fromError } from "zod-validation-error"; const addUserSiteSchema = z.strictObject({ userId: z.string(), - siteId: z.string().transform(Number).pipe(z.int().positive()) + siteId: z.coerce.number().int().positive() }); export async function addUserSite( diff --git a/server/routers/user/removeUserResource.ts b/server/routers/user/removeUserResource.ts index bdb0cda32..a27f42ea7 100644 --- a/server/routers/user/removeUserResource.ts +++ b/server/routers/user/removeUserResource.ts @@ -11,7 +11,7 @@ import { fromError } from "zod-validation-error"; const removeUserResourceSchema = z.strictObject({ userId: z.string(), - resourceId: z.string().transform(Number).pipe(z.int().positive()) + resourceId: z.coerce.number().int().positive() }); export async function removeUserResource(