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/lib/openapi/createApiResponseSchema.ts b/server/lib/openapi/createApiResponseSchema.ts new file mode 100644 index 000000000..32ce22f5f --- /dev/null +++ b/server/lib/openapi/createApiResponseSchema.ts @@ -0,0 +1,11 @@ +import { z } from "zod"; + +export function createApiResponseSchema(dataSchema: T) { + return z.object({ + data: dataSchema.nullable(), + success: z.boolean(), + error: z.boolean(), + message: z.string(), + status: z.number() + }); +} diff --git a/server/private/routers/alertRule/createAlertRule.ts b/server/private/routers/alertRule/createAlertRule.ts index f9b84ebab..f4a11ad3d 100644 --- a/server/private/routers/alertRule/createAlertRule.ts +++ b/server/private/routers/alertRule/createAlertRule.ts @@ -202,7 +202,22 @@ registry.registerPath({ } } }, - responses: {} + responses: { + 200: { + description: "Successful response", + content: { + "application/json": { + schema: z.object({ + data: z.unknown().nullable(), + success: z.boolean(), + error: z.boolean(), + message: z.string(), + status: z.number() + }) + } + } + } + } }); export async function createAlertRule( diff --git a/server/private/routers/alertRule/deleteAlertRule.ts b/server/private/routers/alertRule/deleteAlertRule.ts index 0988cd631..b475bb6c3 100644 --- a/server/private/routers/alertRule/deleteAlertRule.ts +++ b/server/private/routers/alertRule/deleteAlertRule.ts @@ -38,7 +38,22 @@ registry.registerPath({ request: { params: paramsSchema }, - responses: {} + responses: { + 200: { + description: "Successful response", + content: { + "application/json": { + schema: z.object({ + data: z.unknown().nullable(), + success: z.boolean(), + error: z.boolean(), + message: z.string(), + status: z.number() + }) + } + } + } + } }); export async function deleteAlertRule( diff --git a/server/private/routers/alertRule/getAlertRule.ts b/server/private/routers/alertRule/getAlertRule.ts index 9fd0157e3..dde9093fb 100644 --- a/server/private/routers/alertRule/getAlertRule.ts +++ b/server/private/routers/alertRule/getAlertRule.ts @@ -49,7 +49,22 @@ registry.registerPath({ request: { params: paramsSchema }, - responses: {} + responses: { + 200: { + description: "Successful response", + content: { + "application/json": { + schema: z.object({ + data: z.unknown().nullable(), + success: z.boolean(), + error: z.boolean(), + message: z.string(), + status: z.number() + }) + } + } + } + } }); export async function getAlertRule( diff --git a/server/private/routers/alertRule/listAlertRules.ts b/server/private/routers/alertRule/listAlertRules.ts index 9684b88a4..3931da44c 100644 --- a/server/private/routers/alertRule/listAlertRules.ts +++ b/server/private/routers/alertRule/listAlertRules.ts @@ -95,7 +95,22 @@ registry.registerPath({ query: querySchema, params: paramsSchema }, - responses: {} + responses: { + 200: { + description: "Successful response", + content: { + "application/json": { + schema: z.object({ + data: z.unknown().nullable(), + success: z.boolean(), + error: z.boolean(), + message: z.string(), + status: z.number() + }) + } + } + } + } }); export async function listAlertRules( diff --git a/server/private/routers/alertRule/updateAlertRule.ts b/server/private/routers/alertRule/updateAlertRule.ts index 358661ac9..690a97d29 100644 --- a/server/private/routers/alertRule/updateAlertRule.ts +++ b/server/private/routers/alertRule/updateAlertRule.ts @@ -13,6 +13,7 @@ import { Request, Response, NextFunction } from "express"; import { z } from "zod"; +import { createApiResponseSchema } from "@server/lib/openapi/createApiResponseSchema"; import { db } from "@server/db"; import { alertRules, @@ -148,6 +149,10 @@ const bodySchema = z export type UpdateAlertRuleResponse = { alertRuleId: number; }; +const UpdateAlertRuleResponseDataSchema = z.object({ + alertRuleId: z.number() +}); + registry.registerPath({ method: "post", @@ -164,7 +169,16 @@ registry.registerPath({ } } }, - responses: {} + responses: { + 200: { + description: "Successful response", + content: { + "application/json": { + schema: createApiResponseSchema(UpdateAlertRuleResponseDataSchema) + } + } + } + } }); export async function updateAlertRule( 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/auditLogs/exportAccessAuditLog.ts b/server/private/routers/auditLogs/exportAccessAuditLog.ts index 61a52778d..b83673b33 100644 --- a/server/private/routers/auditLogs/exportAccessAuditLog.ts +++ b/server/private/routers/auditLogs/exportAccessAuditLog.ts @@ -18,6 +18,7 @@ import { OpenAPITags } from "@server/openApi"; import createHttpError from "http-errors"; import HttpCode from "@server/types/HttpCode"; import { fromError } from "zod-validation-error"; +import { z } from "zod"; import logger from "@server/logger"; import { queryAccessAuditLogsParams, @@ -37,7 +38,22 @@ registry.registerPath({ query: queryAccessAuditLogsQuery, params: queryAccessAuditLogsParams }, - responses: {} + responses: { + 200: { + description: "Successful response", + content: { + "application/json": { + schema: z.object({ + data: z.unknown().nullable(), + success: z.boolean(), + error: z.boolean(), + message: z.string(), + status: z.number() + }) + } + } + } + } }); export async function exportAccessAuditLogs( diff --git a/server/private/routers/auditLogs/exportActionAuditLog.ts b/server/private/routers/auditLogs/exportActionAuditLog.ts index d0f025efa..0d707c41e 100644 --- a/server/private/routers/auditLogs/exportActionAuditLog.ts +++ b/server/private/routers/auditLogs/exportActionAuditLog.ts @@ -18,6 +18,7 @@ import { OpenAPITags } from "@server/openApi"; import createHttpError from "http-errors"; import HttpCode from "@server/types/HttpCode"; import { fromError } from "zod-validation-error"; +import { z } from "zod"; import logger from "@server/logger"; import { queryActionAuditLogsParams, @@ -37,7 +38,22 @@ registry.registerPath({ query: queryActionAuditLogsQuery, params: queryActionAuditLogsParams }, - responses: {} + responses: { + 200: { + description: "Successful response", + content: { + "application/json": { + schema: z.object({ + data: z.unknown().nullable(), + success: z.boolean(), + error: z.boolean(), + message: z.string(), + status: z.number() + }) + } + } + } + } }); export async function exportActionAuditLogs( diff --git a/server/private/routers/auditLogs/exportConnectionAuditLog.ts b/server/private/routers/auditLogs/exportConnectionAuditLog.ts index d4e5ec9b5..1115d23ad 100644 --- a/server/private/routers/auditLogs/exportConnectionAuditLog.ts +++ b/server/private/routers/auditLogs/exportConnectionAuditLog.ts @@ -18,6 +18,7 @@ import { OpenAPITags } from "@server/openApi"; import createHttpError from "http-errors"; import HttpCode from "@server/types/HttpCode"; import { fromError } from "zod-validation-error"; +import { z } from "zod"; import logger from "@server/logger"; import { queryConnectionAuditLogsParams, @@ -37,7 +38,22 @@ registry.registerPath({ query: queryConnectionAuditLogsQuery, params: queryConnectionAuditLogsParams }, - responses: {} + responses: { + 200: { + description: "Successful response", + content: { + "application/json": { + schema: z.object({ + data: z.unknown().nullable(), + success: z.boolean(), + error: z.boolean(), + message: z.string(), + status: z.number() + }) + } + } + } + } }); export async function exportConnectionAuditLogs( diff --git a/server/private/routers/auditLogs/queryAccessAuditLog.ts b/server/private/routers/auditLogs/queryAccessAuditLog.ts index 5f7ca7d7e..570621216 100644 --- a/server/private/routers/auditLogs/queryAccessAuditLog.ts +++ b/server/private/routers/auditLogs/queryAccessAuditLog.ts @@ -338,7 +338,22 @@ registry.registerPath({ query: queryAccessAuditLogsQuery, params: queryAccessAuditLogsParams }, - responses: {} + responses: { + 200: { + description: "Successful response", + content: { + "application/json": { + schema: z.object({ + data: z.unknown().nullable(), + success: z.boolean(), + error: z.boolean(), + message: z.string(), + status: z.number() + }) + } + } + } + } }); export async function queryAccessAuditLogs( diff --git a/server/private/routers/auditLogs/queryActionAuditLog.ts b/server/private/routers/auditLogs/queryActionAuditLog.ts index 2fbd7e59c..56f2f0201 100644 --- a/server/private/routers/auditLogs/queryActionAuditLog.ts +++ b/server/private/routers/auditLogs/queryActionAuditLog.ts @@ -165,7 +165,22 @@ registry.registerPath({ query: queryActionAuditLogsQuery, params: queryActionAuditLogsParams }, - responses: {} + responses: { + 200: { + description: "Successful response", + content: { + "application/json": { + schema: z.object({ + data: z.unknown().nullable(), + success: z.boolean(), + error: z.boolean(), + message: z.string(), + status: z.number() + }) + } + } + } + } }); export async function queryActionAuditLogs( diff --git a/server/private/routers/auditLogs/queryConnectionAuditLog.ts b/server/private/routers/auditLogs/queryConnectionAuditLog.ts index 4af495463..e6dd2f6a5 100644 --- a/server/private/routers/auditLogs/queryConnectionAuditLog.ts +++ b/server/private/routers/auditLogs/queryConnectionAuditLog.ts @@ -453,7 +453,22 @@ registry.registerPath({ query: queryConnectionAuditLogsQuery, params: queryConnectionAuditLogsParams }, - responses: {} + responses: { + 200: { + description: "Successful response", + content: { + "application/json": { + schema: z.object({ + data: z.unknown().nullable(), + success: z.boolean(), + error: z.boolean(), + message: z.string(), + status: z.number() + }) + } + } + } + } }); export async function queryConnectionAuditLogs( diff --git a/server/private/routers/billing/getOrgUsage.ts b/server/private/routers/billing/getOrgUsage.ts index 2429b1066..ad2102df5 100644 --- a/server/private/routers/billing/getOrgUsage.ts +++ b/server/private/routers/billing/getOrgUsage.ts @@ -39,7 +39,22 @@ const getOrgSchema = z.strictObject({ // request: { // params: getOrgSchema // }, -// responses: {} +// responses: { +// 200: { +// description: "Successful response", +// content: { +// "application/json": { +// schema: z.object({ +// data: z.unknown().nullable(), +// success: z.boolean(), +// error: z.boolean(), +// message: z.string(), +// status: z.number() +// }) +// } +// } +// } +// } // }); export async function getOrgUsage( diff --git a/server/private/routers/certificates/getCertificate.ts b/server/private/routers/certificates/getCertificate.ts index fca53e9bb..c365d3d7b 100644 --- a/server/private/routers/certificates/getCertificate.ts +++ b/server/private/routers/certificates/getCertificate.ts @@ -115,7 +115,22 @@ registry.registerPath({ orgId: z.string() }) }, - responses: {} + responses: { + 200: { + description: "Successful response", + content: { + "application/json": { + schema: z.object({ + data: z.unknown().nullable(), + success: z.boolean(), + error: z.boolean(), + message: z.string(), + status: z.number() + }) + } + } + } + } }); export async function getCertificate( diff --git a/server/private/routers/certificates/restartCertificate.ts b/server/private/routers/certificates/restartCertificate.ts index 492aacc09..50c747f7b 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,11 +36,26 @@ 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() }) }, - responses: {} + responses: { + 200: { + description: "Successful response", + content: { + "application/json": { + schema: z.object({ + data: z.unknown().nullable(), + success: z.boolean(), + error: z.boolean(), + message: z.string(), + status: z.number() + }) + } + } + } + } }); export async function restartCertificate( diff --git a/server/private/routers/domain/checkDomainNamespaceAvailability.ts b/server/private/routers/domain/checkDomainNamespaceAvailability.ts index 9caacb0c9..c5320c1f6 100644 --- a/server/private/routers/domain/checkDomainNamespaceAvailability.ts +++ b/server/private/routers/domain/checkDomainNamespaceAvailability.ts @@ -42,7 +42,22 @@ registry.registerPath({ params: paramsSchema, query: querySchema }, - responses: {} + responses: { + 200: { + description: "Successful response", + content: { + "application/json": { + schema: z.object({ + data: z.unknown().nullable(), + success: z.boolean(), + error: z.boolean(), + message: z.string(), + status: z.number() + }) + } + } + } + } }); export async function checkDomainNamespaceAvailability( diff --git a/server/private/routers/domain/listDomainNamespaces.ts b/server/private/routers/domain/listDomainNamespaces.ts index cb89f6a0d..88e8b7bd0 100644 --- a/server/private/routers/domain/listDomainNamespaces.ts +++ b/server/private/routers/domain/listDomainNamespaces.ts @@ -25,6 +25,7 @@ import { OpenAPITags, registry } from "@server/openApi"; import { isSubscribed } from "#private/lib/isSubscribed"; import { build } from "@server/build"; import { tierMatrix } from "@server/lib/billing/tierMatrix"; +import { createApiResponseSchema } from "@server/lib/openapi/createApiResponseSchema"; const paramsSchema = z.strictObject({}); @@ -65,6 +66,20 @@ export type ListDomainNamespacesResponse = { pagination: { total: number; limit: number; offset: number }; }; +const ListDomainNamespacesResponseDataSchema = z.object({ + domainNamespaces: z.array( + z.object({ + domainNamespaceId: z.string(), + domainId: z.string() + }) + ), + pagination: z.object({ + total: z.number(), + limit: z.number(), + offset: z.number() + }) +}); + registry.registerPath({ method: "get", path: "/domains/namepaces", @@ -73,7 +88,18 @@ registry.registerPath({ request: { query: querySchema }, - responses: {} + responses: { + 200: { + description: "Successful response", + content: { + "application/json": { + schema: createApiResponseSchema( + ListDomainNamespacesResponseDataSchema + ) + } + } + } + } }); export async function listDomainNamespaces( diff --git a/server/private/routers/eventStreamingDestination/createEventStreamingDestination.ts b/server/private/routers/eventStreamingDestination/createEventStreamingDestination.ts index cb8f95b07..5050c55e8 100644 --- a/server/private/routers/eventStreamingDestination/createEventStreamingDestination.ts +++ b/server/private/routers/eventStreamingDestination/createEventStreamingDestination.ts @@ -13,6 +13,7 @@ import { Request, Response, NextFunction } from "express"; import { z } from "zod"; +import { createApiResponseSchema } from "@server/lib/openapi/createApiResponseSchema"; import { db } from "@server/db"; import { eventStreamingDestinations } from "@server/db"; import { logStreamingManager } from "#private/lib/logStreaming"; @@ -42,6 +43,10 @@ const bodySchema = z.strictObject({ export type CreateEventStreamingDestinationResponse = { destinationId: number; }; +const CreateEventStreamingDestinationResponseDataSchema = z.object({ + destinationId: z.number() +}); + registry.registerPath({ method: "put", @@ -58,7 +63,16 @@ registry.registerPath({ } } }, - responses: {} + responses: { + 200: { + description: "Successful response", + content: { + "application/json": { + schema: createApiResponseSchema(CreateEventStreamingDestinationResponseDataSchema) + } + } + } + } }); export async function createEventStreamingDestination( diff --git a/server/private/routers/eventStreamingDestination/deleteEventStreamingDestination.ts b/server/private/routers/eventStreamingDestination/deleteEventStreamingDestination.ts index 2ab75d7c8..13b54ef17 100644 --- a/server/private/routers/eventStreamingDestination/deleteEventStreamingDestination.ts +++ b/server/private/routers/eventStreamingDestination/deleteEventStreamingDestination.ts @@ -38,7 +38,22 @@ registry.registerPath({ request: { params: paramsSchema }, - responses: {} + responses: { + 200: { + description: "Successful response", + content: { + "application/json": { + schema: z.object({ + data: z.unknown().nullable(), + success: z.boolean(), + error: z.boolean(), + message: z.string(), + status: z.number() + }) + } + } + } + } }); export async function deleteEventStreamingDestination( diff --git a/server/private/routers/eventStreamingDestination/listEventStreamingDestinations.ts b/server/private/routers/eventStreamingDestination/listEventStreamingDestinations.ts index 27b5d9a5b..e20f95b8e 100644 --- a/server/private/routers/eventStreamingDestination/listEventStreamingDestinations.ts +++ b/server/private/routers/eventStreamingDestination/listEventStreamingDestinations.ts @@ -24,6 +24,7 @@ import { OpenAPITags, registry } from "@server/openApi"; import { eq, sql } from "drizzle-orm"; import { decrypt } from "@server/lib/crypto"; import config from "@server/lib/config"; +import { createApiResponseSchema } from "@server/lib/openapi/createApiResponseSchema"; const paramsSchema = z.strictObject({ orgId: z.string().nonempty() @@ -67,6 +68,31 @@ export type ListEventStreamingDestinationsResponse = { }; }; +const ListEventStreamingDestinationsResponseDataSchema = z.object({ + destinations: z.array( + z.object({ + destinationId: z.number(), + orgId: z.string(), + type: z.string(), + config: z.string(), + enabled: z.boolean(), + lastError: z.string().nullable(), + lastErrorAt: z.number().nullable(), + createdAt: z.number(), + updatedAt: z.number(), + sendConnectionLogs: z.boolean(), + sendRequestLogs: z.boolean(), + sendActionLogs: z.boolean(), + sendAccessLogs: z.boolean() + }) + ), + pagination: z.object({ + total: z.number(), + limit: z.number(), + offset: z.number() + }) +}); + async function query(orgId: string, limit: number, offset: number) { const res = await db .select() @@ -88,7 +114,18 @@ registry.registerPath({ query: querySchema, params: paramsSchema }, - responses: {} + responses: { + 200: { + description: "Successful response", + content: { + "application/json": { + schema: createApiResponseSchema( + ListEventStreamingDestinationsResponseDataSchema + ) + } + } + } + } }); export async function listEventStreamingDestinations( diff --git a/server/private/routers/eventStreamingDestination/updateEventStreamingDestination.ts b/server/private/routers/eventStreamingDestination/updateEventStreamingDestination.ts index b7a9f8598..adbac2cca 100644 --- a/server/private/routers/eventStreamingDestination/updateEventStreamingDestination.ts +++ b/server/private/routers/eventStreamingDestination/updateEventStreamingDestination.ts @@ -13,6 +13,7 @@ import { Request, Response, NextFunction } from "express"; import { z } from "zod"; +import { createApiResponseSchema } from "@server/lib/openapi/createApiResponseSchema"; import { db } from "@server/db"; import { eventStreamingDestinations } from "@server/db"; import response from "@server/lib/response"; @@ -45,6 +46,10 @@ const bodySchema = z.strictObject({ export type UpdateEventStreamingDestinationResponse = { destinationId: number; }; +const UpdateEventStreamingDestinationResponseDataSchema = z.object({ + destinationId: z.number() +}); + registry.registerPath({ method: "post", @@ -61,7 +66,16 @@ registry.registerPath({ } } }, - responses: {} + responses: { + 200: { + description: "Successful response", + content: { + "application/json": { + schema: createApiResponseSchema(UpdateEventStreamingDestinationResponseDataSchema) + } + } + } + } }); export async function updateEventStreamingDestination( diff --git a/server/private/routers/healthChecks/createHealthCheck.ts b/server/private/routers/healthChecks/createHealthCheck.ts index 0fa5a77e9..aa3706833 100644 --- a/server/private/routers/healthChecks/createHealthCheck.ts +++ b/server/private/routers/healthChecks/createHealthCheck.ts @@ -13,6 +13,7 @@ import { Request, Response, NextFunction } from "express"; import { z } from "zod"; +import { createApiResponseSchema } from "@server/lib/openapi/createApiResponseSchema"; import { db, targetHealthCheck, newts, sites } from "@server/db"; import { eq } from "drizzle-orm"; import response from "@server/lib/response"; @@ -52,6 +53,10 @@ const bodySchema = z.strictObject({ export type CreateHealthCheckResponse = { targetHealthCheckId: number; }; +const CreateHealthCheckResponseDataSchema = z.object({ + targetHealthCheckId: z.number() +}); + registry.registerPath({ method: "put", @@ -68,7 +73,16 @@ registry.registerPath({ } } }, - responses: {} + responses: { + 200: { + description: "Successful response", + content: { + "application/json": { + schema: createApiResponseSchema(CreateHealthCheckResponseDataSchema) + } + } + } + } }); export async function createHealthCheck( diff --git a/server/private/routers/healthChecks/deleteHealthCheck.ts b/server/private/routers/healthChecks/deleteHealthCheck.ts index 530653aab..b5d054783 100644 --- a/server/private/routers/healthChecks/deleteHealthCheck.ts +++ b/server/private/routers/healthChecks/deleteHealthCheck.ts @@ -41,7 +41,22 @@ registry.registerPath({ request: { params: paramsSchema }, - responses: {} + responses: { + 200: { + description: "Successful response", + content: { + "application/json": { + schema: z.object({ + data: z.unknown().nullable(), + success: z.boolean(), + error: z.boolean(), + message: z.string(), + status: z.number() + }) + } + } + } + } }); export async function deleteHealthCheck( diff --git a/server/private/routers/healthChecks/listHealthChecks.ts b/server/private/routers/healthChecks/listHealthChecks.ts index 26cb75e9c..c0198d96e 100644 --- a/server/private/routers/healthChecks/listHealthChecks.ts +++ b/server/private/routers/healthChecks/listHealthChecks.ts @@ -68,7 +68,22 @@ registry.registerPath({ params: paramsSchema, query: querySchema }, - responses: {} + responses: { + 200: { + description: "Successful response", + content: { + "application/json": { + schema: z.object({ + data: z.unknown().nullable(), + success: z.boolean(), + error: z.boolean(), + message: z.string(), + status: z.number() + }) + } + } + } + } }); export async function listHealthChecks( diff --git a/server/private/routers/healthChecks/updateHealthCheck.ts b/server/private/routers/healthChecks/updateHealthCheck.ts index 4df92a5a7..f08324f9b 100644 --- a/server/private/routers/healthChecks/updateHealthCheck.ts +++ b/server/private/routers/healthChecks/updateHealthCheck.ts @@ -13,6 +13,7 @@ import { Request, Response, NextFunction } from "express"; import { z } from "zod"; +import { createApiResponseSchema } from "@server/lib/openapi/createApiResponseSchema"; import { db, targetHealthCheck, newts, sites } from "@server/db"; import response from "@server/lib/response"; import HttpCode from "@server/types/HttpCode"; @@ -81,6 +82,29 @@ export type UpdateHealthCheckResponse = { hcHealthyThreshold: number | null; hcUnhealthyThreshold: number | null; }; +const UpdateHealthCheckResponseDataSchema = z.object({ + targetHealthCheckId: z.number(), + name: z.string().nullable(), + siteId: z.number().nullable(), + hcEnabled: z.boolean(), + hcHealth: z.string().nullable(), + hcMode: z.string().nullable(), + hcHostname: z.string().nullable(), + hcPort: z.number().nullable(), + hcPath: z.string().nullable(), + hcScheme: z.string().nullable(), + hcMethod: z.string().nullable(), + hcInterval: z.number().nullable(), + hcUnhealthyInterval: z.number().nullable(), + hcTimeout: z.number().nullable(), + hcHeaders: z.string().nullable(), + hcFollowRedirects: z.boolean().nullable(), + hcStatus: z.number().nullable(), + hcTlsServerName: z.string().nullable(), + hcHealthyThreshold: z.number().nullable(), + hcUnhealthyThreshold: z.number().nullable() +}); + registry.registerPath({ method: "post", @@ -97,7 +121,16 @@ registry.registerPath({ } } }, - responses: {} + responses: { + 200: { + description: "Successful response", + content: { + "application/json": { + schema: createApiResponseSchema(UpdateHealthCheckResponseDataSchema) + } + } + } + } }); export async function updateHealthCheck( diff --git a/server/private/routers/orgIdp/createOrgOidcIdp.ts b/server/private/routers/orgIdp/createOrgOidcIdp.ts index 97928d99f..c829f0c84 100644 --- a/server/private/routers/orgIdp/createOrgOidcIdp.ts +++ b/server/private/routers/orgIdp/createOrgOidcIdp.ts @@ -63,7 +63,22 @@ registry.registerPath({ } } }, - responses: {} + responses: { + 200: { + description: "Successful response", + content: { + "application/json": { + schema: z.object({ + data: z.unknown().nullable(), + success: z.boolean(), + error: z.boolean(), + message: z.string(), + status: z.number() + }) + } + } + } + } }); export async function createOrgOidcIdp( diff --git a/server/private/routers/orgIdp/deleteOrgIdp.ts b/server/private/routers/orgIdp/deleteOrgIdp.ts index 9e5dfccee..2007f180e 100644 --- a/server/private/routers/orgIdp/deleteOrgIdp.ts +++ b/server/private/routers/orgIdp/deleteOrgIdp.ts @@ -38,7 +38,22 @@ registry.registerPath({ request: { params: paramsSchema }, - responses: {} + responses: { + 200: { + description: "Successful response", + content: { + "application/json": { + schema: z.object({ + data: z.unknown().nullable(), + success: z.boolean(), + error: z.boolean(), + message: z.string(), + status: z.number() + }) + } + } + } + } }); export async function deleteOrgIdp( diff --git a/server/private/routers/orgIdp/getOrgIdp.ts b/server/private/routers/orgIdp/getOrgIdp.ts index 9d4891f15..a2f29a57f 100644 --- a/server/private/routers/orgIdp/getOrgIdp.ts +++ b/server/private/routers/orgIdp/getOrgIdp.ts @@ -56,7 +56,22 @@ registry.registerPath({ request: { params: paramsSchema }, - responses: {} + responses: { + 200: { + description: "Successful response", + content: { + "application/json": { + schema: z.object({ + data: z.unknown().nullable(), + success: z.boolean(), + error: z.boolean(), + message: z.string(), + status: z.number() + }) + } + } + } + } }); export async function getOrgIdp( diff --git a/server/private/routers/orgIdp/listOrgIdps.ts b/server/private/routers/orgIdp/listOrgIdps.ts index ba73095d1..672fbc054 100644 --- a/server/private/routers/orgIdp/listOrgIdps.ts +++ b/server/private/routers/orgIdp/listOrgIdps.ts @@ -72,7 +72,22 @@ registry.registerPath({ query: querySchema, params: paramsSchema }, - responses: {} + responses: { + 200: { + description: "Successful response", + content: { + "application/json": { + schema: z.object({ + data: z.unknown().nullable(), + success: z.boolean(), + error: z.boolean(), + message: z.string(), + status: z.number() + }) + } + } + } + } }); export async function listOrgIdps( diff --git a/server/private/routers/orgIdp/updateOrgOidcIdp.ts b/server/private/routers/orgIdp/updateOrgOidcIdp.ts index 7c379f8ec..9d4698e3c 100644 --- a/server/private/routers/orgIdp/updateOrgOidcIdp.ts +++ b/server/private/routers/orgIdp/updateOrgOidcIdp.ts @@ -13,6 +13,7 @@ import { Request, Response, NextFunction } from "express"; import { z } from "zod"; +import { createApiResponseSchema } from "@server/lib/openapi/createApiResponseSchema"; import { db, idpOrg } from "@server/db"; import response from "@server/lib/response"; import HttpCode from "@server/types/HttpCode"; @@ -54,6 +55,10 @@ const bodySchema = z.strictObject({ export type UpdateOrgIdpResponse = { idpId: number; }; +const UpdateOrgIdpResponseDataSchema = z.object({ + idpId: z.number() +}); + registry.registerPath({ method: "post", @@ -70,7 +75,16 @@ registry.registerPath({ } } }, - responses: {} + responses: { + 200: { + description: "Successful response", + content: { + "application/json": { + schema: createApiResponseSchema(UpdateOrgIdpResponseDataSchema) + } + } + } + } }); export async function updateOrgOidcIdp( 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/ssh/signSshKey.ts b/server/private/routers/ssh/signSshKey.ts index 1cbb31657..7cc930483 100644 --- a/server/private/routers/ssh/signSshKey.ts +++ b/server/private/routers/ssh/signSshKey.ts @@ -93,7 +93,22 @@ export type SignSshKeyResponse = { // } // } // }, -// responses: {} +// responses: { +// 200: { +// description: "Successful response", +// content: { +// "application/json": { +// schema: z.object({ +// data: z.unknown().nullable(), +// success: z.boolean(), +// error: z.boolean(), +// message: z.string(), +// status: z.number() +// }) +// } +// } +// } +// } // }); export async function signSshKey( diff --git a/server/private/routers/user/addUserRole.ts b/server/private/routers/user/addUserRole.ts index 1789ca9c4..a59993a5d 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({ @@ -38,7 +38,22 @@ registry.registerPath({ request: { params: addUserRoleParamsSchema }, - responses: {} + responses: { + 200: { + description: "Successful response", + content: { + "application/json": { + schema: z.object({ + data: z.unknown().nullable(), + success: z.boolean(), + error: z.boolean(), + message: z.string(), + status: z.number() + }) + } + } + } + } }); export async function addUserRole( diff --git a/server/private/routers/user/removeUserRole.ts b/server/private/routers/user/removeUserRole.ts index 7cd805240..de099be6d 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({ @@ -39,7 +39,22 @@ registry.registerPath({ request: { params: removeUserRoleParamsSchema }, - responses: {} + responses: { + 200: { + description: "Successful response", + content: { + "application/json": { + schema: z.object({ + data: z.unknown().nullable(), + success: z.boolean(), + error: z.boolean(), + message: z.string(), + status: z.number() + }) + } + } + } + } }); export async function removeUserRole( diff --git a/server/routers/accessToken/deleteAccessToken.ts b/server/routers/accessToken/deleteAccessToken.ts index 4e18ddeb8..405d4e68e 100644 --- a/server/routers/accessToken/deleteAccessToken.ts +++ b/server/routers/accessToken/deleteAccessToken.ts @@ -22,7 +22,22 @@ registry.registerPath({ request: { params: deleteAccessTokenParamsSchema }, - responses: {} + responses: { + 200: { + description: "Successful response", + content: { + "application/json": { + schema: z.object({ + data: z.unknown().nullable(), + success: z.boolean(), + error: z.boolean(), + message: z.string(), + status: z.number() + }) + } + } + } + } }); export async function deleteAccessToken( diff --git a/server/routers/accessToken/generateAccessToken.ts b/server/routers/accessToken/generateAccessToken.ts index 9d0a7a7df..dd4a44b88 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< @@ -54,7 +54,22 @@ registry.registerPath({ } } }, - responses: {} + responses: { + 200: { + description: "Successful response", + content: { + "application/json": { + schema: z.object({ + data: z.unknown().nullable(), + success: z.boolean(), + error: z.boolean(), + message: z.string(), + status: z.number() + }) + } + } + } + } }); export async function generateAccessToken( diff --git a/server/routers/accessToken/listAccessTokens.ts b/server/routers/accessToken/listAccessTokens.ts index 55751df81..88ff07b27 100644 --- a/server/routers/accessToken/listAccessTokens.ts +++ b/server/routers/accessToken/listAccessTokens.ts @@ -129,7 +129,22 @@ registry.registerPath({ }), query: listAccessTokensSchema }, - responses: {} + responses: { + 200: { + description: "Successful response", + content: { + "application/json": { + schema: z.object({ + data: z.unknown().nullable(), + success: z.boolean(), + error: z.boolean(), + message: z.string(), + status: z.number() + }) + } + } + } + } }); registry.registerPath({ @@ -143,7 +158,22 @@ registry.registerPath({ }), query: listAccessTokensSchema }, - responses: {} + responses: { + 200: { + description: "Successful response", + content: { + "application/json": { + schema: z.object({ + data: z.unknown().nullable(), + success: z.boolean(), + error: z.boolean(), + message: z.string(), + status: z.number() + }) + } + } + } + } }); export async function listAccessTokens( diff --git a/server/routers/apiKeys/createOrgApiKey.ts b/server/routers/apiKeys/createOrgApiKey.ts index 91ef72bc8..de3fb32b7 100644 --- a/server/routers/apiKeys/createOrgApiKey.ts +++ b/server/routers/apiKeys/createOrgApiKey.ts @@ -2,6 +2,7 @@ import { NextFunction, Request, Response } from "express"; import { db } from "@server/db"; import HttpCode from "@server/types/HttpCode"; import { z } from "zod"; +import { createApiResponseSchema } from "@server/lib/openapi/createApiResponseSchema"; import { apiKeyOrg, apiKeys } from "@server/db"; import { fromError } from "zod-validation-error"; import createHttpError from "http-errors"; @@ -32,6 +33,14 @@ export type CreateOrgApiKeyResponse = { lastChars: string; createdAt: string; }; +const CreateOrgApiKeyResponseDataSchema = z.object({ + apiKeyId: z.string(), + name: z.string(), + apiKey: z.string(), + lastChars: z.string(), + createdAt: z.string() +}); + registry.registerPath({ method: "put", @@ -48,7 +57,16 @@ registry.registerPath({ } } }, - responses: {} + responses: { + 200: { + description: "Successful response", + content: { + "application/json": { + schema: createApiResponseSchema(CreateOrgApiKeyResponseDataSchema) + } + } + } + } }); export async function createOrgApiKey( diff --git a/server/routers/apiKeys/deleteApiKey.ts b/server/routers/apiKeys/deleteApiKey.ts index 2627fd636..07d00d727 100644 --- a/server/routers/apiKeys/deleteApiKey.ts +++ b/server/routers/apiKeys/deleteApiKey.ts @@ -22,7 +22,22 @@ registry.registerPath({ request: { params: paramsSchema }, - responses: {} + responses: { + 200: { + description: "Successful response", + content: { + "application/json": { + schema: z.object({ + data: z.unknown().nullable(), + success: z.boolean(), + error: z.boolean(), + message: z.string(), + status: z.number() + }) + } + } + } + } }); export async function deleteApiKey( diff --git a/server/routers/apiKeys/listApiKeyActions.ts b/server/routers/apiKeys/listApiKeyActions.ts index d816d4b38..364f3aee2 100644 --- a/server/routers/apiKeys/listApiKeyActions.ts +++ b/server/routers/apiKeys/listApiKeyActions.ts @@ -9,6 +9,7 @@ import { z } from "zod"; import { fromError } from "zod-validation-error"; import { eq } from "drizzle-orm"; import { OpenAPITags, registry } from "@server/openApi"; +import { createApiResponseSchema } from "@server/lib/openapi/createApiResponseSchema"; const paramsSchema = z.object({ apiKeyId: z.string().nonempty() @@ -44,6 +45,19 @@ export type ListApiKeyActionsResponse = { pagination: { total: number; limit: number; offset: number }; }; +const ListApiKeyActionsResponseDataSchema = z.object({ + actions: z.array( + z.object({ + actionId: z.string() + }) + ), + pagination: z.object({ + total: z.number(), + limit: z.number(), + offset: z.number() + }) +}); + registry.registerPath({ method: "get", path: "/org/{orgId}/api-key/{apiKeyId}/actions", @@ -53,7 +67,18 @@ registry.registerPath({ params: paramsSchema, query: querySchema }, - responses: {} + responses: { + 200: { + description: "Successful response", + content: { + "application/json": { + schema: createApiResponseSchema( + ListApiKeyActionsResponseDataSchema + ) + } + } + } + } }); export async function listApiKeyActions( diff --git a/server/routers/apiKeys/listOrgApiKeys.ts b/server/routers/apiKeys/listOrgApiKeys.ts index 24370665d..ba87a3033 100644 --- a/server/routers/apiKeys/listOrgApiKeys.ts +++ b/server/routers/apiKeys/listOrgApiKeys.ts @@ -9,6 +9,7 @@ import { z } from "zod"; import { fromError } from "zod-validation-error"; import { eq, and } from "drizzle-orm"; import { OpenAPITags, registry } from "@server/openApi"; +import { createApiResponseSchema } from "@server/lib/openapi/createApiResponseSchema"; const querySchema = z.object({ limit: z @@ -48,6 +49,23 @@ export type ListOrgApiKeysResponse = { pagination: { total: number; limit: number; offset: number }; }; +const ListOrgApiKeysResponseDataSchema = z.object({ + apiKeys: z.array( + z.object({ + apiKeyId: z.string(), + orgId: z.string(), + lastChars: z.string(), + createdAt: z.string(), + name: z.string() + }) + ), + pagination: z.object({ + total: z.number(), + limit: z.number(), + offset: z.number() + }) +}); + registry.registerPath({ method: "get", path: "/org/{orgId}/api-keys", @@ -57,7 +75,18 @@ registry.registerPath({ params: paramsSchema, query: querySchema }, - responses: {} + responses: { + 200: { + description: "Successful response", + content: { + "application/json": { + schema: createApiResponseSchema( + ListOrgApiKeysResponseDataSchema + ) + } + } + } + } }); export async function listOrgApiKeys( diff --git a/server/routers/apiKeys/setApiKeyActions.ts b/server/routers/apiKeys/setApiKeyActions.ts index 55b3670ac..e31e8b8b9 100644 --- a/server/routers/apiKeys/setApiKeyActions.ts +++ b/server/routers/apiKeys/setApiKeyActions.ts @@ -36,7 +36,22 @@ registry.registerPath({ } } }, - responses: {} + responses: { + 200: { + description: "Successful response", + content: { + "application/json": { + schema: z.object({ + data: z.unknown().nullable(), + success: z.boolean(), + error: z.boolean(), + message: z.string(), + status: z.number() + }) + } + } + } + } }); export async function setApiKeyActions( diff --git a/server/routers/auditLogs/exportRequestAuditLog.ts b/server/routers/auditLogs/exportRequestAuditLog.ts index 14054a5c3..1b4eede00 100644 --- a/server/routers/auditLogs/exportRequestAuditLog.ts +++ b/server/routers/auditLogs/exportRequestAuditLog.ts @@ -5,6 +5,7 @@ import { OpenAPITags } from "@server/openApi"; import createHttpError from "http-errors"; import HttpCode from "@server/types/HttpCode"; import { fromError } from "zod-validation-error"; +import { z } from "zod"; import logger from "@server/logger"; import { queryAccessAuditLogsQuery, @@ -28,7 +29,22 @@ registry.registerPath({ }), params: queryRequestAuditLogsParams }, - responses: {} + responses: { + 200: { + description: "Successful response", + content: { + "application/json": { + schema: z.object({ + data: z.unknown().nullable(), + success: z.boolean(), + error: z.boolean(), + message: z.string(), + status: z.number() + }) + } + } + } + } }); export async function exportRequestAuditLogs( diff --git a/server/routers/auditLogs/queryRequestAnalytics.ts b/server/routers/auditLogs/queryRequestAnalytics.ts index fba5bb9a2..62b0bd75e 100644 --- a/server/routers/auditLogs/queryRequestAnalytics.ts +++ b/server/routers/auditLogs/queryRequestAnalytics.ts @@ -156,7 +156,22 @@ registry.registerPath({ query: queryAccessAuditLogsQuery, params: queryRequestAuditLogsParams }, - responses: {} + responses: { + 200: { + description: "Successful response", + content: { + "application/json": { + schema: z.object({ + data: z.unknown().nullable(), + success: z.boolean(), + error: z.boolean(), + message: z.string(), + status: z.number() + }) + } + } + } + } }); export type QueryRequestAnalyticsResponse = Awaited>; diff --git a/server/routers/auditLogs/queryRequestAuditLog.ts b/server/routers/auditLogs/queryRequestAuditLog.ts index 01126353e..14bbb3c4d 100644 --- a/server/routers/auditLogs/queryRequestAuditLog.ts +++ b/server/routers/auditLogs/queryRequestAuditLog.ts @@ -241,7 +241,22 @@ registry.registerPath({ query: queryAccessAuditLogsQuery, params: queryRequestAuditLogsParams }, - responses: {} + responses: { + 200: { + description: "Successful response", + content: { + "application/json": { + schema: z.object({ + data: z.unknown().nullable(), + success: z.boolean(), + error: z.boolean(), + message: z.string(), + status: z.number() + }) + } + } + } + } }); async function queryUniqueFilterAttributes( 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/auth/lookupUser.ts b/server/routers/auth/lookupUser.ts index 83894927a..d086cf4e1 100644 --- a/server/routers/auth/lookupUser.ts +++ b/server/routers/auth/lookupUser.ts @@ -51,7 +51,22 @@ export type LookupUserResponse = { // request: { // body: lookupBodySchema // }, -// responses: {} +// responses: { +// 200: { +// description: "Successful response", +// content: { +// "application/json": { +// schema: z.object({ +// data: z.unknown().nullable(), +// success: z.boolean(), +// error: z.boolean(), +// message: z.string(), +// status: z.number() +// }) +// } +// } +// } +// } // }); export async function lookupUser( diff --git a/server/routers/blueprints/applyJSONBlueprint.ts b/server/routers/blueprints/applyJSONBlueprint.ts index fa7ed46ae..cd7026a9a 100644 --- a/server/routers/blueprints/applyJSONBlueprint.ts +++ b/server/routers/blueprints/applyJSONBlueprint.ts @@ -31,7 +31,22 @@ registry.registerPath({ } } }, - responses: {} + responses: { + 200: { + description: "Successful response", + content: { + "application/json": { + schema: z.object({ + data: z.unknown().nullable(), + success: z.boolean(), + error: z.boolean(), + message: z.string(), + status: z.number() + }) + } + } + } + } }); export async function applyJSONBlueprint( diff --git a/server/routers/blueprints/applyYAMLBlueprint.ts b/server/routers/blueprints/applyYAMLBlueprint.ts index 665943edd..5ddebeb67 100644 --- a/server/routers/blueprints/applyYAMLBlueprint.ts +++ b/server/routers/blueprints/applyYAMLBlueprint.ts @@ -54,7 +54,22 @@ registry.registerPath({ } } }, - responses: {} + responses: { + 200: { + description: "Successful response", + content: { + "application/json": { + schema: z.object({ + data: z.unknown().nullable(), + success: z.boolean(), + error: z.boolean(), + message: z.string(), + status: z.number() + }) + } + } + } + } }); export async function applyYAMLBlueprint( diff --git a/server/routers/blueprints/getBlueprint.ts b/server/routers/blueprints/getBlueprint.ts index ea2ac2d05..4bad8ee3f 100644 --- a/server/routers/blueprints/getBlueprint.ts +++ b/server/routers/blueprints/getBlueprint.ts @@ -7,13 +7,12 @@ import response from "@server/lib/response"; import HttpCode from "@server/types/HttpCode"; import createHttpError from "http-errors"; import logger from "@server/logger"; -import stoi from "@server/lib/stoi"; import { fromError } from "zod-validation-error"; 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() }); @@ -57,7 +56,22 @@ registry.registerPath({ request: { params: getBlueprintSchema }, - responses: {} + responses: { + 200: { + description: "Successful response", + content: { + "application/json": { + schema: z.object({ + data: z.unknown().nullable(), + success: z.boolean(), + error: z.boolean(), + message: z.string(), + status: z.number() + }) + } + } + } + } }); export async function getBlueprint( diff --git a/server/routers/blueprints/listBlueprints.ts b/server/routers/blueprints/listBlueprints.ts index 0235e7a18..f94bd9978 100644 --- a/server/routers/blueprints/listBlueprints.ts +++ b/server/routers/blueprints/listBlueprints.ts @@ -74,7 +74,22 @@ registry.registerPath({ }), query: listBluePrintsSchema }, - responses: {} + responses: { + 200: { + description: "Successful response", + content: { + "application/json": { + schema: z.object({ + data: z.unknown().nullable(), + success: z.boolean(), + error: z.boolean(), + message: z.string(), + status: z.number() + }) + } + } + } + } }); export async function listBlueprints( diff --git a/server/routers/client/archiveClient.ts b/server/routers/client/archiveClient.ts index 34b7bb912..25ea06f7d 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({ @@ -22,7 +22,22 @@ registry.registerPath({ request: { params: archiveClientSchema }, - responses: {} + responses: { + 200: { + description: "Successful response", + content: { + "application/json": { + schema: z.object({ + data: z.unknown().nullable(), + success: z.boolean(), + error: z.boolean(), + message: z.string(), + status: z.number() + }) + } + } + } + } }); export async function archiveClient( diff --git a/server/routers/client/blockClient.ts b/server/routers/client/blockClient.ts index bd760b3da..1a7cb48c4 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({ @@ -24,7 +24,22 @@ registry.registerPath({ request: { params: blockClientSchema }, - responses: {} + responses: { + 200: { + description: "Successful response", + content: { + "application/json": { + schema: z.object({ + data: z.unknown().nullable(), + success: z.boolean(), + error: z.boolean(), + message: z.string(), + status: z.number() + }) + } + } + } + } }); export async function blockClient( diff --git a/server/routers/client/createClient.ts b/server/routers/client/createClient.ts index 029f3c159..ddf8f3dbf 100644 --- a/server/routers/client/createClient.ts +++ b/server/routers/client/createClient.ts @@ -59,7 +59,22 @@ registry.registerPath({ } } }, - responses: {} + responses: { + 200: { + description: "Successful response", + content: { + "application/json": { + schema: z.object({ + data: z.unknown().nullable(), + success: z.boolean(), + error: z.boolean(), + message: z.string(), + status: z.number() + }) + } + } + } + } }); export async function createClient( diff --git a/server/routers/client/createUserClient.ts b/server/routers/client/createUserClient.ts index e702796fd..c51c4fe6a 100644 --- a/server/routers/client/createUserClient.ts +++ b/server/routers/client/createUserClient.ts @@ -60,7 +60,22 @@ registry.registerPath({ } } }, - responses: {} + responses: { + 200: { + description: "Successful response", + content: { + "application/json": { + schema: z.object({ + data: z.unknown().nullable(), + success: z.boolean(), + error: z.boolean(), + message: z.string(), + status: z.number() + }) + } + } + } + } }); export async function createUserClient( diff --git a/server/routers/client/deleteClient.ts b/server/routers/client/deleteClient.ts index 378639af6..21d6f1c9f 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({ @@ -25,7 +25,22 @@ registry.registerPath({ request: { params: deleteClientSchema }, - responses: {} + responses: { + 200: { + description: "Successful response", + content: { + "application/json": { + schema: z.object({ + data: z.unknown().nullable(), + success: z.boolean(), + error: z.boolean(), + message: z.string(), + status: z.number() + }) + } + } + } + } }); export async function deleteClient( diff --git a/server/routers/client/getClient.ts b/server/routers/client/getClient.ts index c97612b07..936d62b7d 100644 --- a/server/routers/client/getClient.ts +++ b/server/routers/client/getClient.ts @@ -253,7 +253,22 @@ registry.registerPath({ niceId: z.string() }) }, - responses: {} + responses: { + 200: { + description: "Successful response", + content: { + "application/json": { + schema: z.object({ + data: z.unknown().nullable(), + success: z.boolean(), + error: z.boolean(), + message: z.string(), + status: z.number() + }) + } + } + } + } }); registry.registerPath({ @@ -266,7 +281,22 @@ registry.registerPath({ clientId: z.number() }) }, - responses: {} + responses: { + 200: { + description: "Successful response", + content: { + "application/json": { + schema: z.object({ + data: z.unknown().nullable(), + success: z.boolean(), + error: z.boolean(), + message: z.string(), + status: z.number() + }) + } + } + } + } }); export async function getClient( diff --git a/server/routers/client/listClients.ts b/server/routers/client/listClients.ts index f5d69857d..e763619b3 100644 --- a/server/routers/client/listClients.ts +++ b/server/routers/client/listClients.ts @@ -186,7 +186,22 @@ registry.registerPath({ query: listClientsSchema, params: listClientsParamsSchema }, - responses: {} + responses: { + 200: { + description: "Successful response", + content: { + "application/json": { + schema: z.object({ + data: z.unknown().nullable(), + success: z.boolean(), + error: z.boolean(), + message: z.string(), + status: z.number() + }) + } + } + } + } }); export async function listClients( diff --git a/server/routers/client/listUserDevices.ts b/server/routers/client/listUserDevices.ts index 567eb0d6b..82b52577e 100644 --- a/server/routers/client/listUserDevices.ts +++ b/server/routers/client/listUserDevices.ts @@ -213,7 +213,22 @@ registry.registerPath({ query: listUserDevicesSchema, params: listUserDevicesParamsSchema }, - responses: {} + responses: { + 200: { + description: "Successful response", + content: { + "application/json": { + schema: z.object({ + data: z.unknown().nullable(), + success: z.boolean(), + error: z.boolean(), + message: z.string(), + status: z.number() + }) + } + } + } + } }); export async function listUserDevices( diff --git a/server/routers/client/pickClientDefaults.ts b/server/routers/client/pickClientDefaults.ts index 5dffd77d7..2ed7ddbce 100644 --- a/server/routers/client/pickClientDefaults.ts +++ b/server/routers/client/pickClientDefaults.ts @@ -6,6 +6,7 @@ import logger from "@server/logger"; import { generateId } from "@server/auth/sessions/app"; import { getNextAvailableClientSubnet } from "@server/lib/ip"; import { z } from "zod"; +import { createApiResponseSchema } from "@server/lib/openapi/createApiResponseSchema"; import { fromError } from "zod-validation-error"; import { OpenAPITags, registry } from "@server/openApi"; @@ -14,6 +15,12 @@ export type PickClientDefaultsResponse = { olmSecret: string; subnet: string; }; +const PickClientDefaultsResponseDataSchema = z.object({ + olmId: z.string(), + olmSecret: z.string(), + subnet: z.string() +}); + const pickClientDefaultsSchema = z.strictObject({ orgId: z.string() @@ -27,7 +34,16 @@ registry.registerPath({ request: { params: pickClientDefaultsSchema }, - responses: {} + responses: { + 200: { + description: "Successful response", + content: { + "application/json": { + schema: createApiResponseSchema(PickClientDefaultsResponseDataSchema) + } + } + } + } }); export async function pickClientDefaults( diff --git a/server/routers/client/unarchiveClient.ts b/server/routers/client/unarchiveClient.ts index 62c5c17c8..e8b3aef5a 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({ @@ -22,7 +22,22 @@ registry.registerPath({ request: { params: unarchiveClientSchema }, - responses: {} + responses: { + 200: { + description: "Successful response", + content: { + "application/json": { + schema: z.object({ + data: z.unknown().nullable(), + success: z.boolean(), + error: z.boolean(), + message: z.string(), + status: z.number() + }) + } + } + } + } }); export async function unarchiveClient( diff --git a/server/routers/client/unblockClient.ts b/server/routers/client/unblockClient.ts index a16a1030a..fa02394a5 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({ @@ -22,7 +22,22 @@ registry.registerPath({ request: { params: unblockClientSchema }, - responses: {} + responses: { + 200: { + description: "Successful response", + content: { + "application/json": { + schema: z.object({ + data: z.unknown().nullable(), + success: z.boolean(), + error: z.boolean(), + message: z.string(), + status: z.number() + }) + } + } + } + } }); export async function unblockClient( diff --git a/server/routers/client/updateClient.ts b/server/routers/client/updateClient.ts index 8ef01a2fc..f8794960c 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({ @@ -36,7 +36,22 @@ registry.registerPath({ } } }, - responses: {} + responses: { + 200: { + description: "Successful response", + content: { + "application/json": { + schema: z.object({ + data: z.unknown().nullable(), + success: z.boolean(), + error: z.boolean(), + message: z.string(), + status: z.number() + }) + } + } + } + } }); export async function updateClient( diff --git a/server/routers/domain/getDNSRecords.ts b/server/routers/domain/getDNSRecords.ts index 5a373a11a..8a557c6cf 100644 --- a/server/routers/domain/getDNSRecords.ts +++ b/server/routers/domain/getDNSRecords.ts @@ -37,7 +37,22 @@ registry.registerPath({ orgId: z.string() }) }, - responses: {} + responses: { + 200: { + description: "Successful response", + content: { + "application/json": { + schema: z.object({ + data: z.unknown().nullable(), + success: z.boolean(), + error: z.boolean(), + message: z.string(), + status: z.number() + }) + } + } + } + } }); export async function getDNSRecords( diff --git a/server/routers/domain/getDomain.ts b/server/routers/domain/getDomain.ts index 1a5b1a369..3c484505b 100644 --- a/server/routers/domain/getDomain.ts +++ b/server/routers/domain/getDomain.ts @@ -38,7 +38,22 @@ registry.registerPath({ orgId: z.string() }) }, - responses: {} + responses: { + 200: { + description: "Successful response", + content: { + "application/json": { + schema: z.object({ + data: z.unknown().nullable(), + success: z.boolean(), + error: z.boolean(), + message: z.string(), + status: z.number() + }) + } + } + } + } }); export async function getDomain( diff --git a/server/routers/domain/listDomains.ts b/server/routers/domain/listDomains.ts index 94dddb1cf..07a7c9276 100644 --- a/server/routers/domain/listDomains.ts +++ b/server/routers/domain/listDomains.ts @@ -9,6 +9,7 @@ import { eq, sql } from "drizzle-orm"; import logger from "@server/logger"; import { fromError } from "zod-validation-error"; import { OpenAPITags, registry } from "@server/openApi"; +import { createApiResponseSchema } from "@server/lib/openapi/createApiResponseSchema"; const listDomainsParamsSchema = z.strictObject({ orgId: z.string() @@ -56,6 +57,28 @@ export type ListDomainsResponse = { pagination: { total: number; limit: number; offset: number }; }; +const ListDomainsResponseDataSchema = z.object({ + domains: z.array( + z.object({ + domainId: z.string(), + baseDomain: z.string(), + verified: z.boolean(), + type: z.string().nullable(), + failed: z.boolean(), + tries: z.number(), + configManaged: z.boolean(), + certResolver: z.string().nullable(), + preferWildcardCert: z.boolean().nullable(), + errorMessage: z.string().nullable() + }) + ), + pagination: z.object({ + total: z.number(), + limit: z.number(), + offset: z.number() + }) +}); + registry.registerPath({ method: "get", path: "/org/{orgId}/domains", @@ -67,7 +90,16 @@ registry.registerPath({ }), query: listDomainsSchema }, - responses: {} + responses: { + 200: { + description: "Successful response", + content: { + "application/json": { + schema: createApiResponseSchema(ListDomainsResponseDataSchema) + } + } + } + } }); export async function listDomains( diff --git a/server/routers/domain/updateDomain.ts b/server/routers/domain/updateDomain.ts index 64e78641d..61b99f542 100644 --- a/server/routers/domain/updateDomain.ts +++ b/server/routers/domain/updateDomain.ts @@ -1,5 +1,6 @@ import { Request, Response, NextFunction } from "express"; import { z } from "zod"; +import { createApiResponseSchema } from "@server/lib/openapi/createApiResponseSchema"; import { db, domains, orgDomains } from "@server/db"; import response from "@server/lib/response"; import HttpCode from "@server/types/HttpCode"; @@ -24,6 +25,12 @@ export type UpdateDomainResponse = { certResolver: string | null; preferWildcardCert: boolean | null; }; +const UpdateDomainResponseDataSchema = z.object({ + domainId: z.string(), + certResolver: z.string().nullable(), + preferWildcardCert: z.boolean().nullable() +}); + registry.registerPath({ method: "patch", @@ -36,7 +43,16 @@ registry.registerPath({ orgId: z.string() }) }, - responses: {} + responses: { + 200: { + description: "Successful response", + content: { + "application/json": { + schema: createApiResponseSchema(UpdateDomainResponseDataSchema) + } + } + } + } }); export async function updateOrgDomain( diff --git a/server/routers/idp/createIdpOrgPolicy.ts b/server/routers/idp/createIdpOrgPolicy.ts index da12bc12a..7a69740d1 100644 --- a/server/routers/idp/createIdpOrgPolicy.ts +++ b/server/routers/idp/createIdpOrgPolicy.ts @@ -1,5 +1,6 @@ import { Request, Response, NextFunction } from "express"; import { z } from "zod"; +import { createApiResponseSchema } from "@server/lib/openapi/createApiResponseSchema"; import { db } from "@server/db"; import response from "@server/lib/response"; import HttpCode from "@server/types/HttpCode"; @@ -22,6 +23,8 @@ const bodySchema = z.strictObject({ }); export type CreateIdpOrgPolicyResponse = {}; +const CreateIdpOrgPolicyResponseDataSchema = z.object({}); + registry.registerPath({ method: "put", @@ -38,7 +41,16 @@ registry.registerPath({ } } }, - responses: {} + responses: { + 200: { + description: "Successful response", + content: { + "application/json": { + schema: createApiResponseSchema(CreateIdpOrgPolicyResponseDataSchema) + } + } + } + } }); export async function createIdpOrgPolicy( diff --git a/server/routers/idp/createOidcIdp.ts b/server/routers/idp/createOidcIdp.ts index 0f0cc0cce..813ab0ea5 100644 --- a/server/routers/idp/createOidcIdp.ts +++ b/server/routers/idp/createOidcIdp.ts @@ -1,5 +1,6 @@ import { Request, Response, NextFunction } from "express"; import { z } from "zod"; +import { createApiResponseSchema } from "@server/lib/openapi/createApiResponseSchema"; import { db } from "@server/db"; import response from "@server/lib/response"; import HttpCode from "@server/types/HttpCode"; @@ -33,6 +34,11 @@ export type CreateIdpResponse = { idpId: number; redirectUrl: string; }; +const CreateIdpResponseDataSchema = z.object({ + idpId: z.number(), + redirectUrl: z.string() +}); + registry.registerPath({ method: "put", @@ -48,7 +54,16 @@ registry.registerPath({ } } }, - responses: {} + responses: { + 200: { + description: "Successful response", + content: { + "application/json": { + schema: createApiResponseSchema(CreateIdpResponseDataSchema) + } + } + } + } }); export async function createOidcIdp( diff --git a/server/routers/idp/deleteIdp.ts b/server/routers/idp/deleteIdp.ts index 8c15eada1..e6d330263 100644 --- a/server/routers/idp/deleteIdp.ts +++ b/server/routers/idp/deleteIdp.ts @@ -25,7 +25,22 @@ registry.registerPath({ request: { params: paramsSchema }, - responses: {} + responses: { + 200: { + description: "Successful response", + content: { + "application/json": { + schema: z.object({ + data: z.unknown().nullable(), + success: z.boolean(), + error: z.boolean(), + message: z.string(), + status: z.number() + }) + } + } + } + } }); export async function deleteIdp( diff --git a/server/routers/idp/deleteIdpOrgPolicy.ts b/server/routers/idp/deleteIdpOrgPolicy.ts index 6793474a8..716de4a9d 100644 --- a/server/routers/idp/deleteIdpOrgPolicy.ts +++ b/server/routers/idp/deleteIdpOrgPolicy.ts @@ -23,7 +23,22 @@ registry.registerPath({ request: { params: paramsSchema }, - responses: {} + responses: { + 200: { + description: "Successful response", + content: { + "application/json": { + schema: z.object({ + data: z.unknown().nullable(), + success: z.boolean(), + error: z.boolean(), + message: z.string(), + status: z.number() + }) + } + } + } + } }); export async function deleteIdpOrgPolicy( diff --git a/server/routers/idp/getIdp.ts b/server/routers/idp/getIdp.ts index db199f2d6..23f7990d5 100644 --- a/server/routers/idp/getIdp.ts +++ b/server/routers/idp/getIdp.ts @@ -38,7 +38,22 @@ registry.registerPath({ request: { params: paramsSchema }, - responses: {} + responses: { + 200: { + description: "Successful response", + content: { + "application/json": { + schema: z.object({ + data: z.unknown().nullable(), + success: z.boolean(), + error: z.boolean(), + message: z.string(), + status: z.number() + }) + } + } + } + } }); export async function getIdp( diff --git a/server/routers/idp/listIdpOrgPolicies.ts b/server/routers/idp/listIdpOrgPolicies.ts index ecfd6f33a..3e183f69a 100644 --- a/server/routers/idp/listIdpOrgPolicies.ts +++ b/server/routers/idp/listIdpOrgPolicies.ts @@ -9,6 +9,7 @@ import { eq, sql } from "drizzle-orm"; import logger from "@server/logger"; import { fromError } from "zod-validation-error"; import { OpenAPITags, registry } from "@server/openApi"; +import { createApiResponseSchema } from "@server/lib/openapi/createApiResponseSchema"; const paramsSchema = z.object({ idpId: z.coerce.number() @@ -44,6 +45,21 @@ export type ListIdpOrgPoliciesResponse = { pagination: { total: number; limit: number; offset: number }; }; +const ListIdpOrgPoliciesResponseDataSchema = z.object({ + policies: z.array( + z.object({ + idpId: z.number(), + orgId: z.string(), + assignDefaultOrgRoleId: z.number().nullable() + }) + ), + pagination: z.object({ + total: z.number(), + limit: z.number(), + offset: z.number() + }) +}); + registry.registerPath({ method: "get", path: "/idp/{idpId}/org", @@ -53,7 +69,18 @@ registry.registerPath({ params: paramsSchema, query: querySchema }, - responses: {} + responses: { + 200: { + description: "Successful response", + content: { + "application/json": { + schema: createApiResponseSchema( + ListIdpOrgPoliciesResponseDataSchema + ) + } + } + } + } }); export async function listIdpOrgPolicies( diff --git a/server/routers/idp/listIdps.ts b/server/routers/idp/listIdps.ts index ca0fd5fbf..e66c556a2 100644 --- a/server/routers/idp/listIdps.ts +++ b/server/routers/idp/listIdps.ts @@ -9,6 +9,7 @@ import { eq, sql } from "drizzle-orm"; import logger from "@server/logger"; import { fromError } from "zod-validation-error"; import { OpenAPITags, registry } from "@server/openApi"; +import { createApiResponseSchema } from "@server/lib/openapi/createApiResponseSchema"; const querySchema = z.strictObject({ limit: z @@ -54,6 +55,25 @@ export type ListIdpsResponse = { }; }; +const ListIdpsResponseDataSchema = z.object({ + idps: z.array( + z.object({ + idpId: z.number(), + name: z.string(), + type: z.string(), + variant: z.string().nullable(), + orgCount: z.number(), + autoProvision: z.boolean().nullable(), + tags: z.string().nullable() + }) + ), + pagination: z.object({ + total: z.number(), + limit: z.number(), + offset: z.number() + }) +}); + registry.registerPath({ method: "get", path: "/idp", @@ -62,7 +82,16 @@ registry.registerPath({ request: { query: querySchema }, - responses: {} + responses: { + 200: { + description: "Successful response", + content: { + "application/json": { + schema: createApiResponseSchema(ListIdpsResponseDataSchema) + } + } + } + } }); export async function listIdps( diff --git a/server/routers/idp/updateIdpOrgPolicy.ts b/server/routers/idp/updateIdpOrgPolicy.ts index 5a9f882d4..73ca68059 100644 --- a/server/routers/idp/updateIdpOrgPolicy.ts +++ b/server/routers/idp/updateIdpOrgPolicy.ts @@ -1,5 +1,6 @@ import { Request, Response, NextFunction } from "express"; import { z } from "zod"; +import { createApiResponseSchema } from "@server/lib/openapi/createApiResponseSchema"; import { db } from "@server/db"; import response from "@server/lib/response"; import HttpCode from "@server/types/HttpCode"; @@ -21,6 +22,8 @@ const bodySchema = z.strictObject({ }); export type UpdateIdpOrgPolicyResponse = {}; +const UpdateIdpOrgPolicyResponseDataSchema = z.object({}); + registry.registerPath({ method: "post", @@ -37,7 +40,16 @@ registry.registerPath({ } } }, - responses: {} + responses: { + 200: { + description: "Successful response", + content: { + "application/json": { + schema: createApiResponseSchema(UpdateIdpOrgPolicyResponseDataSchema) + } + } + } + } }); export async function updateIdpOrgPolicy( diff --git a/server/routers/idp/updateOidcIdp.ts b/server/routers/idp/updateOidcIdp.ts index 905b32013..69b77770f 100644 --- a/server/routers/idp/updateOidcIdp.ts +++ b/server/routers/idp/updateOidcIdp.ts @@ -1,5 +1,6 @@ import { Request, Response, NextFunction } from "express"; import { z } from "zod"; +import { createApiResponseSchema } from "@server/lib/openapi/createApiResponseSchema"; import { db } from "@server/db"; import response from "@server/lib/response"; import HttpCode from "@server/types/HttpCode"; @@ -38,6 +39,10 @@ const bodySchema = z.strictObject({ export type UpdateIdpResponse = { idpId: number; }; +const UpdateIdpResponseDataSchema = z.object({ + idpId: z.number() +}); + registry.registerPath({ method: "post", @@ -54,7 +59,16 @@ registry.registerPath({ } } }, - responses: {} + responses: { + 200: { + description: "Successful response", + content: { + "application/json": { + schema: createApiResponseSchema(UpdateIdpResponseDataSchema) + } + } + } + } }); export async function updateOidcIdp( diff --git a/server/routers/olm/createUserOlm.ts b/server/routers/olm/createUserOlm.ts index 105a94ff2..486546ada 100644 --- a/server/routers/olm/createUserOlm.ts +++ b/server/routers/olm/createUserOlm.ts @@ -43,7 +43,22 @@ export type CreateOlmResponse = { // }, // params: paramsSchema // }, -// responses: {} +// responses: { +// 200: { +// description: "Successful response", +// content: { +// "application/json": { +// schema: z.object({ +// data: z.unknown().nullable(), +// success: z.boolean(), +// error: z.boolean(), +// message: z.string(), +// status: z.number() +// }) +// } +// } +// } +// } // }); export async function createUserOlm( diff --git a/server/routers/olm/deleteUserOlm.ts b/server/routers/olm/deleteUserOlm.ts index fb1f5604c..df9328dd3 100644 --- a/server/routers/olm/deleteUserOlm.ts +++ b/server/routers/olm/deleteUserOlm.ts @@ -28,7 +28,22 @@ const paramsSchema = z // request: { // params: paramsSchema // }, -// responses: {} +// responses: { +// 200: { +// description: "Successful response", +// content: { +// "application/json": { +// schema: z.object({ +// data: z.unknown().nullable(), +// success: z.boolean(), +// error: z.boolean(), +// message: z.string(), +// status: z.number() +// }) +// } +// } +// } +// } // }); export async function deleteUserOlm( diff --git a/server/routers/olm/getUserOlm.ts b/server/routers/olm/getUserOlm.ts index f7ba038a7..534ae3bb7 100644 --- a/server/routers/olm/getUserOlm.ts +++ b/server/routers/olm/getUserOlm.ts @@ -30,7 +30,22 @@ const querySchema = z.object({ // request: { // params: paramsSchema // }, -// responses: {} +// responses: { +// 200: { +// description: "Successful response", +// content: { +// "application/json": { +// schema: z.object({ +// data: z.unknown().nullable(), +// success: z.boolean(), +// error: z.boolean(), +// message: z.string(), +// status: z.number() +// }) +// } +// } +// } +// } // }); export async function getUserOlm( diff --git a/server/routers/olm/listUserOlms.ts b/server/routers/olm/listUserOlms.ts index ac92afc87..d6ac26819 100644 --- a/server/routers/olm/listUserOlms.ts +++ b/server/routers/olm/listUserOlms.ts @@ -41,7 +41,22 @@ const paramsSchema = z // query: querySchema, // params: paramsSchema // }, -// responses: {} +// responses: { +// 200: { +// description: "Successful response", +// content: { +// "application/json": { +// schema: z.object({ +// data: z.unknown().nullable(), +// success: z.boolean(), +// error: z.boolean(), +// message: z.string(), +// status: z.number() +// }) +// } +// } +// } +// } // }); export type ListUserOlmsResponse = { diff --git a/server/routers/org/checkOrgUserAccess.ts b/server/routers/org/checkOrgUserAccess.ts index 19e39c4fe..c40c85aaa 100644 --- a/server/routers/org/checkOrgUserAccess.ts +++ b/server/routers/org/checkOrgUserAccess.ts @@ -83,7 +83,22 @@ registry.registerPath({ request: { params: paramsSchema }, - responses: {} + responses: { + 200: { + description: "Successful response", + content: { + "application/json": { + schema: z.object({ + data: z.unknown().nullable(), + success: z.boolean(), + error: z.boolean(), + message: z.string(), + status: z.number() + }) + } + } + } + } }); export async function checkOrgUserAccess( diff --git a/server/routers/org/createOrg.ts b/server/routers/org/createOrg.ts index 5fccbcd1f..a195e3a33 100644 --- a/server/routers/org/createOrg.ts +++ b/server/routers/org/createOrg.ts @@ -74,7 +74,22 @@ registry.registerPath({ } } }, - responses: {} + responses: { + 200: { + description: "Successful response", + content: { + "application/json": { + schema: z.object({ + data: z.unknown().nullable(), + success: z.boolean(), + error: z.boolean(), + message: z.string(), + status: z.number() + }) + } + } + } + } }); export async function createOrg( diff --git a/server/routers/org/deleteOrg.ts b/server/routers/org/deleteOrg.ts index 7de021622..5beffb536 100644 --- a/server/routers/org/deleteOrg.ts +++ b/server/routers/org/deleteOrg.ts @@ -24,7 +24,22 @@ registry.registerPath({ request: { params: deleteOrgSchema }, - responses: {} + responses: { + 200: { + description: "Successful response", + content: { + "application/json": { + schema: z.object({ + data: z.unknown().nullable(), + success: z.boolean(), + error: z.boolean(), + message: z.string(), + status: z.number() + }) + } + } + } + } }); export async function deleteOrg( diff --git a/server/routers/org/getOrg.ts b/server/routers/org/getOrg.ts index a30dcc1ce..642efb5b9 100644 --- a/server/routers/org/getOrg.ts +++ b/server/routers/org/getOrg.ts @@ -1,5 +1,6 @@ import { Request, Response, NextFunction } from "express"; import { z } from "zod"; +import { createApiResponseSchema } from "@server/lib/openapi/createApiResponseSchema"; import { db } from "@server/db"; import { Org, orgs } from "@server/db"; import { eq } from "drizzle-orm"; @@ -17,6 +18,10 @@ const getOrgSchema = z.strictObject({ export type GetOrgResponse = { org: Org; }; +const GetOrgResponseDataSchema = z.object({ + org: z.object({}).passthrough() +}); + registry.registerPath({ method: "get", @@ -26,7 +31,16 @@ registry.registerPath({ request: { params: getOrgSchema }, - responses: {} + responses: { + 200: { + description: "Successful response", + content: { + "application/json": { + schema: createApiResponseSchema(GetOrgResponseDataSchema) + } + } + } + } }); export async function getOrg( diff --git a/server/routers/org/listOrgs.ts b/server/routers/org/listOrgs.ts index 5819dc254..63b5b62b1 100644 --- a/server/routers/org/listOrgs.ts +++ b/server/routers/org/listOrgs.ts @@ -9,6 +9,7 @@ import { sql, inArray, eq } from "drizzle-orm"; import logger from "@server/logger"; import { fromZodError } from "zod-validation-error"; import { OpenAPITags, registry } from "@server/openApi"; +import { createApiResponseSchema } from "@server/lib/openapi/createApiResponseSchema"; const listOrgsSchema = z.object({ limit: z @@ -33,7 +34,16 @@ registry.registerPath({ request: { query: listOrgsSchema }, - responses: {} + responses: { + 200: { + description: "Successful response", + content: { + "application/json": { + schema: createApiResponseSchema(ListOrgsResponseDataSchema) + } + } + } + } }); export type ListOrgsResponse = { @@ -41,6 +51,15 @@ export type ListOrgsResponse = { pagination: { total: number; limit: number; offset: number }; }; +const ListOrgsResponseDataSchema = z.object({ + orgs: z.array(z.object({}).passthrough()), + pagination: z.object({ + total: z.number(), + limit: z.number(), + offset: z.number() + }) +}); + export async function listOrgs( req: Request, res: Response, diff --git a/server/routers/org/listUserOrgs.ts b/server/routers/org/listUserOrgs.ts index 8e6ce649d..465dd5801 100644 --- a/server/routers/org/listUserOrgs.ts +++ b/server/routers/org/listUserOrgs.ts @@ -37,7 +37,22 @@ const listOrgsSchema = z.object({ // request: { // query: listOrgsSchema // }, -// responses: {} +// responses: { +// 200: { +// description: "Successful response", +// content: { +// "application/json": { +// schema: z.object({ +// data: z.unknown().nullable(), +// success: z.boolean(), +// error: z.boolean(), +// message: z.string(), +// status: z.number() +// }) +// } +// } +// } +// } // }); type ResponseOrg = Org & { diff --git a/server/routers/org/resetOrgBandwidth.ts b/server/routers/org/resetOrgBandwidth.ts index b98e2e406..41ad761e3 100644 --- a/server/routers/org/resetOrgBandwidth.ts +++ b/server/routers/org/resetOrgBandwidth.ts @@ -21,7 +21,22 @@ registry.registerPath({ request: { params: resetOrgBandwidthParamsSchema }, - responses: {} + responses: { + 200: { + description: "Successful response", + content: { + "application/json": { + schema: z.object({ + data: z.unknown().nullable(), + success: z.boolean(), + error: z.boolean(), + message: z.string(), + status: z.number() + }) + } + } + } + } }); export async function resetOrgBandwidth( diff --git a/server/routers/org/updateOrg.ts b/server/routers/org/updateOrg.ts index 4eca9a9a6..1eb77f277 100644 --- a/server/routers/org/updateOrg.ts +++ b/server/routers/org/updateOrg.ts @@ -61,7 +61,22 @@ registry.registerPath({ } } }, - responses: {} + responses: { + 200: { + description: "Successful response", + content: { + "application/json": { + schema: z.object({ + data: z.unknown().nullable(), + success: z.boolean(), + error: z.boolean(), + message: z.string(), + status: z.number() + }) + } + } + } + } }); export async function updateOrg( diff --git a/server/routers/resource/addEmailToResourceWhitelist.ts b/server/routers/resource/addEmailToResourceWhitelist.ts index 27ba34699..1ad10000f 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({ @@ -40,7 +40,22 @@ registry.registerPath({ } } }, - responses: {} + responses: { + 200: { + description: "Successful response", + content: { + "application/json": { + schema: z.object({ + data: z.unknown().nullable(), + success: z.boolean(), + error: z.boolean(), + message: z.string(), + status: z.number() + }) + } + } + } + } }); export async function addEmailToResourceWhitelist( diff --git a/server/routers/resource/addRoleToResource.ts b/server/routers/resource/addRoleToResource.ts index 7a5c8fb63..8192f779c 100644 --- a/server/routers/resource/addRoleToResource.ts +++ b/server/routers/resource/addRoleToResource.ts @@ -40,7 +40,22 @@ registry.registerPath({ } } }, - responses: {} + responses: { + 200: { + description: "Successful response", + content: { + "application/json": { + schema: z.object({ + data: z.unknown().nullable(), + success: z.boolean(), + error: z.boolean(), + message: z.string(), + status: z.number() + }) + } + } + } + } }); export async function addRoleToResource( diff --git a/server/routers/resource/addUserToResource.ts b/server/routers/resource/addUserToResource.ts index 9880d9c27..3a75b0043 100644 --- a/server/routers/resource/addUserToResource.ts +++ b/server/routers/resource/addUserToResource.ts @@ -40,7 +40,22 @@ registry.registerPath({ } } }, - responses: {} + responses: { + 200: { + description: "Successful response", + content: { + "application/json": { + schema: z.object({ + data: z.unknown().nullable(), + success: z.boolean(), + error: z.boolean(), + message: z.string(), + status: z.number() + }) + } + } + } + } }); export async function addUserToResource( 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/createResource.ts b/server/routers/resource/createResource.ts index f8b7551e9..cbe86e829 100644 --- a/server/routers/resource/createResource.ts +++ b/server/routers/resource/createResource.ts @@ -96,7 +96,22 @@ registry.registerPath({ } } }, - responses: {} + responses: { + 200: { + description: "Successful response", + content: { + "application/json": { + schema: z.object({ + data: z.unknown().nullable(), + success: z.boolean(), + error: z.boolean(), + message: z.string(), + status: z.number() + }) + } + } + } + } }); export async function createResource( diff --git a/server/routers/resource/createResourceRule.ts b/server/routers/resource/createResourceRule.ts index 200ee07d4..19f0449fd 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({ @@ -43,7 +43,22 @@ registry.registerPath({ } } }, - responses: {} + responses: { + 200: { + description: "Successful response", + content: { + "application/json": { + schema: z.object({ + data: z.unknown().nullable(), + success: z.boolean(), + error: z.boolean(), + message: z.string(), + status: z.number() + }) + } + } + } + } }); export async function createResourceRule( diff --git a/server/routers/resource/deleteResource.ts b/server/routers/resource/deleteResource.ts index 682fd6aa9..b44ad862b 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({ @@ -26,7 +26,22 @@ registry.registerPath({ request: { params: deleteResourceSchema }, - responses: {} + responses: { + 200: { + description: "Successful response", + content: { + "application/json": { + schema: z.object({ + data: z.unknown().nullable(), + success: z.boolean(), + error: z.boolean(), + message: z.string(), + status: z.number() + }) + } + } + } + } }); export async function deleteResource( diff --git a/server/routers/resource/deleteResourceRule.ts b/server/routers/resource/deleteResourceRule.ts index 0fe9007f8..ef40ecaab 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({ @@ -23,7 +23,22 @@ registry.registerPath({ request: { params: deleteResourceRuleSchema }, - responses: {} + responses: { + 200: { + description: "Successful response", + content: { + "application/json": { + schema: z.object({ + data: z.unknown().nullable(), + success: z.boolean(), + error: z.boolean(), + message: z.string(), + status: z.number() + }) + } + } + } + } }); export async function deleteResourceRule( 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/getResource.ts b/server/routers/resource/getResource.ts index 7a52c0a85..3a650578c 100644 --- a/server/routers/resource/getResource.ts +++ b/server/routers/resource/getResource.ts @@ -60,7 +60,22 @@ registry.registerPath({ niceId: z.string() }) }, - responses: {} + responses: { + 200: { + description: "Successful response", + content: { + "application/json": { + schema: z.object({ + data: z.unknown().nullable(), + success: z.boolean(), + error: z.boolean(), + message: z.string(), + status: z.number() + }) + } + } + } + } }); registry.registerPath({ @@ -73,7 +88,22 @@ registry.registerPath({ resourceId: z.number() }) }, - responses: {} + responses: { + 200: { + description: "Successful response", + content: { + "application/json": { + schema: z.object({ + data: z.unknown().nullable(), + success: z.boolean(), + error: z.boolean(), + message: z.string(), + status: z.number() + }) + } + } + } + } }); export async function getResource( diff --git a/server/routers/resource/getResourceWhitelist.ts b/server/routers/resource/getResourceWhitelist.ts index 5eb05184f..bb6105b0b 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) { @@ -35,7 +35,22 @@ registry.registerPath({ request: { params: getResourceWhitelistSchema }, - responses: {} + responses: { + 200: { + description: "Successful response", + content: { + "application/json": { + schema: z.object({ + data: z.unknown().nullable(), + success: z.boolean(), + error: z.boolean(), + message: z.string(), + status: z.number() + }) + } + } + } + } }); export async function getResourceWhitelist( diff --git a/server/routers/resource/listAllResourceNames.ts b/server/routers/resource/listAllResourceNames.ts index 37ae945fd..7c4f18b35 100644 --- a/server/routers/resource/listAllResourceNames.ts +++ b/server/routers/resource/listAllResourceNames.ts @@ -39,7 +39,22 @@ registry.registerPath({ orgId: z.string() }) }, - responses: {} + responses: { + 200: { + description: "Successful response", + content: { + "application/json": { + schema: z.object({ + data: z.unknown().nullable(), + success: z.boolean(), + error: z.boolean(), + message: z.string(), + status: z.number() + }) + } + } + } + } }); export async function listAllResourceNames( diff --git a/server/routers/resource/listResourceRoles.ts b/server/routers/resource/listResourceRoles.ts index 4af631191..ffff8c602 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) { @@ -39,7 +39,22 @@ registry.registerPath({ request: { params: listResourceRolesSchema }, - responses: {} + responses: { + 200: { + description: "Successful response", + content: { + "application/json": { + schema: z.object({ + data: z.unknown().nullable(), + success: z.boolean(), + error: z.boolean(), + message: z.string(), + status: z.number() + }) + } + } + } + } }); export async function listResourceRoles( diff --git a/server/routers/resource/listResourceRules.ts b/server/routers/resource/listResourceRules.ts index 92d738cbb..b1b2581ed 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({ @@ -61,7 +61,22 @@ registry.registerPath({ params: listResourceRulesParamsSchema, query: listResourceRulesSchema }, - responses: {} + responses: { + 200: { + description: "Successful response", + content: { + "application/json": { + schema: z.object({ + data: z.unknown().nullable(), + success: z.boolean(), + error: z.boolean(), + message: z.string(), + status: z.number() + }) + } + } + } + } }); export async function listResourceRules( diff --git a/server/routers/resource/listResourceUsers.ts b/server/routers/resource/listResourceUsers.ts index 2802ac827..292edf3cd 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) { @@ -42,7 +42,22 @@ registry.registerPath({ request: { params: listResourceUsersSchema }, - responses: {} + responses: { + 200: { + description: "Successful response", + content: { + "application/json": { + schema: z.object({ + data: z.unknown().nullable(), + success: z.boolean(), + error: z.boolean(), + message: z.string(), + status: z.number() + }) + } + } + } + } }); export async function listResourceUsers( diff --git a/server/routers/resource/listResources.ts b/server/routers/resource/listResources.ts index 16a82e400..13ade46d2 100644 --- a/server/routers/resource/listResources.ts +++ b/server/routers/resource/listResources.ts @@ -228,7 +228,22 @@ registry.registerPath({ }), query: listResourcesSchema }, - responses: {} + responses: { + 200: { + description: "Successful response", + content: { + "application/json": { + schema: z.object({ + data: z.unknown().nullable(), + success: z.boolean(), + error: z.boolean(), + message: z.string(), + status: z.number() + }) + } + } + } + } }); export async function listResources( diff --git a/server/routers/resource/listUserResourceAliases.ts b/server/routers/resource/listUserResourceAliases.ts index 663700e64..ae71c3708 100644 --- a/server/routers/resource/listUserResourceAliases.ts +++ b/server/routers/resource/listUserResourceAliases.ts @@ -76,7 +76,22 @@ export type ListUserResourceAliasesResponse = PaginatedResponse<{ // }), // query: listUserResourceAliasesQuerySchema // }, -// responses: {} +// responses: { +// 200: { +// description: "Successful response", +// content: { +// "application/json": { +// schema: z.object({ +// data: z.unknown().nullable(), +// success: z.boolean(), +// error: z.boolean(), +// message: z.string(), +// status: z.number() +// }) +// } +// } +// } +// } // }); export async function listUserResourceAliases( diff --git a/server/routers/resource/removeEmailFromResourceWhitelist.ts b/server/routers/resource/removeEmailFromResourceWhitelist.ts index f419c4136..4e7dc8904 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({ @@ -40,7 +40,22 @@ registry.registerPath({ } } }, - responses: {} + responses: { + 200: { + description: "Successful response", + content: { + "application/json": { + schema: z.object({ + data: z.unknown().nullable(), + success: z.boolean(), + error: z.boolean(), + message: z.string(), + status: z.number() + }) + } + } + } + } }); export async function removeEmailFromResourceWhitelist( diff --git a/server/routers/resource/removeRoleFromResource.ts b/server/routers/resource/removeRoleFromResource.ts index eef55277b..66da1d377 100644 --- a/server/routers/resource/removeRoleFromResource.ts +++ b/server/routers/resource/removeRoleFromResource.ts @@ -40,7 +40,22 @@ registry.registerPath({ } } }, - responses: {} + responses: { + 200: { + description: "Successful response", + content: { + "application/json": { + schema: z.object({ + data: z.unknown().nullable(), + success: z.boolean(), + error: z.boolean(), + message: z.string(), + status: z.number() + }) + } + } + } + } }); export async function removeRoleFromResource( diff --git a/server/routers/resource/removeUserFromResource.ts b/server/routers/resource/removeUserFromResource.ts index 152316e62..17f2380a2 100644 --- a/server/routers/resource/removeUserFromResource.ts +++ b/server/routers/resource/removeUserFromResource.ts @@ -40,7 +40,22 @@ registry.registerPath({ } } }, - responses: {} + responses: { + 200: { + description: "Successful response", + content: { + "application/json": { + schema: z.object({ + data: z.unknown().nullable(), + success: z.boolean(), + error: z.boolean(), + message: z.string(), + status: z.number() + }) + } + } + } + } }); export async function removeUserFromResource( diff --git a/server/routers/resource/setResourceHeaderAuth.ts b/server/routers/resource/setResourceHeaderAuth.ts index 9c28bf9f0..cec9ad96a 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({ @@ -40,7 +40,22 @@ registry.registerPath({ } } }, - responses: {} + responses: { + 200: { + description: "Successful response", + content: { + "application/json": { + schema: z.object({ + data: z.unknown().nullable(), + success: z.boolean(), + error: z.boolean(), + message: z.string(), + status: z.number() + }) + } + } + } + } }); export async function setResourceHeaderAuth( diff --git a/server/routers/resource/setResourcePassword.ts b/server/routers/resource/setResourcePassword.ts index d9fcb5f0b..0f89bccd4 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({ @@ -36,7 +36,22 @@ registry.registerPath({ } } }, - responses: {} + responses: { + 200: { + description: "Successful response", + content: { + "application/json": { + schema: z.object({ + data: z.unknown().nullable(), + success: z.boolean(), + error: z.boolean(), + message: z.string(), + status: z.number() + }) + } + } + } + } }); export async function setResourcePassword( diff --git a/server/routers/resource/setResourcePincode.ts b/server/routers/resource/setResourcePincode.ts index 54057ba08..9135529fb 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({ @@ -40,7 +40,22 @@ registry.registerPath({ } } }, - responses: {} + responses: { + 200: { + description: "Successful response", + content: { + "application/json": { + schema: z.object({ + data: z.unknown().nullable(), + success: z.boolean(), + error: z.boolean(), + message: z.string(), + status: z.number() + }) + } + } + } + } }); export async function setResourcePincode( diff --git a/server/routers/resource/setResourceRoles.ts b/server/routers/resource/setResourceRoles.ts index ff3cd7377..0015e373a 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({ @@ -34,7 +34,22 @@ registry.registerPath({ } } }, - responses: {} + responses: { + 200: { + description: "Successful response", + content: { + "application/json": { + schema: z.object({ + data: z.unknown().nullable(), + success: z.boolean(), + error: z.boolean(), + message: z.string(), + status: z.number() + }) + } + } + } + } }); export async function setResourceRoles( diff --git a/server/routers/resource/setResourceUsers.ts b/server/routers/resource/setResourceUsers.ts index 46b5d1523..4c2b7457a 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({ @@ -34,7 +34,22 @@ registry.registerPath({ } } }, - responses: {} + responses: { + 200: { + description: "Successful response", + content: { + "application/json": { + schema: z.object({ + data: z.unknown().nullable(), + success: z.boolean(), + error: z.boolean(), + message: z.string(), + status: z.number() + }) + } + } + } + } }); export async function setResourceUsers( diff --git a/server/routers/resource/setResourceWhitelist.ts b/server/routers/resource/setResourceWhitelist.ts index aa5dc8cdb..ff6c9fd02 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({ @@ -43,7 +43,22 @@ registry.registerPath({ } } }, - responses: {} + responses: { + 200: { + description: "Successful response", + content: { + "application/json": { + schema: z.object({ + data: z.unknown().nullable(), + success: z.boolean(), + error: z.boolean(), + message: z.string(), + status: z.number() + }) + } + } + } + } }); export async function setResourceWhitelist( diff --git a/server/routers/resource/updateResource.ts b/server/routers/resource/updateResource.ts index 0a7052dce..2b67c6b91 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 @@ -201,7 +201,22 @@ registry.registerPath({ } } }, - responses: {} + responses: { + 200: { + description: "Successful response", + content: { + "application/json": { + schema: z.object({ + data: z.unknown().nullable(), + success: z.boolean(), + error: z.boolean(), + message: z.string(), + status: z.number() + }) + } + } + } + } }); export async function updateResource( diff --git a/server/routers/resource/updateResourceRule.ts b/server/routers/resource/updateResourceRule.ts index 4074fd93a..92b251b42 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 @@ -50,7 +50,22 @@ registry.registerPath({ } } }, - responses: {} + responses: { + 200: { + description: "Successful response", + content: { + "application/json": { + schema: z.object({ + data: z.unknown().nullable(), + success: z.boolean(), + error: z.boolean(), + message: z.string(), + status: z.number() + }) + } + } + } + } }); export async function updateResourceRule( 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/createRole.ts b/server/routers/role/createRole.ts index 1fad18d72..d7aceb743 100644 --- a/server/routers/role/createRole.ts +++ b/server/routers/role/createRole.ts @@ -56,7 +56,22 @@ registry.registerPath({ } } }, - responses: {} + responses: { + 200: { + description: "Successful response", + content: { + "application/json": { + schema: z.object({ + data: z.unknown().nullable(), + success: z.boolean(), + error: z.boolean(), + message: z.string(), + status: z.number() + }) + } + } + } + } }); export async function createRole( diff --git a/server/routers/role/deleteRole.ts b/server/routers/role/deleteRole.ts index 4d2797250..d3b56b37d 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()) +const deleteRoleBodySchema = z.strictObject({ + roleId: z.coerce.number().int().positive() }); registry.registerPath({ @@ -28,12 +28,27 @@ registry.registerPath({ body: { content: { "application/json": { - schema: deelteRoleBodySchema + schema: deleteRoleBodySchema } } } }, - responses: {} + responses: { + 200: { + description: "Successful response", + content: { + "application/json": { + schema: z.object({ + data: z.unknown().nullable(), + success: z.boolean(), + error: z.boolean(), + message: z.string(), + status: z.number() + }) + } + } + } + } }); export async function deleteRole( @@ -52,7 +67,7 @@ export async function deleteRole( ); } - const parsedBody = deelteRoleBodySchema.safeParse(req.body); + const parsedBody = deleteRoleBodySchema.safeParse(req.body); if (!parsedBody.success) { return next( createHttpError( diff --git a/server/routers/role/getRole.ts b/server/routers/role/getRole.ts index a5c459968..c90471551 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({ @@ -22,7 +22,22 @@ registry.registerPath({ request: { params: getRoleSchema }, - responses: {} + responses: { + 200: { + description: "Successful response", + content: { + "application/json": { + schema: z.object({ + data: z.unknown().nullable(), + success: z.boolean(), + error: z.boolean(), + message: z.string(), + status: z.number() + }) + } + } + } + } }); export async function getRole( 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/listRoles.ts b/server/routers/role/listRoles.ts index ba46e40c4..ace5e1fc1 100644 --- a/server/routers/role/listRoles.ts +++ b/server/routers/role/listRoles.ts @@ -98,7 +98,22 @@ registry.registerPath({ params: listRolesParamsSchema, query: listRolesSchema }, - responses: {} + responses: { + 200: { + description: "Successful response", + content: { + "application/json": { + schema: z.object({ + data: z.unknown().nullable(), + success: z.boolean(), + error: z.boolean(), + message: z.string(), + status: z.number() + }) + } + } + } + } }); export async function listRoles( 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..29f43850f 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"]); @@ -53,7 +53,22 @@ registry.registerPath({ } } }, - responses: {} + responses: { + 200: { + description: "Successful response", + content: { + "application/json": { + schema: z.object({ + data: z.unknown().nullable(), + success: z.boolean(), + error: z.boolean(), + message: z.string(), + status: z.number() + }) + } + } + } + } }); export async function updateRole( diff --git a/server/routers/site/createSite.ts b/server/routers/site/createSite.ts index 29eb4935d..7c8cc7a6b 100644 --- a/server/routers/site/createSite.ts +++ b/server/routers/site/createSite.ts @@ -78,7 +78,22 @@ registry.registerPath({ } } }, - responses: {} + responses: { + 200: { + description: "Successful response", + content: { + "application/json": { + schema: z.object({ + data: z.unknown().nullable(), + success: z.boolean(), + error: z.boolean(), + message: z.string(), + status: z.number() + }) + } + } + } + } }); export async function createSite( diff --git a/server/routers/site/deleteSite.ts b/server/routers/site/deleteSite.ts index a3542f970..47efba910 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({ @@ -27,7 +27,22 @@ registry.registerPath({ request: { params: deleteSiteSchema }, - responses: {} + responses: { + 200: { + description: "Successful response", + content: { + "application/json": { + schema: z.object({ + data: z.unknown().nullable(), + success: z.boolean(), + error: z.boolean(), + message: z.string(), + status: z.number() + }) + } + } + } + } }); export async function deleteSite( diff --git a/server/routers/site/getSite.ts b/server/routers/site/getSite.ts index a16547b8d..020fbd36f 100644 --- a/server/routers/site/getSite.ts +++ b/server/routers/site/getSite.ts @@ -61,7 +61,22 @@ registry.registerPath({ niceId: z.string() }) }, - responses: {} + responses: { + 200: { + description: "Successful response", + content: { + "application/json": { + schema: z.object({ + data: z.unknown().nullable(), + success: z.boolean(), + error: z.boolean(), + message: z.string(), + status: z.number() + }) + } + } + } + } }); registry.registerPath({ @@ -74,7 +89,22 @@ registry.registerPath({ siteId: z.number() }) }, - responses: {} + responses: { + 200: { + description: "Successful response", + content: { + "application/json": { + schema: z.object({ + data: z.unknown().nullable(), + success: z.boolean(), + error: z.boolean(), + message: z.string(), + status: z.number() + }) + } + } + } + } }); export async function getSite( 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/listSites.ts b/server/routers/site/listSites.ts index fc4ea5be1..da530f66e 100644 --- a/server/routers/site/listSites.ts +++ b/server/routers/site/listSites.ts @@ -248,7 +248,22 @@ registry.registerPath({ params: listSitesParamsSchema, query: listSitesSchema }, - responses: {} + responses: { + 200: { + description: "Successful response", + content: { + "application/json": { + schema: z.object({ + data: z.unknown().nullable(), + success: z.boolean(), + error: z.boolean(), + message: z.string(), + status: z.number() + }) + } + } + } + } }); export async function listSites( diff --git a/server/routers/site/pickSiteDefaults.ts b/server/routers/site/pickSiteDefaults.ts index 4e6e3bb17..39d1e459d 100644 --- a/server/routers/site/pickSiteDefaults.ts +++ b/server/routers/site/pickSiteDefaults.ts @@ -15,6 +15,7 @@ import config from "@server/lib/config"; import { OpenAPITags, registry } from "@server/openApi"; import { fromError } from "zod-validation-error"; import { z } from "zod"; +import { createApiResponseSchema } from "@server/lib/openapi/createApiResponseSchema"; import { listExitNodes } from "#dynamic/lib/exitNodes"; export type PickSiteDefaultsResponse = { @@ -29,6 +30,19 @@ export type PickSiteDefaultsResponse = { newtSecret: string; clientAddress?: string; }; +const PickSiteDefaultsResponseDataSchema = z.object({ + exitNodeId: z.number(), + address: z.string(), + publicKey: z.string(), + name: z.string(), + listenPort: z.number(), + endpoint: z.string(), + subnet: z.string(), + newtId: z.string(), + newtSecret: z.string(), + clientAddress: z.string().optional() +}); + registry.registerPath({ method: "get", @@ -41,7 +55,16 @@ registry.registerPath({ orgId: z.string() }) }, - responses: {} + responses: { + 200: { + description: "Successful response", + content: { + "application/json": { + schema: createApiResponseSchema(PickSiteDefaultsResponseDataSchema) + } + } + } + } }); const pickSiteDefaultsSchema = z.strictObject({ 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..1939d6967 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 @@ -53,7 +53,22 @@ registry.registerPath({ } } }, - responses: {} + responses: { + 200: { + description: "Successful response", + content: { + "application/json": { + schema: z.object({ + data: z.unknown().nullable(), + success: z.boolean(), + error: z.boolean(), + message: z.string(), + status: z.number() + }) + } + } + } + } }); export async function updateSite( diff --git a/server/routers/siteResource/addClientToSiteResource.ts b/server/routers/siteResource/addClientToSiteResource.ts index 4a67df94f..03145f672 100644 --- a/server/routers/siteResource/addClientToSiteResource.ts +++ b/server/routers/siteResource/addClientToSiteResource.ts @@ -41,7 +41,22 @@ registry.registerPath({ } } }, - responses: {} + responses: { + 200: { + description: "Successful response", + content: { + "application/json": { + schema: z.object({ + data: z.unknown().nullable(), + success: z.boolean(), + error: z.boolean(), + message: z.string(), + status: z.number() + }) + } + } + } + } }); export async function addClientToSiteResource( diff --git a/server/routers/siteResource/addRoleToSiteResource.ts b/server/routers/siteResource/addRoleToSiteResource.ts index f6501463b..8f8bf27fb 100644 --- a/server/routers/siteResource/addRoleToSiteResource.ts +++ b/server/routers/siteResource/addRoleToSiteResource.ts @@ -41,7 +41,22 @@ registry.registerPath({ } } }, - responses: {} + responses: { + 200: { + description: "Successful response", + content: { + "application/json": { + schema: z.object({ + data: z.unknown().nullable(), + success: z.boolean(), + error: z.boolean(), + message: z.string(), + status: z.number() + }) + } + } + } + } }); export async function addRoleToSiteResource( diff --git a/server/routers/siteResource/addUserToSiteResource.ts b/server/routers/siteResource/addUserToSiteResource.ts index 68151077c..bc6e6bcd9 100644 --- a/server/routers/siteResource/addUserToSiteResource.ts +++ b/server/routers/siteResource/addUserToSiteResource.ts @@ -41,7 +41,22 @@ registry.registerPath({ } } }, - responses: {} + responses: { + 200: { + description: "Successful response", + content: { + "application/json": { + schema: z.object({ + data: z.unknown().nullable(), + success: z.boolean(), + error: z.boolean(), + message: z.string(), + status: z.number() + }) + } + } + } + } }); export async function addUserToSiteResource( diff --git a/server/routers/siteResource/batchAddClientToSiteResources.ts b/server/routers/siteResource/batchAddClientToSiteResources.ts index cb424988a..aad23b0d4 100644 --- a/server/routers/siteResource/batchAddClientToSiteResources.ts +++ b/server/routers/siteResource/batchAddClientToSiteResources.ts @@ -19,7 +19,7 @@ import { rebuildClientAssociationsFromClient } from "@server/lib/rebuildClientAs const batchAddClientToSiteResourcesParamsSchema = z .object({ - clientId: z.string().transform(Number).pipe(z.number().int().positive()) + clientId: z.coerce.number().int().positive() }) .strict(); @@ -46,7 +46,22 @@ registry.registerPath({ } } }, - responses: {} + responses: { + 200: { + description: "Successful response", + content: { + "application/json": { + schema: z.object({ + data: z.unknown().nullable(), + success: z.boolean(), + error: z.boolean(), + message: z.string(), + status: z.number() + }) + } + } + } + } }); export async function batchAddClientToSiteResources( diff --git a/server/routers/siteResource/createSiteResource.ts b/server/routers/siteResource/createSiteResource.ts index bc80e8b41..dde929680 100644 --- a/server/routers/siteResource/createSiteResource.ts +++ b/server/routers/siteResource/createSiteResource.ts @@ -59,7 +59,12 @@ const createSiteResourceSchema = z /^(?:[a-zA-Z0-9*?](?:[a-zA-Z0-9*?-]{0,61}[a-zA-Z0-9*?])?\.)+[a-zA-Z0-9](?:[a-zA-Z0-9-]{0,61}[a-zA-Z0-9])?$/, "Alias must be a fully qualified domain name with optional wildcards (e.g., example.com, *.example.com, host-0?.example.internal)" ) - .optional(), + .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" + }), userIds: z.array(z.string()), roleIds: z.array(z.int()), clientIds: z.array(z.int()), @@ -159,7 +164,22 @@ registry.registerPath({ } } }, - responses: {} + responses: { + 200: { + description: "Successful response", + content: { + "application/json": { + schema: z.object({ + data: z.unknown().nullable(), + success: z.boolean(), + error: z.boolean(), + message: z.string(), + status: z.number() + }) + } + } + } + } }); export async function createSiteResource( diff --git a/server/routers/siteResource/deleteSiteResource.ts b/server/routers/siteResource/deleteSiteResource.ts index 5a4eb1cc9..82f80b875 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 = { @@ -27,7 +27,22 @@ registry.registerPath({ request: { params: deleteSiteResourceParamsSchema }, - responses: {} + responses: { + 200: { + description: "Successful response", + content: { + "application/json": { + schema: z.object({ + data: z.unknown().nullable(), + success: z.boolean(), + error: z.boolean(), + message: z.string(), + status: z.number() + }) + } + } + } + } }); export async function deleteSiteResource( diff --git a/server/routers/siteResource/getSiteResource.ts b/server/routers/siteResource/getSiteResource.ts index 2e3dfe87b..d923cb843 100644 --- a/server/routers/siteResource/getSiteResource.ts +++ b/server/routers/siteResource/getSiteResource.ts @@ -69,7 +69,22 @@ registry.registerPath({ orgId: z.string() }) }, - responses: {} + responses: { + 200: { + description: "Successful response", + content: { + "application/json": { + schema: z.object({ + data: z.unknown().nullable(), + success: z.boolean(), + error: z.boolean(), + message: z.string(), + status: z.number() + }) + } + } + } + } }); registry.registerPath({ @@ -83,7 +98,22 @@ registry.registerPath({ orgId: z.string() }) }, - responses: {} + responses: { + 200: { + description: "Successful response", + content: { + "application/json": { + schema: z.object({ + data: z.unknown().nullable(), + success: z.boolean(), + error: z.boolean(), + message: z.string(), + status: z.number() + }) + } + } + } + } }); export async function getSiteResource( diff --git a/server/routers/siteResource/listAllSiteResourcesByOrg.ts b/server/routers/siteResource/listAllSiteResourcesByOrg.ts index c7099de40..c7bafbe4c 100644 --- a/server/routers/siteResource/listAllSiteResourcesByOrg.ts +++ b/server/routers/siteResource/listAllSiteResourcesByOrg.ts @@ -197,7 +197,22 @@ registry.registerPath({ params: listAllSiteResourcesByOrgParamsSchema, query: listAllSiteResourcesByOrgQuerySchema }, - responses: {} + responses: { + 200: { + description: "Successful response", + content: { + "application/json": { + schema: z.object({ + data: z.unknown().nullable(), + success: z.boolean(), + error: z.boolean(), + message: z.string(), + status: z.number() + }) + } + } + } + } }); export async function listAllSiteResourcesByOrg( diff --git a/server/routers/siteResource/listSiteResourceClients.ts b/server/routers/siteResource/listSiteResourceClients.ts index 867e66b49..c95874b21 100644 --- a/server/routers/siteResource/listSiteResourceClients.ts +++ b/server/routers/siteResource/listSiteResourceClients.ts @@ -43,7 +43,22 @@ registry.registerPath({ request: { params: listSiteResourceClientsSchema }, - responses: {} + responses: { + 200: { + description: "Successful response", + content: { + "application/json": { + schema: z.object({ + data: z.unknown().nullable(), + success: z.boolean(), + error: z.boolean(), + message: z.string(), + status: z.number() + }) + } + } + } + } }); export async function listSiteResourceClients( diff --git a/server/routers/siteResource/listSiteResourceRoles.ts b/server/routers/siteResource/listSiteResourceRoles.ts index 679a93f7e..6a451b192 100644 --- a/server/routers/siteResource/listSiteResourceRoles.ts +++ b/server/routers/siteResource/listSiteResourceRoles.ts @@ -44,7 +44,22 @@ registry.registerPath({ request: { params: listSiteResourceRolesSchema }, - responses: {} + responses: { + 200: { + description: "Successful response", + content: { + "application/json": { + schema: z.object({ + data: z.unknown().nullable(), + success: z.boolean(), + error: z.boolean(), + message: z.string(), + status: z.number() + }) + } + } + } + } }); export async function listSiteResourceRoles( diff --git a/server/routers/siteResource/listSiteResourceUsers.ts b/server/routers/siteResource/listSiteResourceUsers.ts index e50d8684e..d6846b9eb 100644 --- a/server/routers/siteResource/listSiteResourceUsers.ts +++ b/server/routers/siteResource/listSiteResourceUsers.ts @@ -47,7 +47,22 @@ registry.registerPath({ request: { params: listSiteResourceUsersSchema }, - responses: {} + responses: { + 200: { + description: "Successful response", + content: { + "application/json": { + schema: z.object({ + data: z.unknown().nullable(), + success: z.boolean(), + error: z.boolean(), + message: z.string(), + status: z.number() + }) + } + } + } + } }); export async function listSiteResourceUsers( diff --git a/server/routers/siteResource/listSiteResources.ts b/server/routers/siteResource/listSiteResources.ts index 61460c2d0..1cebb281f 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() }); @@ -63,7 +63,22 @@ registry.registerPath({ params: listSiteResourcesParamsSchema, query: listSiteResourcesQuerySchema }, - responses: {} + responses: { + 200: { + description: "Successful response", + content: { + "application/json": { + schema: z.object({ + data: z.unknown().nullable(), + success: z.boolean(), + error: z.boolean(), + message: z.string(), + status: z.number() + }) + } + } + } + } }); export async function listSiteResources( diff --git a/server/routers/siteResource/removeClientFromSiteResource.ts b/server/routers/siteResource/removeClientFromSiteResource.ts index 51e54dd92..906f07902 100644 --- a/server/routers/siteResource/removeClientFromSiteResource.ts +++ b/server/routers/siteResource/removeClientFromSiteResource.ts @@ -41,7 +41,22 @@ registry.registerPath({ } } }, - responses: {} + responses: { + 200: { + description: "Successful response", + content: { + "application/json": { + schema: z.object({ + data: z.unknown().nullable(), + success: z.boolean(), + error: z.boolean(), + message: z.string(), + status: z.number() + }) + } + } + } + } }); export async function removeClientFromSiteResource( diff --git a/server/routers/siteResource/removeRoleFromSiteResource.ts b/server/routers/siteResource/removeRoleFromSiteResource.ts index 19478ed0f..00aba1114 100644 --- a/server/routers/siteResource/removeRoleFromSiteResource.ts +++ b/server/routers/siteResource/removeRoleFromSiteResource.ts @@ -41,7 +41,22 @@ registry.registerPath({ } } }, - responses: {} + responses: { + 200: { + description: "Successful response", + content: { + "application/json": { + schema: z.object({ + data: z.unknown().nullable(), + success: z.boolean(), + error: z.boolean(), + message: z.string(), + status: z.number() + }) + } + } + } + } }); export async function removeRoleFromSiteResource( diff --git a/server/routers/siteResource/removeUserFromSiteResource.ts b/server/routers/siteResource/removeUserFromSiteResource.ts index 70bb5e22e..9c25ddcf2 100644 --- a/server/routers/siteResource/removeUserFromSiteResource.ts +++ b/server/routers/siteResource/removeUserFromSiteResource.ts @@ -41,7 +41,22 @@ registry.registerPath({ } } }, - responses: {} + responses: { + 200: { + description: "Successful response", + content: { + "application/json": { + schema: z.object({ + data: z.unknown().nullable(), + success: z.boolean(), + error: z.boolean(), + message: z.string(), + status: z.number() + }) + } + } + } + } }); export async function removeUserFromSiteResource( diff --git a/server/routers/siteResource/setSiteResourceClients.ts b/server/routers/siteResource/setSiteResourceClients.ts index 7aff3875f..cde78d052 100644 --- a/server/routers/siteResource/setSiteResourceClients.ts +++ b/server/routers/siteResource/setSiteResourceClients.ts @@ -41,7 +41,22 @@ registry.registerPath({ } } }, - responses: {} + responses: { + 200: { + description: "Successful response", + content: { + "application/json": { + schema: z.object({ + data: z.unknown().nullable(), + success: z.boolean(), + error: z.boolean(), + message: z.string(), + status: z.number() + }) + } + } + } + } }); export async function setSiteResourceClients( diff --git a/server/routers/siteResource/setSiteResourceRoles.ts b/server/routers/siteResource/setSiteResourceRoles.ts index a1ee80b40..3e83efea2 100644 --- a/server/routers/siteResource/setSiteResourceRoles.ts +++ b/server/routers/siteResource/setSiteResourceRoles.ts @@ -42,7 +42,22 @@ registry.registerPath({ } } }, - responses: {} + responses: { + 200: { + description: "Successful response", + content: { + "application/json": { + schema: z.object({ + data: z.unknown().nullable(), + success: z.boolean(), + error: z.boolean(), + message: z.string(), + status: z.number() + }) + } + } + } + } }); export async function setSiteResourceRoles( diff --git a/server/routers/siteResource/setSiteResourceUsers.ts b/server/routers/siteResource/setSiteResourceUsers.ts index 109e8c429..37e3152b7 100644 --- a/server/routers/siteResource/setSiteResourceUsers.ts +++ b/server/routers/siteResource/setSiteResourceUsers.ts @@ -42,7 +42,22 @@ registry.registerPath({ } } }, - responses: {} + responses: { + 200: { + description: "Successful response", + content: { + "application/json": { + schema: z.object({ + data: z.unknown().nullable(), + success: z.boolean(), + error: z.boolean(), + message: z.string(), + status: z.number() + }) + } + } + } + } }); export async function setSiteResourceUsers( diff --git a/server/routers/siteResource/updateSiteResource.ts b/server/routers/siteResource/updateSiteResource.ts index 7f8ef3e25..74e616362 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 @@ -69,7 +69,12 @@ const updateSiteResourceSchema = z /^(?:[a-zA-Z0-9*?](?:[a-zA-Z0-9*?-]{0,61}[a-zA-Z0-9*?])?\.)+[a-zA-Z0-9](?:[a-zA-Z0-9-]{0,61}[a-zA-Z0-9])?$/, "Alias must be a fully qualified domain name with optional wildcards (e.g., example.internal, *.example.internal, host-0?.example.internal)" ) - .nullish(), + .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" + }), userIds: z.array(z.string()), roleIds: z.array(z.int()), clientIds: z.array(z.int()), @@ -170,7 +175,22 @@ registry.registerPath({ } } }, - responses: {} + responses: { + 200: { + description: "Successful response", + content: { + "application/json": { + schema: z.object({ + data: z.unknown().nullable(), + success: z.boolean(), + error: z.boolean(), + message: z.string(), + status: z.number() + }) + } + } + } + } }); export async function updateSiteResource( diff --git a/server/routers/target/createTarget.ts b/server/routers/target/createTarget.ts index c629e378e..8de26214b 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({ @@ -81,7 +81,22 @@ registry.registerPath({ } } }, - responses: {} + responses: { + 200: { + description: "Successful response", + content: { + "application/json": { + schema: z.object({ + data: z.unknown().nullable(), + success: z.boolean(), + error: z.boolean(), + message: z.string(), + status: z.number() + }) + } + } + } + } }); export async function createTarget( diff --git a/server/routers/target/deleteTarget.ts b/server/routers/target/deleteTarget.ts index 685c41e7e..dc7f19dac 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({ @@ -24,7 +24,22 @@ registry.registerPath({ request: { params: deleteTargetSchema }, - responses: {} + responses: { + 200: { + description: "Successful response", + content: { + "application/json": { + schema: z.object({ + data: z.unknown().nullable(), + success: z.boolean(), + error: z.boolean(), + message: z.string(), + status: z.number() + }) + } + } + } + } }); export async function deleteTarget( diff --git a/server/routers/target/getTarget.ts b/server/routers/target/getTarget.ts index 281c39906..37fa8b7f0 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 & @@ -27,7 +27,22 @@ registry.registerPath({ request: { params: getTargetSchema }, - responses: {} + responses: { + 200: { + description: "Successful response", + content: { + "application/json": { + schema: z.object({ + data: z.unknown().nullable(), + success: z.boolean(), + error: z.boolean(), + message: z.string(), + status: z.number() + }) + } + } + } + } }); export async function getTarget( diff --git a/server/routers/target/listTargets.ts b/server/routers/target/listTargets.ts index df3d508c5..47e9cdea5 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({ @@ -96,7 +96,22 @@ registry.registerPath({ params: listTargetsParamsSchema, query: listTargetsSchema }, - responses: {} + responses: { + 200: { + description: "Successful response", + content: { + "application/json": { + schema: z.object({ + data: z.unknown().nullable(), + success: z.boolean(), + error: z.boolean(), + message: z.string(), + status: z.number() + }) + } + } + } + } }); export async function listTargets( diff --git a/server/routers/target/updateTarget.ts b/server/routers/target/updateTarget.ts index 4533dc2e5..4b356c918 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 @@ -80,7 +80,22 @@ registry.registerPath({ } } }, - responses: {} + responses: { + 200: { + description: "Successful response", + content: { + "application/json": { + schema: z.object({ + data: z.unknown().nullable(), + success: z.boolean(), + error: z.boolean(), + message: z.string(), + status: z.number() + }) + } + } + } + } }); export async function updateTarget( diff --git a/server/routers/user/addUserRoleLegacy.ts b/server/routers/user/addUserRoleLegacy.ts index 6e5b805ab..201f7a7e4 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() }); @@ -27,7 +27,22 @@ registry.registerPath({ request: { params: addUserRoleLegacyParamsSchema }, - responses: {} + responses: { + 200: { + description: "Successful response", + content: { + "application/json": { + schema: z.object({ + data: z.unknown().nullable(), + success: z.boolean(), + error: z.boolean(), + message: z.string(), + status: z.number() + }) + } + } + } + } }); export async function addUserRoleLegacy( 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/adminGetUser.ts b/server/routers/user/adminGetUser.ts index 06045c770..1bc674339 100644 --- a/server/routers/user/adminGetUser.ts +++ b/server/routers/user/adminGetUser.ts @@ -21,7 +21,22 @@ registry.registerPath({ request: { params: adminGetUserSchema }, - responses: {} + responses: { + 200: { + description: "Successful response", + content: { + "application/json": { + schema: z.object({ + data: z.unknown().nullable(), + success: z.boolean(), + error: z.boolean(), + message: z.string(), + status: z.number() + }) + } + } + } + } }); async function queryUser(userId: string) { diff --git a/server/routers/user/adminListUsers.ts b/server/routers/user/adminListUsers.ts index 3d7bac4b3..8200b6f0f 100644 --- a/server/routers/user/adminListUsers.ts +++ b/server/routers/user/adminListUsers.ts @@ -137,7 +137,22 @@ registry.registerPath({ request: { query: listUsersSchema }, - responses: {} + responses: { + 200: { + description: "Successful response", + content: { + "application/json": { + schema: z.object({ + data: z.unknown().nullable(), + success: z.boolean(), + error: z.boolean(), + message: z.string(), + status: z.number() + }) + } + } + } + } }); export async function adminListUsers( diff --git a/server/routers/user/adminUpdateUser2FA.ts b/server/routers/user/adminUpdateUser2FA.ts index 7fb37d010..effc17aa2 100644 --- a/server/routers/user/adminUpdateUser2FA.ts +++ b/server/routers/user/adminUpdateUser2FA.ts @@ -1,5 +1,6 @@ import { Request, Response, NextFunction } from "express"; import { z } from "zod"; +import { createApiResponseSchema } from "@server/lib/openapi/createApiResponseSchema"; import { db } from "@server/db"; import { users, userOrgs } from "@server/db"; import { eq, and } from "drizzle-orm"; @@ -22,6 +23,11 @@ export type UpdateUser2FAResponse = { userId: string; twoFactorRequested: boolean; }; +const UpdateUser2FAResponseDataSchema = z.object({ + userId: z.string(), + twoFactorRequested: z.boolean() +}); + registry.registerPath({ method: "post", @@ -38,7 +44,16 @@ registry.registerPath({ } } }, - responses: {} + responses: { + 200: { + description: "Successful response", + content: { + "application/json": { + schema: createApiResponseSchema(UpdateUser2FAResponseDataSchema) + } + } + } + } }); export async function updateUser2FA( diff --git a/server/routers/user/createOrgUser.ts b/server/routers/user/createOrgUser.ts index ed3824b24..f03dd763b 100644 --- a/server/routers/user/createOrgUser.ts +++ b/server/routers/user/createOrgUser.ts @@ -1,5 +1,6 @@ import { Request, Response, NextFunction } from "express"; import { z } from "zod"; +import { createApiResponseSchema } from "@server/lib/openapi/createApiResponseSchema"; import response from "@server/lib/response"; import HttpCode from "@server/types/HttpCode"; import createHttpError from "http-errors"; @@ -53,6 +54,8 @@ const bodySchema = z })); export type CreateOrgUserResponse = {}; +const CreateOrgUserResponseDataSchema = z.object({}); + registry.registerPath({ method: "put", @@ -69,7 +72,16 @@ registry.registerPath({ } } }, - responses: {} + responses: { + 200: { + description: "Successful response", + content: { + "application/json": { + schema: createApiResponseSchema(CreateOrgUserResponseDataSchema) + } + } + } + } }); export async function createOrgUser( diff --git a/server/routers/user/getOrgUser.ts b/server/routers/user/getOrgUser.ts index af900150b..4a03edd94 100644 --- a/server/routers/user/getOrgUser.ts +++ b/server/routers/user/getOrgUser.ts @@ -81,7 +81,22 @@ registry.registerPath({ request: { params: getOrgUserParamsSchema }, - responses: {} + responses: { + 200: { + description: "Successful response", + content: { + "application/json": { + schema: z.object({ + data: z.unknown().nullable(), + success: z.boolean(), + error: z.boolean(), + message: z.string(), + status: z.number() + }) + } + } + } + } }); export async function getOrgUser( diff --git a/server/routers/user/getOrgUserByUsername.ts b/server/routers/user/getOrgUserByUsername.ts index a6a764a54..af5ad3feb 100644 --- a/server/routers/user/getOrgUserByUsername.ts +++ b/server/routers/user/getOrgUserByUsername.ts @@ -40,7 +40,22 @@ registry.registerPath({ params: getOrgUserByUsernameParamsSchema, query: getOrgUserByUsernameQuerySchema }, - responses: {} + responses: { + 200: { + description: "Successful response", + content: { + "application/json": { + schema: z.object({ + data: z.unknown().nullable(), + success: z.boolean(), + error: z.boolean(), + message: z.string(), + status: z.number() + }) + } + } + } + } }); export async function getOrgUserByUsername( diff --git a/server/routers/user/inviteUser.ts b/server/routers/user/inviteUser.ts index b11586e69..c4feb820f 100644 --- a/server/routers/user/inviteUser.ts +++ b/server/routers/user/inviteUser.ts @@ -1,5 +1,6 @@ import { Request, Response, NextFunction } from "express"; import { z } from "zod"; +import { createApiResponseSchema } from "@server/lib/openapi/createApiResponseSchema"; import { db } from "@server/db"; import { orgs, @@ -67,6 +68,11 @@ export type InviteUserResponse = { inviteLink: string; expiresAt: number; }; +const InviteUserResponseDataSchema = z.object({ + inviteLink: z.string(), + expiresAt: z.number() +}); + registry.registerPath({ method: "post", @@ -83,7 +89,16 @@ registry.registerPath({ } } }, - responses: {} + responses: { + 200: { + description: "Successful response", + content: { + "application/json": { + schema: createApiResponseSchema(InviteUserResponseDataSchema) + } + } + } + } }); export async function inviteUser( diff --git a/server/routers/user/listInvitations.ts b/server/routers/user/listInvitations.ts index 1f4bcc02c..df8663d1a 100644 --- a/server/routers/user/listInvitations.ts +++ b/server/routers/user/listInvitations.ts @@ -101,7 +101,22 @@ registry.registerPath({ params: listInvitationsParamsSchema, query: listInvitationsQuerySchema }, - responses: {} + responses: { + 200: { + description: "Successful response", + content: { + "application/json": { + schema: z.object({ + data: z.unknown().nullable(), + success: z.boolean(), + error: z.boolean(), + message: z.string(), + status: z.number() + }) + } + } + } + } }); export async function listInvitations( diff --git a/server/routers/user/listUsers.ts b/server/routers/user/listUsers.ts index 42a62636d..32e717b46 100644 --- a/server/routers/user/listUsers.ts +++ b/server/routers/user/listUsers.ts @@ -150,7 +150,22 @@ registry.registerPath({ params: listUsersParamsSchema, query: listUsersSchema }, - responses: {} + responses: { + 200: { + description: "Successful response", + content: { + "application/json": { + schema: z.object({ + data: z.unknown().nullable(), + success: z.boolean(), + error: z.boolean(), + message: z.string(), + status: z.number() + }) + } + } + } + } }); export async function listUsers( diff --git a/server/routers/user/removeInvitation.ts b/server/routers/user/removeInvitation.ts index 0f76fd30c..c8b897f71 100644 --- a/server/routers/user/removeInvitation.ts +++ b/server/routers/user/removeInvitation.ts @@ -23,7 +23,22 @@ registry.registerPath({ request: { params: removeInvitationParamsSchema }, - responses: {} + responses: { + 200: { + description: "Successful response", + content: { + "application/json": { + schema: z.object({ + data: z.unknown().nullable(), + success: z.boolean(), + error: z.boolean(), + message: z.string(), + status: z.number() + }) + } + } + } + } }); export async function removeInvitation( diff --git a/server/routers/user/removeUserOrg.ts b/server/routers/user/removeUserOrg.ts index fcb3313a8..982aa495d 100644 --- a/server/routers/user/removeUserOrg.ts +++ b/server/routers/user/removeUserOrg.ts @@ -38,7 +38,22 @@ registry.registerPath({ request: { params: removeUserSchema }, - responses: {} + responses: { + 200: { + description: "Successful response", + content: { + "application/json": { + schema: z.object({ + data: z.unknown().nullable(), + success: z.boolean(), + error: z.boolean(), + message: z.string(), + status: z.number() + }) + } + } + } + } }); export async function removeUserOrg( 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( diff --git a/server/routers/user/updateOrgUser.ts b/server/routers/user/updateOrgUser.ts index a95c3fb5e..dd3ba4a9d 100644 --- a/server/routers/user/updateOrgUser.ts +++ b/server/routers/user/updateOrgUser.ts @@ -37,7 +37,22 @@ registry.registerPath({ } } }, - responses: {} + responses: { + 200: { + description: "Successful response", + content: { + "application/json": { + schema: z.object({ + data: z.unknown().nullable(), + success: z.boolean(), + error: z.boolean(), + message: z.string(), + status: z.number() + }) + } + } + } + } }); export async function updateOrgUser( diff --git a/server/routers/ws/checkRoundTripMessage.ts b/server/routers/ws/checkRoundTripMessage.ts index 9c832db5d..121f5affe 100644 --- a/server/routers/ws/checkRoundTripMessage.ts +++ b/server/routers/ws/checkRoundTripMessage.ts @@ -27,7 +27,22 @@ const checkRoundTripMessageParamsSchema = z // request: { // params: checkRoundTripMessageParamsSchema // }, -// responses: {} +// responses: { +// 200: { +// description: "Successful response", +// content: { +// "application/json": { +// schema: z.object({ +// data: z.unknown().nullable(), +// success: z.boolean(), +// error: z.boolean(), +// message: z.string(), +// status: z.number() +// }) +// } +// } +// } +// } // }); export async function checkRoundTripMessage(