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/updateAlertRule.ts b/server/private/routers/alertRule/updateAlertRule.ts index f36dcc7e3..d4fdaf87b 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,8 @@ const bodySchema = z export type UpdateAlertRuleResponse = { alertRuleId: number; }; +const UpdateAlertRuleResponseDataSchema = z.object({alertRuleId: z.number()}); + registry.registerPath({ method: "post", @@ -169,13 +172,7 @@ registry.registerPath({ 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() - }) + schema: createApiResponseSchema(UpdateAlertRuleResponseDataSchema) } } } diff --git a/server/private/routers/billing/getOrgUsage.ts b/server/private/routers/billing/getOrgUsage.ts index e64b5ec19..ad2102df5 100644 --- a/server/private/routers/billing/getOrgUsage.ts +++ b/server/private/routers/billing/getOrgUsage.ts @@ -39,22 +39,22 @@ const getOrgSchema = z.strictObject({ // request: { // params: getOrgSchema // }, -// 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() - }) - } - } - } - } +// 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/domain/listDomainNamespaces.ts b/server/private/routers/domain/listDomainNamespaces.ts index 21c454249..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", @@ -78,13 +93,9 @@ registry.registerPath({ 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() - }) + schema: createApiResponseSchema( + ListDomainNamespacesResponseDataSchema + ) } } } diff --git a/server/private/routers/eventStreamingDestination/createEventStreamingDestination.ts b/server/private/routers/eventStreamingDestination/createEventStreamingDestination.ts index 28df9b69c..444e187f4 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,8 @@ const bodySchema = z.strictObject({ export type CreateEventStreamingDestinationResponse = { destinationId: number; }; +const CreateEventStreamingDestinationResponseDataSchema = z.object({destinationId: z.number()}); + registry.registerPath({ method: "put", @@ -63,13 +66,7 @@ registry.registerPath({ 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() - }) + schema: createApiResponseSchema(CreateEventStreamingDestinationResponseDataSchema) } } } diff --git a/server/private/routers/eventStreamingDestination/listEventStreamingDestinations.ts b/server/private/routers/eventStreamingDestination/listEventStreamingDestinations.ts index 2f68b226e..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() @@ -93,13 +119,9 @@ registry.registerPath({ 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() - }) + schema: createApiResponseSchema( + ListEventStreamingDestinationsResponseDataSchema + ) } } } diff --git a/server/private/routers/eventStreamingDestination/updateEventStreamingDestination.ts b/server/private/routers/eventStreamingDestination/updateEventStreamingDestination.ts index b1f6c4547..0eae09537 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,8 @@ const bodySchema = z.strictObject({ export type UpdateEventStreamingDestinationResponse = { destinationId: number; }; +const UpdateEventStreamingDestinationResponseDataSchema = z.object({destinationId: z.number()}); + registry.registerPath({ method: "post", @@ -66,13 +69,7 @@ registry.registerPath({ 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() - }) + schema: createApiResponseSchema(UpdateEventStreamingDestinationResponseDataSchema) } } } diff --git a/server/private/routers/healthChecks/createHealthCheck.ts b/server/private/routers/healthChecks/createHealthCheck.ts index f60eb7bae..86ad8a042 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,8 @@ const bodySchema = z.strictObject({ export type CreateHealthCheckResponse = { targetHealthCheckId: number; }; +const CreateHealthCheckResponseDataSchema = z.object({targetHealthCheckId: z.number()}); + registry.registerPath({ method: "put", @@ -73,13 +76,7 @@ registry.registerPath({ 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() - }) + schema: createApiResponseSchema(CreateHealthCheckResponseDataSchema) } } } diff --git a/server/private/routers/healthChecks/updateHealthCheck.ts b/server/private/routers/healthChecks/updateHealthCheck.ts index 83dba41cb..cb99b48f5 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,8 @@ 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", @@ -102,13 +105,7 @@ registry.registerPath({ 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() - }) + schema: createApiResponseSchema(UpdateHealthCheckResponseDataSchema) } } } diff --git a/server/private/routers/orgIdp/updateOrgOidcIdp.ts b/server/private/routers/orgIdp/updateOrgOidcIdp.ts index 6ffc832a2..bb5d35b7f 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,8 @@ const bodySchema = z.strictObject({ export type UpdateOrgIdpResponse = { idpId: number; }; +const UpdateOrgIdpResponseDataSchema = z.object({idpId: z.number()}); + registry.registerPath({ method: "post", @@ -75,13 +78,7 @@ registry.registerPath({ 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() - }) + schema: createApiResponseSchema(UpdateOrgIdpResponseDataSchema) } } } diff --git a/server/private/routers/ssh/signSshKey.ts b/server/private/routers/ssh/signSshKey.ts index 5dfab9f8c..60065e2a7 100644 --- a/server/private/routers/ssh/signSshKey.ts +++ b/server/private/routers/ssh/signSshKey.ts @@ -92,22 +92,22 @@ export type SignSshKeyResponse = { // } // } // }, -// 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() - }) - } - } - } - } +// 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/routers/apiKeys/createOrgApiKey.ts b/server/routers/apiKeys/createOrgApiKey.ts index 8df895d8f..7a2995523 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,8 @@ 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", @@ -53,13 +56,7 @@ registry.registerPath({ 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() - }) + schema: createApiResponseSchema(CreateOrgApiKeyResponseDataSchema) } } } diff --git a/server/routers/apiKeys/listApiKeyActions.ts b/server/routers/apiKeys/listApiKeyActions.ts index a6d2f01ab..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", @@ -58,13 +72,9 @@ registry.registerPath({ 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() - }) + schema: createApiResponseSchema( + ListApiKeyActionsResponseDataSchema + ) } } } diff --git a/server/routers/apiKeys/listOrgApiKeys.ts b/server/routers/apiKeys/listOrgApiKeys.ts index 41f115f5a..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", @@ -62,13 +80,9 @@ registry.registerPath({ 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() - }) + schema: createApiResponseSchema( + ListOrgApiKeysResponseDataSchema + ) } } } diff --git a/server/routers/auth/lookupUser.ts b/server/routers/auth/lookupUser.ts index b23e6f8a0..d086cf4e1 100644 --- a/server/routers/auth/lookupUser.ts +++ b/server/routers/auth/lookupUser.ts @@ -51,22 +51,22 @@ export type LookupUserResponse = { // request: { // body: lookupBodySchema // }, -// 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() - }) - } - } - } - } +// 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/client/pickClientDefaults.ts b/server/routers/client/pickClientDefaults.ts index a8093c4bb..ab38a46a9 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,8 @@ 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() @@ -32,13 +35,7 @@ registry.registerPath({ 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() - }) + schema: createApiResponseSchema(PickClientDefaultsResponseDataSchema) } } } diff --git a/server/routers/domain/listDomains.ts b/server/routers/domain/listDomains.ts index 79a461ff4..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", @@ -72,13 +95,7 @@ registry.registerPath({ 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() - }) + schema: createApiResponseSchema(ListDomainsResponseDataSchema) } } } diff --git a/server/routers/domain/updateDomain.ts b/server/routers/domain/updateDomain.ts index 477f17cbf..a03312916 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,8 @@ 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", @@ -41,13 +44,7 @@ registry.registerPath({ 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() - }) + schema: createApiResponseSchema(UpdateDomainResponseDataSchema) } } } diff --git a/server/routers/idp/createIdpOrgPolicy.ts b/server/routers/idp/createIdpOrgPolicy.ts index 3fcee3ff6..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", @@ -43,13 +46,7 @@ registry.registerPath({ 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() - }) + schema: createApiResponseSchema(CreateIdpOrgPolicyResponseDataSchema) } } } diff --git a/server/routers/idp/createOidcIdp.ts b/server/routers/idp/createOidcIdp.ts index b3026b75d..48e4b75b4 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,8 @@ export type CreateIdpResponse = { idpId: number; redirectUrl: string; }; +const CreateIdpResponseDataSchema = z.object({idpId: z.number(), redirectUrl: z.string()}); + registry.registerPath({ method: "put", @@ -53,13 +56,7 @@ registry.registerPath({ 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() - }) + schema: createApiResponseSchema(CreateIdpResponseDataSchema) } } } diff --git a/server/routers/idp/listIdpOrgPolicies.ts b/server/routers/idp/listIdpOrgPolicies.ts index 99240c813..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", @@ -58,13 +74,9 @@ registry.registerPath({ 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() - }) + schema: createApiResponseSchema( + ListIdpOrgPoliciesResponseDataSchema + ) } } } diff --git a/server/routers/idp/listIdps.ts b/server/routers/idp/listIdps.ts index 3d88294a8..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", @@ -67,13 +87,7 @@ registry.registerPath({ 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() - }) + schema: createApiResponseSchema(ListIdpsResponseDataSchema) } } } diff --git a/server/routers/idp/updateIdpOrgPolicy.ts b/server/routers/idp/updateIdpOrgPolicy.ts index b36facac6..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", @@ -42,13 +45,7 @@ registry.registerPath({ 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() - }) + schema: createApiResponseSchema(UpdateIdpOrgPolicyResponseDataSchema) } } } diff --git a/server/routers/idp/updateOidcIdp.ts b/server/routers/idp/updateOidcIdp.ts index 8630ccf5d..8f54c8e72 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,8 @@ const bodySchema = z.strictObject({ export type UpdateIdpResponse = { idpId: number; }; +const UpdateIdpResponseDataSchema = z.object({idpId: z.number()}); + registry.registerPath({ method: "post", @@ -59,13 +62,7 @@ registry.registerPath({ 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() - }) + schema: createApiResponseSchema(UpdateIdpResponseDataSchema) } } } diff --git a/server/routers/olm/createUserOlm.ts b/server/routers/olm/createUserOlm.ts index dde21ae15..486546ada 100644 --- a/server/routers/olm/createUserOlm.ts +++ b/server/routers/olm/createUserOlm.ts @@ -43,22 +43,22 @@ export type CreateOlmResponse = { // }, // params: paramsSchema // }, -// 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() - }) - } - } - } - } +// 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 412e85c96..df9328dd3 100644 --- a/server/routers/olm/deleteUserOlm.ts +++ b/server/routers/olm/deleteUserOlm.ts @@ -28,22 +28,22 @@ const paramsSchema = z // request: { // params: paramsSchema // }, -// 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() - }) - } - } - } - } +// 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 cf48bb514..534ae3bb7 100644 --- a/server/routers/olm/getUserOlm.ts +++ b/server/routers/olm/getUserOlm.ts @@ -30,22 +30,22 @@ const querySchema = z.object({ // request: { // params: paramsSchema // }, -// 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() - }) - } - } - } - } +// 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 b4ba02ef2..d6ac26819 100644 --- a/server/routers/olm/listUserOlms.ts +++ b/server/routers/olm/listUserOlms.ts @@ -41,22 +41,22 @@ const paramsSchema = z // query: querySchema, // params: paramsSchema // }, -// 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() - }) - } - } - } - } +// 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/getOrg.ts b/server/routers/org/getOrg.ts index 112f08604..ad5af2379 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,8 @@ const getOrgSchema = z.strictObject({ export type GetOrgResponse = { org: Org; }; +const GetOrgResponseDataSchema = z.object({org: z.object({}).passthrough()}); + registry.registerPath({ method: "get", @@ -31,13 +34,7 @@ registry.registerPath({ 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() - }) + schema: createApiResponseSchema(GetOrgResponseDataSchema) } } } diff --git a/server/routers/org/listOrgs.ts b/server/routers/org/listOrgs.ts index 187e6c983..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 @@ -38,13 +39,7 @@ registry.registerPath({ 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() - }) + schema: createApiResponseSchema(ListOrgsResponseDataSchema) } } } @@ -56,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 5878ba679..465dd5801 100644 --- a/server/routers/org/listUserOrgs.ts +++ b/server/routers/org/listUserOrgs.ts @@ -37,22 +37,22 @@ const listOrgsSchema = z.object({ // request: { // query: listOrgsSchema // }, -// 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() - }) - } - } - } - } +// 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/resource/listUserResourceAliases.ts b/server/routers/resource/listUserResourceAliases.ts index 8f6ef6068..ae71c3708 100644 --- a/server/routers/resource/listUserResourceAliases.ts +++ b/server/routers/resource/listUserResourceAliases.ts @@ -76,22 +76,22 @@ export type ListUserResourceAliasesResponse = PaginatedResponse<{ // }), // query: listUserResourceAliasesQuerySchema // }, -// 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() - }) - } - } - } - } +// 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/site/pickSiteDefaults.ts b/server/routers/site/pickSiteDefaults.ts index a35f413f0..ec29b9a31 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,8 @@ 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", @@ -46,13 +49,7 @@ registry.registerPath({ 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() - }) + schema: createApiResponseSchema(PickSiteDefaultsResponseDataSchema) } } } diff --git a/server/routers/user/adminUpdateUser2FA.ts b/server/routers/user/adminUpdateUser2FA.ts index da8127adf..8760dec83 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,8 @@ export type UpdateUser2FAResponse = { userId: string; twoFactorRequested: boolean; }; +const UpdateUser2FAResponseDataSchema = z.object({userId: z.string(), twoFactorRequested: z.boolean()}); + registry.registerPath({ method: "post", @@ -43,13 +46,7 @@ registry.registerPath({ 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() - }) + schema: createApiResponseSchema(UpdateUser2FAResponseDataSchema) } } } diff --git a/server/routers/user/createOrgUser.ts b/server/routers/user/createOrgUser.ts index e1c19c8dd..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", @@ -74,13 +77,7 @@ registry.registerPath({ 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() - }) + schema: createApiResponseSchema(CreateOrgUserResponseDataSchema) } } } diff --git a/server/routers/user/inviteUser.ts b/server/routers/user/inviteUser.ts index b7fa81a74..d1baff12d 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,8 @@ export type InviteUserResponse = { inviteLink: string; expiresAt: number; }; +const InviteUserResponseDataSchema = z.object({inviteLink: z.string(), expiresAt: z.number()}); + registry.registerPath({ method: "post", @@ -88,13 +91,7 @@ registry.registerPath({ 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() - }) + schema: createApiResponseSchema(InviteUserResponseDataSchema) } } } diff --git a/server/routers/ws/checkRoundTripMessage.ts b/server/routers/ws/checkRoundTripMessage.ts index 06d6faf66..121f5affe 100644 --- a/server/routers/ws/checkRoundTripMessage.ts +++ b/server/routers/ws/checkRoundTripMessage.ts @@ -27,22 +27,22 @@ const checkRoundTripMessageParamsSchema = z // request: { // params: checkRoundTripMessageParamsSchema // }, -// 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() - }) - } - } - } - } +// 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(