Improve OpenAPI response payload typing for Swagger data schemas (#3102)

* Fix custom parser OpenAPI types and add structured default response schema

Agent-Logs-Url: https://github.com/fosrl/pangolin/sessions/73990123-9c27-444b-bc6e-77e890a0d57c

Co-authored-by: oschwartz10612 <4999704+oschwartz10612@users.noreply.github.com>

* Document all registerPath responses and normalize OpenAPI parser schemas

Agent-Logs-Url: https://github.com/fosrl/pangolin/sessions/73990123-9c27-444b-bc6e-77e890a0d57c

Co-authored-by: oschwartz10612 <4999704+oschwartz10612@users.noreply.github.com>

* Add concrete OpenAPI data schemas for selected routes

Agent-Logs-Url: https://github.com/fosrl/pangolin/sessions/7b395a8e-7fae-4f4d-952e-4030fea08262

Co-authored-by: oschwartz10612 <4999704+oschwartz10612@users.noreply.github.com>

* Reformat generated OpenAPI response schemas for readability

Agent-Logs-Url: https://github.com/fosrl/pangolin/sessions/7b395a8e-7fae-4f4d-952e-4030fea08262

Co-authored-by: oschwartz10612 <4999704+oschwartz10612@users.noreply.github.com>

* Remove obsolete stoi import from blueprint OpenAPI route

Agent-Logs-Url: https://github.com/fosrl/pangolin/sessions/7b395a8e-7fae-4f4d-952e-4030fea08262

Co-authored-by: oschwartz10612 <4999704+oschwartz10612@users.noreply.github.com>

---------

Co-authored-by: copilot-swe-agent[bot] <198982749+Copilot@users.noreply.github.com>
Co-authored-by: oschwartz10612 <4999704+oschwartz10612@users.noreply.github.com>
This commit is contained in:
Owen Schwartz
2026-05-31 11:10:38 -07:00
committed by GitHub
183 changed files with 2875 additions and 245 deletions

View File

@@ -152,11 +152,17 @@ function getOpenApiDocumentation() {
if (!hasExistingResponses) { if (!hasExistingResponses) {
def.route.responses = { def.route.responses = {
"*": { "200": {
description: "", description: "Successful response",
content: { content: {
"application/json": { "application/json": {
schema: z.object({}) schema: z.object({
data: z.unknown().nullable(),
success: z.boolean(),
error: z.boolean(),
message: z.string(),
status: z.number()
})
} }
} }
} }

View File

@@ -873,7 +873,13 @@ export const portRangeStringSchema = z
message: 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.' '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 * Parses a port range string into an array of port range objects

View File

@@ -0,0 +1,11 @@
import { z } from "zod";
export function createApiResponseSchema<T extends z.ZodTypeAny>(dataSchema: T) {
return z.object({
data: dataSchema.nullable(),
success: z.boolean(),
error: z.boolean(),
message: z.string(),
status: z.number()
});
}

View File

@@ -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( export async function createAlertRule(

View File

@@ -38,7 +38,22 @@ registry.registerPath({
request: { request: {
params: paramsSchema 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( export async function deleteAlertRule(

View File

@@ -49,7 +49,22 @@ registry.registerPath({
request: { request: {
params: paramsSchema 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( export async function getAlertRule(

View File

@@ -95,7 +95,22 @@ registry.registerPath({
query: querySchema, query: querySchema,
params: paramsSchema 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( export async function listAlertRules(

View File

@@ -13,6 +13,7 @@
import { Request, Response, NextFunction } from "express"; import { Request, Response, NextFunction } from "express";
import { z } from "zod"; import { z } from "zod";
import { createApiResponseSchema } from "@server/lib/openapi/createApiResponseSchema";
import { db } from "@server/db"; import { db } from "@server/db";
import { import {
alertRules, alertRules,
@@ -148,6 +149,10 @@ const bodySchema = z
export type UpdateAlertRuleResponse = { export type UpdateAlertRuleResponse = {
alertRuleId: number; alertRuleId: number;
}; };
const UpdateAlertRuleResponseDataSchema = z.object({
alertRuleId: z.number()
});
registry.registerPath({ registry.registerPath({
method: "post", method: "post",
@@ -164,7 +169,16 @@ registry.registerPath({
} }
} }
}, },
responses: {} responses: {
200: {
description: "Successful response",
content: {
"application/json": {
schema: createApiResponseSchema(UpdateAlertRuleResponseDataSchema)
}
}
}
}
}); });
export async function updateAlertRule( export async function updateAlertRule(

View File

@@ -24,7 +24,7 @@ import type { NextFunction, Request, Response } from "express";
const paramsSchema = z.strictObject({ const paramsSchema = z.strictObject({
orgId: z.string(), orgId: z.string(),
approvalId: z.string().transform(Number).pipe(z.int().positive()) approvalId: z.coerce.number().int().positive()
}); });
const bodySchema = z.strictObject({ const bodySchema = z.strictObject({

View File

@@ -18,6 +18,7 @@ import { OpenAPITags } from "@server/openApi";
import createHttpError from "http-errors"; import createHttpError from "http-errors";
import HttpCode from "@server/types/HttpCode"; import HttpCode from "@server/types/HttpCode";
import { fromError } from "zod-validation-error"; import { fromError } from "zod-validation-error";
import { z } from "zod";
import logger from "@server/logger"; import logger from "@server/logger";
import { import {
queryAccessAuditLogsParams, queryAccessAuditLogsParams,
@@ -37,7 +38,22 @@ registry.registerPath({
query: queryAccessAuditLogsQuery, query: queryAccessAuditLogsQuery,
params: queryAccessAuditLogsParams 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( export async function exportAccessAuditLogs(

View File

@@ -18,6 +18,7 @@ import { OpenAPITags } from "@server/openApi";
import createHttpError from "http-errors"; import createHttpError from "http-errors";
import HttpCode from "@server/types/HttpCode"; import HttpCode from "@server/types/HttpCode";
import { fromError } from "zod-validation-error"; import { fromError } from "zod-validation-error";
import { z } from "zod";
import logger from "@server/logger"; import logger from "@server/logger";
import { import {
queryActionAuditLogsParams, queryActionAuditLogsParams,
@@ -37,7 +38,22 @@ registry.registerPath({
query: queryActionAuditLogsQuery, query: queryActionAuditLogsQuery,
params: queryActionAuditLogsParams 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( export async function exportActionAuditLogs(

View File

@@ -18,6 +18,7 @@ import { OpenAPITags } from "@server/openApi";
import createHttpError from "http-errors"; import createHttpError from "http-errors";
import HttpCode from "@server/types/HttpCode"; import HttpCode from "@server/types/HttpCode";
import { fromError } from "zod-validation-error"; import { fromError } from "zod-validation-error";
import { z } from "zod";
import logger from "@server/logger"; import logger from "@server/logger";
import { import {
queryConnectionAuditLogsParams, queryConnectionAuditLogsParams,
@@ -37,7 +38,22 @@ registry.registerPath({
query: queryConnectionAuditLogsQuery, query: queryConnectionAuditLogsQuery,
params: queryConnectionAuditLogsParams 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( export async function exportConnectionAuditLogs(

View File

@@ -338,7 +338,22 @@ registry.registerPath({
query: queryAccessAuditLogsQuery, query: queryAccessAuditLogsQuery,
params: queryAccessAuditLogsParams 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( export async function queryAccessAuditLogs(

View File

@@ -165,7 +165,22 @@ registry.registerPath({
query: queryActionAuditLogsQuery, query: queryActionAuditLogsQuery,
params: queryActionAuditLogsParams 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( export async function queryActionAuditLogs(

View File

@@ -453,7 +453,22 @@ registry.registerPath({
query: queryConnectionAuditLogsQuery, query: queryConnectionAuditLogsQuery,
params: queryConnectionAuditLogsParams 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( export async function queryConnectionAuditLogs(

View File

@@ -39,7 +39,22 @@ const getOrgSchema = z.strictObject({
// request: { // request: {
// params: getOrgSchema // 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( export async function getOrgUsage(

View File

@@ -115,7 +115,22 @@ registry.registerPath({
orgId: z.string() 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( export async function getCertificate(

View File

@@ -25,7 +25,7 @@ import { fromError } from "zod-validation-error";
import { OpenAPITags, registry } from "@server/openApi"; import { OpenAPITags, registry } from "@server/openApi";
const restartCertificateParamsSchema = z.strictObject({ const restartCertificateParamsSchema = z.strictObject({
certId: z.string().transform(stoi).pipe(z.int().positive()), certId: z.coerce.number().int().positive(),
orgId: z.string() orgId: z.string()
}); });
@@ -36,11 +36,26 @@ registry.registerPath({
tags: ["Certificate"], tags: ["Certificate"],
request: { request: {
params: z.object({ params: z.object({
certId: z.string().transform(stoi).pipe(z.int().positive()), certId: z.coerce.number().int().positive(),
orgId: z.string() 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( export async function restartCertificate(

View File

@@ -42,7 +42,22 @@ registry.registerPath({
params: paramsSchema, params: paramsSchema,
query: querySchema 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( export async function checkDomainNamespaceAvailability(

View File

@@ -25,6 +25,7 @@ import { OpenAPITags, registry } from "@server/openApi";
import { isSubscribed } from "#private/lib/isSubscribed"; import { isSubscribed } from "#private/lib/isSubscribed";
import { build } from "@server/build"; import { build } from "@server/build";
import { tierMatrix } from "@server/lib/billing/tierMatrix"; import { tierMatrix } from "@server/lib/billing/tierMatrix";
import { createApiResponseSchema } from "@server/lib/openapi/createApiResponseSchema";
const paramsSchema = z.strictObject({}); const paramsSchema = z.strictObject({});
@@ -65,6 +66,20 @@ export type ListDomainNamespacesResponse = {
pagination: { total: number; limit: number; offset: number }; 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({ registry.registerPath({
method: "get", method: "get",
path: "/domains/namepaces", path: "/domains/namepaces",
@@ -73,7 +88,18 @@ registry.registerPath({
request: { request: {
query: querySchema query: querySchema
}, },
responses: {} responses: {
200: {
description: "Successful response",
content: {
"application/json": {
schema: createApiResponseSchema(
ListDomainNamespacesResponseDataSchema
)
}
}
}
}
}); });
export async function listDomainNamespaces( export async function listDomainNamespaces(

View File

@@ -13,6 +13,7 @@
import { Request, Response, NextFunction } from "express"; import { Request, Response, NextFunction } from "express";
import { z } from "zod"; import { z } from "zod";
import { createApiResponseSchema } from "@server/lib/openapi/createApiResponseSchema";
import { db } from "@server/db"; import { db } from "@server/db";
import { eventStreamingDestinations } from "@server/db"; import { eventStreamingDestinations } from "@server/db";
import { logStreamingManager } from "#private/lib/logStreaming"; import { logStreamingManager } from "#private/lib/logStreaming";
@@ -42,6 +43,10 @@ const bodySchema = z.strictObject({
export type CreateEventStreamingDestinationResponse = { export type CreateEventStreamingDestinationResponse = {
destinationId: number; destinationId: number;
}; };
const CreateEventStreamingDestinationResponseDataSchema = z.object({
destinationId: z.number()
});
registry.registerPath({ registry.registerPath({
method: "put", method: "put",
@@ -58,7 +63,16 @@ registry.registerPath({
} }
} }
}, },
responses: {} responses: {
200: {
description: "Successful response",
content: {
"application/json": {
schema: createApiResponseSchema(CreateEventStreamingDestinationResponseDataSchema)
}
}
}
}
}); });
export async function createEventStreamingDestination( export async function createEventStreamingDestination(

View File

@@ -38,7 +38,22 @@ registry.registerPath({
request: { request: {
params: paramsSchema 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( export async function deleteEventStreamingDestination(

View File

@@ -24,6 +24,7 @@ import { OpenAPITags, registry } from "@server/openApi";
import { eq, sql } from "drizzle-orm"; import { eq, sql } from "drizzle-orm";
import { decrypt } from "@server/lib/crypto"; import { decrypt } from "@server/lib/crypto";
import config from "@server/lib/config"; import config from "@server/lib/config";
import { createApiResponseSchema } from "@server/lib/openapi/createApiResponseSchema";
const paramsSchema = z.strictObject({ const paramsSchema = z.strictObject({
orgId: z.string().nonempty() 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) { async function query(orgId: string, limit: number, offset: number) {
const res = await db const res = await db
.select() .select()
@@ -88,7 +114,18 @@ registry.registerPath({
query: querySchema, query: querySchema,
params: paramsSchema params: paramsSchema
}, },
responses: {} responses: {
200: {
description: "Successful response",
content: {
"application/json": {
schema: createApiResponseSchema(
ListEventStreamingDestinationsResponseDataSchema
)
}
}
}
}
}); });
export async function listEventStreamingDestinations( export async function listEventStreamingDestinations(

View File

@@ -13,6 +13,7 @@
import { Request, Response, NextFunction } from "express"; import { Request, Response, NextFunction } from "express";
import { z } from "zod"; import { z } from "zod";
import { createApiResponseSchema } from "@server/lib/openapi/createApiResponseSchema";
import { db } from "@server/db"; import { db } from "@server/db";
import { eventStreamingDestinations } from "@server/db"; import { eventStreamingDestinations } from "@server/db";
import response from "@server/lib/response"; import response from "@server/lib/response";
@@ -45,6 +46,10 @@ const bodySchema = z.strictObject({
export type UpdateEventStreamingDestinationResponse = { export type UpdateEventStreamingDestinationResponse = {
destinationId: number; destinationId: number;
}; };
const UpdateEventStreamingDestinationResponseDataSchema = z.object({
destinationId: z.number()
});
registry.registerPath({ registry.registerPath({
method: "post", method: "post",
@@ -61,7 +66,16 @@ registry.registerPath({
} }
} }
}, },
responses: {} responses: {
200: {
description: "Successful response",
content: {
"application/json": {
schema: createApiResponseSchema(UpdateEventStreamingDestinationResponseDataSchema)
}
}
}
}
}); });
export async function updateEventStreamingDestination( export async function updateEventStreamingDestination(

View File

@@ -13,6 +13,7 @@
import { Request, Response, NextFunction } from "express"; import { Request, Response, NextFunction } from "express";
import { z } from "zod"; import { z } from "zod";
import { createApiResponseSchema } from "@server/lib/openapi/createApiResponseSchema";
import { db, targetHealthCheck, newts, sites } from "@server/db"; import { db, targetHealthCheck, newts, sites } from "@server/db";
import { eq } from "drizzle-orm"; import { eq } from "drizzle-orm";
import response from "@server/lib/response"; import response from "@server/lib/response";
@@ -52,6 +53,10 @@ const bodySchema = z.strictObject({
export type CreateHealthCheckResponse = { export type CreateHealthCheckResponse = {
targetHealthCheckId: number; targetHealthCheckId: number;
}; };
const CreateHealthCheckResponseDataSchema = z.object({
targetHealthCheckId: z.number()
});
registry.registerPath({ registry.registerPath({
method: "put", method: "put",
@@ -68,7 +73,16 @@ registry.registerPath({
} }
} }
}, },
responses: {} responses: {
200: {
description: "Successful response",
content: {
"application/json": {
schema: createApiResponseSchema(CreateHealthCheckResponseDataSchema)
}
}
}
}
}); });
export async function createHealthCheck( export async function createHealthCheck(

View File

@@ -41,7 +41,22 @@ registry.registerPath({
request: { request: {
params: paramsSchema 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( export async function deleteHealthCheck(

View File

@@ -68,7 +68,22 @@ registry.registerPath({
params: paramsSchema, params: paramsSchema,
query: querySchema 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( export async function listHealthChecks(

View File

@@ -13,6 +13,7 @@
import { Request, Response, NextFunction } from "express"; import { Request, Response, NextFunction } from "express";
import { z } from "zod"; import { z } from "zod";
import { createApiResponseSchema } from "@server/lib/openapi/createApiResponseSchema";
import { db, targetHealthCheck, newts, sites } from "@server/db"; import { db, targetHealthCheck, newts, sites } from "@server/db";
import response from "@server/lib/response"; import response from "@server/lib/response";
import HttpCode from "@server/types/HttpCode"; import HttpCode from "@server/types/HttpCode";
@@ -81,6 +82,29 @@ export type UpdateHealthCheckResponse = {
hcHealthyThreshold: number | null; hcHealthyThreshold: number | null;
hcUnhealthyThreshold: 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({ registry.registerPath({
method: "post", method: "post",
@@ -97,7 +121,16 @@ registry.registerPath({
} }
} }
}, },
responses: {} responses: {
200: {
description: "Successful response",
content: {
"application/json": {
schema: createApiResponseSchema(UpdateHealthCheckResponseDataSchema)
}
}
}
}
}); });
export async function updateHealthCheck( export async function updateHealthCheck(

View File

@@ -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( export async function createOrgOidcIdp(

View File

@@ -38,7 +38,22 @@ registry.registerPath({
request: { request: {
params: paramsSchema 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( export async function deleteOrgIdp(

View File

@@ -56,7 +56,22 @@ registry.registerPath({
request: { request: {
params: paramsSchema 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( export async function getOrgIdp(

View File

@@ -72,7 +72,22 @@ registry.registerPath({
query: querySchema, query: querySchema,
params: paramsSchema 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( export async function listOrgIdps(

View File

@@ -13,6 +13,7 @@
import { Request, Response, NextFunction } from "express"; import { Request, Response, NextFunction } from "express";
import { z } from "zod"; import { z } from "zod";
import { createApiResponseSchema } from "@server/lib/openapi/createApiResponseSchema";
import { db, idpOrg } from "@server/db"; import { db, idpOrg } from "@server/db";
import response from "@server/lib/response"; import response from "@server/lib/response";
import HttpCode from "@server/types/HttpCode"; import HttpCode from "@server/types/HttpCode";
@@ -54,6 +55,10 @@ const bodySchema = z.strictObject({
export type UpdateOrgIdpResponse = { export type UpdateOrgIdpResponse = {
idpId: number; idpId: number;
}; };
const UpdateOrgIdpResponseDataSchema = z.object({
idpId: z.number()
});
registry.registerPath({ registry.registerPath({
method: "post", method: "post",
@@ -70,7 +75,16 @@ registry.registerPath({
} }
} }
}, },
responses: {} responses: {
200: {
description: "Successful response",
content: {
"application/json": {
schema: createApiResponseSchema(UpdateOrgIdpResponseDataSchema)
}
}
}
}
}); });
export async function updateOrgOidcIdp( export async function updateOrgOidcIdp(

View File

@@ -28,7 +28,7 @@ import { OlmErrorCodes, sendOlmError } from "@server/routers/olm/error";
import { sendTerminateClient } from "@server/routers/client/terminate"; import { sendTerminateClient } from "@server/routers/client/terminate";
const reGenerateSecretParamsSchema = z.strictObject({ const reGenerateSecretParamsSchema = z.strictObject({
clientId: z.string().transform(Number).pipe(z.int().positive()) clientId: z.coerce.number().int().positive()
}); });
const reGenerateSecretBodySchema = z.strictObject({ const reGenerateSecretBodySchema = z.strictObject({

View File

@@ -27,7 +27,7 @@ import { getAllowedIps } from "@server/routers/target/helpers";
import { disconnectClient, sendToClient } from "#private/routers/ws"; import { disconnectClient, sendToClient } from "#private/routers/ws";
const updateSiteParamsSchema = z.strictObject({ const updateSiteParamsSchema = z.strictObject({
siteId: z.string().transform(Number).pipe(z.int().positive()) siteId: z.coerce.number().int().positive()
}); });
const updateSiteBodySchema = z.strictObject({ const updateSiteBodySchema = z.strictObject({

View File

@@ -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( export async function signSshKey(

View File

@@ -27,7 +27,7 @@ import { rebuildClientAssociationsFromClient } from "@server/lib/rebuildClientAs
const addUserRoleParamsSchema = z.strictObject({ const addUserRoleParamsSchema = z.strictObject({
userId: z.string(), userId: z.string(),
roleId: z.string().transform(stoi).pipe(z.number()) roleId: z.coerce.number()
}); });
registry.registerPath({ registry.registerPath({
@@ -38,7 +38,22 @@ registry.registerPath({
request: { request: {
params: addUserRoleParamsSchema 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( export async function addUserRole(

View File

@@ -27,7 +27,7 @@ import { rebuildClientAssociationsFromClient } from "@server/lib/rebuildClientAs
const removeUserRoleParamsSchema = z.strictObject({ const removeUserRoleParamsSchema = z.strictObject({
userId: z.string(), userId: z.string(),
roleId: z.string().transform(stoi).pipe(z.number()) roleId: z.coerce.number()
}); });
registry.registerPath({ registry.registerPath({
@@ -39,7 +39,22 @@ registry.registerPath({
request: { request: {
params: removeUserRoleParamsSchema 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( export async function removeUserRole(

View File

@@ -22,7 +22,22 @@ registry.registerPath({
request: { request: {
params: deleteAccessTokenParamsSchema 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( export async function deleteAccessToken(

View File

@@ -31,7 +31,7 @@ export const generateAccessTokenBodySchema = z.strictObject({
}); });
export const generateAccssTokenParamsSchema = 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< 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( export async function generateAccessToken(

View File

@@ -129,7 +129,22 @@ registry.registerPath({
}), }),
query: listAccessTokensSchema 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({ registry.registerPath({
@@ -143,7 +158,22 @@ registry.registerPath({
}), }),
query: listAccessTokensSchema 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( export async function listAccessTokens(

View File

@@ -2,6 +2,7 @@ import { NextFunction, Request, Response } from "express";
import { db } from "@server/db"; import { db } from "@server/db";
import HttpCode from "@server/types/HttpCode"; import HttpCode from "@server/types/HttpCode";
import { z } from "zod"; import { z } from "zod";
import { createApiResponseSchema } from "@server/lib/openapi/createApiResponseSchema";
import { apiKeyOrg, apiKeys } from "@server/db"; import { apiKeyOrg, apiKeys } from "@server/db";
import { fromError } from "zod-validation-error"; import { fromError } from "zod-validation-error";
import createHttpError from "http-errors"; import createHttpError from "http-errors";
@@ -32,6 +33,14 @@ export type CreateOrgApiKeyResponse = {
lastChars: string; lastChars: string;
createdAt: string; createdAt: string;
}; };
const CreateOrgApiKeyResponseDataSchema = z.object({
apiKeyId: z.string(),
name: z.string(),
apiKey: z.string(),
lastChars: z.string(),
createdAt: z.string()
});
registry.registerPath({ registry.registerPath({
method: "put", method: "put",
@@ -48,7 +57,16 @@ registry.registerPath({
} }
} }
}, },
responses: {} responses: {
200: {
description: "Successful response",
content: {
"application/json": {
schema: createApiResponseSchema(CreateOrgApiKeyResponseDataSchema)
}
}
}
}
}); });
export async function createOrgApiKey( export async function createOrgApiKey(

View File

@@ -22,7 +22,22 @@ registry.registerPath({
request: { request: {
params: paramsSchema 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( export async function deleteApiKey(

View File

@@ -9,6 +9,7 @@ import { z } from "zod";
import { fromError } from "zod-validation-error"; import { fromError } from "zod-validation-error";
import { eq } from "drizzle-orm"; import { eq } from "drizzle-orm";
import { OpenAPITags, registry } from "@server/openApi"; import { OpenAPITags, registry } from "@server/openApi";
import { createApiResponseSchema } from "@server/lib/openapi/createApiResponseSchema";
const paramsSchema = z.object({ const paramsSchema = z.object({
apiKeyId: z.string().nonempty() apiKeyId: z.string().nonempty()
@@ -44,6 +45,19 @@ export type ListApiKeyActionsResponse = {
pagination: { total: number; limit: number; offset: number }; 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({ registry.registerPath({
method: "get", method: "get",
path: "/org/{orgId}/api-key/{apiKeyId}/actions", path: "/org/{orgId}/api-key/{apiKeyId}/actions",
@@ -53,7 +67,18 @@ registry.registerPath({
params: paramsSchema, params: paramsSchema,
query: querySchema query: querySchema
}, },
responses: {} responses: {
200: {
description: "Successful response",
content: {
"application/json": {
schema: createApiResponseSchema(
ListApiKeyActionsResponseDataSchema
)
}
}
}
}
}); });
export async function listApiKeyActions( export async function listApiKeyActions(

View File

@@ -9,6 +9,7 @@ import { z } from "zod";
import { fromError } from "zod-validation-error"; import { fromError } from "zod-validation-error";
import { eq, and } from "drizzle-orm"; import { eq, and } from "drizzle-orm";
import { OpenAPITags, registry } from "@server/openApi"; import { OpenAPITags, registry } from "@server/openApi";
import { createApiResponseSchema } from "@server/lib/openapi/createApiResponseSchema";
const querySchema = z.object({ const querySchema = z.object({
limit: z limit: z
@@ -48,6 +49,23 @@ export type ListOrgApiKeysResponse = {
pagination: { total: number; limit: number; offset: number }; 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({ registry.registerPath({
method: "get", method: "get",
path: "/org/{orgId}/api-keys", path: "/org/{orgId}/api-keys",
@@ -57,7 +75,18 @@ registry.registerPath({
params: paramsSchema, params: paramsSchema,
query: querySchema query: querySchema
}, },
responses: {} responses: {
200: {
description: "Successful response",
content: {
"application/json": {
schema: createApiResponseSchema(
ListOrgApiKeysResponseDataSchema
)
}
}
}
}
}); });
export async function listOrgApiKeys( export async function listOrgApiKeys(

View File

@@ -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( export async function setApiKeyActions(

View File

@@ -5,6 +5,7 @@ import { OpenAPITags } from "@server/openApi";
import createHttpError from "http-errors"; import createHttpError from "http-errors";
import HttpCode from "@server/types/HttpCode"; import HttpCode from "@server/types/HttpCode";
import { fromError } from "zod-validation-error"; import { fromError } from "zod-validation-error";
import { z } from "zod";
import logger from "@server/logger"; import logger from "@server/logger";
import { import {
queryAccessAuditLogsQuery, queryAccessAuditLogsQuery,
@@ -28,7 +29,22 @@ registry.registerPath({
}), }),
params: queryRequestAuditLogsParams 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( export async function exportRequestAuditLogs(

View File

@@ -156,7 +156,22 @@ registry.registerPath({
query: queryAccessAuditLogsQuery, query: queryAccessAuditLogsQuery,
params: queryRequestAuditLogsParams 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<ReturnType<typeof query>>; export type QueryRequestAnalyticsResponse = Awaited<ReturnType<typeof query>>;

View File

@@ -241,7 +241,22 @@ registry.registerPath({
query: queryAccessAuditLogsQuery, query: queryAccessAuditLogsQuery,
params: queryRequestAuditLogsParams 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( async function queryUniqueFilterAttributes(

View File

@@ -9,7 +9,7 @@ import logger from "@server/logger";
export const params = z.strictObject({ export const params = z.strictObject({
token: z.string(), token: z.string(),
resourceId: z.string().transform(Number).pipe(z.int().positive()) resourceId: z.coerce.number().int().positive()
}); });
export type CheckResourceSessionParams = z.infer<typeof params>; export type CheckResourceSessionParams = z.infer<typeof params>;

View File

@@ -51,7 +51,22 @@ export type LookupUserResponse = {
// request: { // request: {
// body: lookupBodySchema // 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( export async function lookupUser(

View File

@@ -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( export async function applyJSONBlueprint(

View File

@@ -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( export async function applyYAMLBlueprint(

View File

@@ -7,13 +7,12 @@ import response from "@server/lib/response";
import HttpCode from "@server/types/HttpCode"; import HttpCode from "@server/types/HttpCode";
import createHttpError from "http-errors"; import createHttpError from "http-errors";
import logger from "@server/logger"; import logger from "@server/logger";
import stoi from "@server/lib/stoi";
import { fromError } from "zod-validation-error"; import { fromError } from "zod-validation-error";
import { OpenAPITags, registry } from "@server/openApi"; import { OpenAPITags, registry } from "@server/openApi";
import { BlueprintData } from "./types"; import { BlueprintData } from "./types";
const getBlueprintSchema = z.strictObject({ const getBlueprintSchema = z.strictObject({
blueprintId: z.string().transform(stoi).pipe(z.int().positive()), blueprintId: z.coerce.number().int().positive(),
orgId: z.string() orgId: z.string()
}); });
@@ -57,7 +56,22 @@ registry.registerPath({
request: { request: {
params: getBlueprintSchema 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( export async function getBlueprint(

View File

@@ -74,7 +74,22 @@ registry.registerPath({
}), }),
query: listBluePrintsSchema 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( export async function listBlueprints(

View File

@@ -11,7 +11,7 @@ import { fromError } from "zod-validation-error";
import { OpenAPITags, registry } from "@server/openApi"; import { OpenAPITags, registry } from "@server/openApi";
const archiveClientSchema = z.strictObject({ const archiveClientSchema = z.strictObject({
clientId: z.string().transform(Number).pipe(z.int().positive()) clientId: z.coerce.number().int().positive()
}); });
registry.registerPath({ registry.registerPath({
@@ -22,7 +22,22 @@ registry.registerPath({
request: { request: {
params: archiveClientSchema 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( export async function archiveClient(

View File

@@ -13,7 +13,7 @@ import { sendTerminateClient } from "./terminate";
import { OlmErrorCodes } from "../olm/error"; import { OlmErrorCodes } from "../olm/error";
const blockClientSchema = z.strictObject({ const blockClientSchema = z.strictObject({
clientId: z.string().transform(Number).pipe(z.int().positive()) clientId: z.coerce.number().int().positive()
}); });
registry.registerPath({ registry.registerPath({
@@ -24,7 +24,22 @@ registry.registerPath({
request: { request: {
params: blockClientSchema 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( export async function blockClient(

View File

@@ -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( export async function createClient(

View File

@@ -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( export async function createUserClient(

View File

@@ -14,7 +14,7 @@ import { sendTerminateClient } from "./terminate";
import { OlmErrorCodes } from "../olm/error"; import { OlmErrorCodes } from "../olm/error";
const deleteClientSchema = z.strictObject({ const deleteClientSchema = z.strictObject({
clientId: z.string().transform(Number).pipe(z.int().positive()) clientId: z.coerce.number().int().positive()
}); });
registry.registerPath({ registry.registerPath({
@@ -25,7 +25,22 @@ registry.registerPath({
request: { request: {
params: deleteClientSchema 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( export async function deleteClient(

View File

@@ -253,7 +253,22 @@ registry.registerPath({
niceId: z.string() 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({ registry.registerPath({
@@ -266,7 +281,22 @@ registry.registerPath({
clientId: z.number() 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( export async function getClient(

View File

@@ -186,7 +186,22 @@ registry.registerPath({
query: listClientsSchema, query: listClientsSchema,
params: listClientsParamsSchema 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( export async function listClients(

View File

@@ -213,7 +213,22 @@ registry.registerPath({
query: listUserDevicesSchema, query: listUserDevicesSchema,
params: listUserDevicesParamsSchema 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( export async function listUserDevices(

View File

@@ -6,6 +6,7 @@ import logger from "@server/logger";
import { generateId } from "@server/auth/sessions/app"; import { generateId } from "@server/auth/sessions/app";
import { getNextAvailableClientSubnet } from "@server/lib/ip"; import { getNextAvailableClientSubnet } from "@server/lib/ip";
import { z } from "zod"; import { z } from "zod";
import { createApiResponseSchema } from "@server/lib/openapi/createApiResponseSchema";
import { fromError } from "zod-validation-error"; import { fromError } from "zod-validation-error";
import { OpenAPITags, registry } from "@server/openApi"; import { OpenAPITags, registry } from "@server/openApi";
@@ -14,6 +15,12 @@ export type PickClientDefaultsResponse = {
olmSecret: string; olmSecret: string;
subnet: string; subnet: string;
}; };
const PickClientDefaultsResponseDataSchema = z.object({
olmId: z.string(),
olmSecret: z.string(),
subnet: z.string()
});
const pickClientDefaultsSchema = z.strictObject({ const pickClientDefaultsSchema = z.strictObject({
orgId: z.string() orgId: z.string()
@@ -27,7 +34,16 @@ registry.registerPath({
request: { request: {
params: pickClientDefaultsSchema params: pickClientDefaultsSchema
}, },
responses: {} responses: {
200: {
description: "Successful response",
content: {
"application/json": {
schema: createApiResponseSchema(PickClientDefaultsResponseDataSchema)
}
}
}
}
}); });
export async function pickClientDefaults( export async function pickClientDefaults(

View File

@@ -11,7 +11,7 @@ import { fromError } from "zod-validation-error";
import { OpenAPITags, registry } from "@server/openApi"; import { OpenAPITags, registry } from "@server/openApi";
const unarchiveClientSchema = z.strictObject({ const unarchiveClientSchema = z.strictObject({
clientId: z.string().transform(Number).pipe(z.int().positive()) clientId: z.coerce.number().int().positive()
}); });
registry.registerPath({ registry.registerPath({
@@ -22,7 +22,22 @@ registry.registerPath({
request: { request: {
params: unarchiveClientSchema 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( export async function unarchiveClient(

View File

@@ -11,7 +11,7 @@ import { fromError } from "zod-validation-error";
import { OpenAPITags, registry } from "@server/openApi"; import { OpenAPITags, registry } from "@server/openApi";
const unblockClientSchema = z.strictObject({ const unblockClientSchema = z.strictObject({
clientId: z.string().transform(Number).pipe(z.int().positive()) clientId: z.coerce.number().int().positive()
}); });
registry.registerPath({ registry.registerPath({
@@ -22,7 +22,22 @@ registry.registerPath({
request: { request: {
params: unblockClientSchema 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( export async function unblockClient(

View File

@@ -11,7 +11,7 @@ import { fromError } from "zod-validation-error";
import { OpenAPITags, registry } from "@server/openApi"; import { OpenAPITags, registry } from "@server/openApi";
const updateClientParamsSchema = z.strictObject({ const updateClientParamsSchema = z.strictObject({
clientId: z.string().transform(Number).pipe(z.int().positive()) clientId: z.coerce.number().int().positive()
}); });
const updateClientSchema = z.strictObject({ 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( export async function updateClient(

View File

@@ -37,7 +37,22 @@ registry.registerPath({
orgId: z.string() 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( export async function getDNSRecords(

View File

@@ -38,7 +38,22 @@ registry.registerPath({
orgId: z.string() 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( export async function getDomain(

View File

@@ -9,6 +9,7 @@ import { eq, sql } from "drizzle-orm";
import logger from "@server/logger"; import logger from "@server/logger";
import { fromError } from "zod-validation-error"; import { fromError } from "zod-validation-error";
import { OpenAPITags, registry } from "@server/openApi"; import { OpenAPITags, registry } from "@server/openApi";
import { createApiResponseSchema } from "@server/lib/openapi/createApiResponseSchema";
const listDomainsParamsSchema = z.strictObject({ const listDomainsParamsSchema = z.strictObject({
orgId: z.string() orgId: z.string()
@@ -56,6 +57,28 @@ export type ListDomainsResponse = {
pagination: { total: number; limit: number; offset: number }; 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({ registry.registerPath({
method: "get", method: "get",
path: "/org/{orgId}/domains", path: "/org/{orgId}/domains",
@@ -67,7 +90,16 @@ registry.registerPath({
}), }),
query: listDomainsSchema query: listDomainsSchema
}, },
responses: {} responses: {
200: {
description: "Successful response",
content: {
"application/json": {
schema: createApiResponseSchema(ListDomainsResponseDataSchema)
}
}
}
}
}); });
export async function listDomains( export async function listDomains(

View File

@@ -1,5 +1,6 @@
import { Request, Response, NextFunction } from "express"; import { Request, Response, NextFunction } from "express";
import { z } from "zod"; import { z } from "zod";
import { createApiResponseSchema } from "@server/lib/openapi/createApiResponseSchema";
import { db, domains, orgDomains } from "@server/db"; import { db, domains, orgDomains } from "@server/db";
import response from "@server/lib/response"; import response from "@server/lib/response";
import HttpCode from "@server/types/HttpCode"; import HttpCode from "@server/types/HttpCode";
@@ -24,6 +25,12 @@ export type UpdateDomainResponse = {
certResolver: string | null; certResolver: string | null;
preferWildcardCert: boolean | null; preferWildcardCert: boolean | null;
}; };
const UpdateDomainResponseDataSchema = z.object({
domainId: z.string(),
certResolver: z.string().nullable(),
preferWildcardCert: z.boolean().nullable()
});
registry.registerPath({ registry.registerPath({
method: "patch", method: "patch",
@@ -36,7 +43,16 @@ registry.registerPath({
orgId: z.string() orgId: z.string()
}) })
}, },
responses: {} responses: {
200: {
description: "Successful response",
content: {
"application/json": {
schema: createApiResponseSchema(UpdateDomainResponseDataSchema)
}
}
}
}
}); });
export async function updateOrgDomain( export async function updateOrgDomain(

View File

@@ -1,5 +1,6 @@
import { Request, Response, NextFunction } from "express"; import { Request, Response, NextFunction } from "express";
import { z } from "zod"; import { z } from "zod";
import { createApiResponseSchema } from "@server/lib/openapi/createApiResponseSchema";
import { db } from "@server/db"; import { db } from "@server/db";
import response from "@server/lib/response"; import response from "@server/lib/response";
import HttpCode from "@server/types/HttpCode"; import HttpCode from "@server/types/HttpCode";
@@ -22,6 +23,8 @@ const bodySchema = z.strictObject({
}); });
export type CreateIdpOrgPolicyResponse = {}; export type CreateIdpOrgPolicyResponse = {};
const CreateIdpOrgPolicyResponseDataSchema = z.object({});
registry.registerPath({ registry.registerPath({
method: "put", method: "put",
@@ -38,7 +41,16 @@ registry.registerPath({
} }
} }
}, },
responses: {} responses: {
200: {
description: "Successful response",
content: {
"application/json": {
schema: createApiResponseSchema(CreateIdpOrgPolicyResponseDataSchema)
}
}
}
}
}); });
export async function createIdpOrgPolicy( export async function createIdpOrgPolicy(

View File

@@ -1,5 +1,6 @@
import { Request, Response, NextFunction } from "express"; import { Request, Response, NextFunction } from "express";
import { z } from "zod"; import { z } from "zod";
import { createApiResponseSchema } from "@server/lib/openapi/createApiResponseSchema";
import { db } from "@server/db"; import { db } from "@server/db";
import response from "@server/lib/response"; import response from "@server/lib/response";
import HttpCode from "@server/types/HttpCode"; import HttpCode from "@server/types/HttpCode";
@@ -33,6 +34,11 @@ export type CreateIdpResponse = {
idpId: number; idpId: number;
redirectUrl: string; redirectUrl: string;
}; };
const CreateIdpResponseDataSchema = z.object({
idpId: z.number(),
redirectUrl: z.string()
});
registry.registerPath({ registry.registerPath({
method: "put", method: "put",
@@ -48,7 +54,16 @@ registry.registerPath({
} }
} }
}, },
responses: {} responses: {
200: {
description: "Successful response",
content: {
"application/json": {
schema: createApiResponseSchema(CreateIdpResponseDataSchema)
}
}
}
}
}); });
export async function createOidcIdp( export async function createOidcIdp(

View File

@@ -25,7 +25,22 @@ registry.registerPath({
request: { request: {
params: paramsSchema 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( export async function deleteIdp(

View File

@@ -23,7 +23,22 @@ registry.registerPath({
request: { request: {
params: paramsSchema 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( export async function deleteIdpOrgPolicy(

View File

@@ -38,7 +38,22 @@ registry.registerPath({
request: { request: {
params: paramsSchema 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( export async function getIdp(

View File

@@ -9,6 +9,7 @@ import { eq, sql } from "drizzle-orm";
import logger from "@server/logger"; import logger from "@server/logger";
import { fromError } from "zod-validation-error"; import { fromError } from "zod-validation-error";
import { OpenAPITags, registry } from "@server/openApi"; import { OpenAPITags, registry } from "@server/openApi";
import { createApiResponseSchema } from "@server/lib/openapi/createApiResponseSchema";
const paramsSchema = z.object({ const paramsSchema = z.object({
idpId: z.coerce.number<number>() idpId: z.coerce.number<number>()
@@ -44,6 +45,21 @@ export type ListIdpOrgPoliciesResponse = {
pagination: { total: number; limit: number; offset: number }; 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({ registry.registerPath({
method: "get", method: "get",
path: "/idp/{idpId}/org", path: "/idp/{idpId}/org",
@@ -53,7 +69,18 @@ registry.registerPath({
params: paramsSchema, params: paramsSchema,
query: querySchema query: querySchema
}, },
responses: {} responses: {
200: {
description: "Successful response",
content: {
"application/json": {
schema: createApiResponseSchema(
ListIdpOrgPoliciesResponseDataSchema
)
}
}
}
}
}); });
export async function listIdpOrgPolicies( export async function listIdpOrgPolicies(

View File

@@ -9,6 +9,7 @@ import { eq, sql } from "drizzle-orm";
import logger from "@server/logger"; import logger from "@server/logger";
import { fromError } from "zod-validation-error"; import { fromError } from "zod-validation-error";
import { OpenAPITags, registry } from "@server/openApi"; import { OpenAPITags, registry } from "@server/openApi";
import { createApiResponseSchema } from "@server/lib/openapi/createApiResponseSchema";
const querySchema = z.strictObject({ const querySchema = z.strictObject({
limit: z 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({ registry.registerPath({
method: "get", method: "get",
path: "/idp", path: "/idp",
@@ -62,7 +82,16 @@ registry.registerPath({
request: { request: {
query: querySchema query: querySchema
}, },
responses: {} responses: {
200: {
description: "Successful response",
content: {
"application/json": {
schema: createApiResponseSchema(ListIdpsResponseDataSchema)
}
}
}
}
}); });
export async function listIdps( export async function listIdps(

View File

@@ -1,5 +1,6 @@
import { Request, Response, NextFunction } from "express"; import { Request, Response, NextFunction } from "express";
import { z } from "zod"; import { z } from "zod";
import { createApiResponseSchema } from "@server/lib/openapi/createApiResponseSchema";
import { db } from "@server/db"; import { db } from "@server/db";
import response from "@server/lib/response"; import response from "@server/lib/response";
import HttpCode from "@server/types/HttpCode"; import HttpCode from "@server/types/HttpCode";
@@ -21,6 +22,8 @@ const bodySchema = z.strictObject({
}); });
export type UpdateIdpOrgPolicyResponse = {}; export type UpdateIdpOrgPolicyResponse = {};
const UpdateIdpOrgPolicyResponseDataSchema = z.object({});
registry.registerPath({ registry.registerPath({
method: "post", method: "post",
@@ -37,7 +40,16 @@ registry.registerPath({
} }
} }
}, },
responses: {} responses: {
200: {
description: "Successful response",
content: {
"application/json": {
schema: createApiResponseSchema(UpdateIdpOrgPolicyResponseDataSchema)
}
}
}
}
}); });
export async function updateIdpOrgPolicy( export async function updateIdpOrgPolicy(

View File

@@ -1,5 +1,6 @@
import { Request, Response, NextFunction } from "express"; import { Request, Response, NextFunction } from "express";
import { z } from "zod"; import { z } from "zod";
import { createApiResponseSchema } from "@server/lib/openapi/createApiResponseSchema";
import { db } from "@server/db"; import { db } from "@server/db";
import response from "@server/lib/response"; import response from "@server/lib/response";
import HttpCode from "@server/types/HttpCode"; import HttpCode from "@server/types/HttpCode";
@@ -38,6 +39,10 @@ const bodySchema = z.strictObject({
export type UpdateIdpResponse = { export type UpdateIdpResponse = {
idpId: number; idpId: number;
}; };
const UpdateIdpResponseDataSchema = z.object({
idpId: z.number()
});
registry.registerPath({ registry.registerPath({
method: "post", method: "post",
@@ -54,7 +59,16 @@ registry.registerPath({
} }
} }
}, },
responses: {} responses: {
200: {
description: "Successful response",
content: {
"application/json": {
schema: createApiResponseSchema(UpdateIdpResponseDataSchema)
}
}
}
}
}); });
export async function updateOidcIdp( export async function updateOidcIdp(

View File

@@ -43,7 +43,22 @@ export type CreateOlmResponse = {
// }, // },
// params: paramsSchema // 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( export async function createUserOlm(

View File

@@ -28,7 +28,22 @@ const paramsSchema = z
// request: { // request: {
// params: paramsSchema // 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( export async function deleteUserOlm(

View File

@@ -30,7 +30,22 @@ const querySchema = z.object({
// request: { // request: {
// params: paramsSchema // 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( export async function getUserOlm(

View File

@@ -41,7 +41,22 @@ const paramsSchema = z
// query: querySchema, // query: querySchema,
// params: paramsSchema // 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 = { export type ListUserOlmsResponse = {

View File

@@ -83,7 +83,22 @@ registry.registerPath({
request: { request: {
params: paramsSchema 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( export async function checkOrgUserAccess(

View File

@@ -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( export async function createOrg(

View File

@@ -24,7 +24,22 @@ registry.registerPath({
request: { request: {
params: deleteOrgSchema 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( export async function deleteOrg(

View File

@@ -1,5 +1,6 @@
import { Request, Response, NextFunction } from "express"; import { Request, Response, NextFunction } from "express";
import { z } from "zod"; import { z } from "zod";
import { createApiResponseSchema } from "@server/lib/openapi/createApiResponseSchema";
import { db } from "@server/db"; import { db } from "@server/db";
import { Org, orgs } from "@server/db"; import { Org, orgs } from "@server/db";
import { eq } from "drizzle-orm"; import { eq } from "drizzle-orm";
@@ -17,6 +18,10 @@ const getOrgSchema = z.strictObject({
export type GetOrgResponse = { export type GetOrgResponse = {
org: Org; org: Org;
}; };
const GetOrgResponseDataSchema = z.object({
org: z.object({}).passthrough()
});
registry.registerPath({ registry.registerPath({
method: "get", method: "get",
@@ -26,7 +31,16 @@ registry.registerPath({
request: { request: {
params: getOrgSchema params: getOrgSchema
}, },
responses: {} responses: {
200: {
description: "Successful response",
content: {
"application/json": {
schema: createApiResponseSchema(GetOrgResponseDataSchema)
}
}
}
}
}); });
export async function getOrg( export async function getOrg(

View File

@@ -9,6 +9,7 @@ import { sql, inArray, eq } from "drizzle-orm";
import logger from "@server/logger"; import logger from "@server/logger";
import { fromZodError } from "zod-validation-error"; import { fromZodError } from "zod-validation-error";
import { OpenAPITags, registry } from "@server/openApi"; import { OpenAPITags, registry } from "@server/openApi";
import { createApiResponseSchema } from "@server/lib/openapi/createApiResponseSchema";
const listOrgsSchema = z.object({ const listOrgsSchema = z.object({
limit: z limit: z
@@ -33,7 +34,16 @@ registry.registerPath({
request: { request: {
query: listOrgsSchema query: listOrgsSchema
}, },
responses: {} responses: {
200: {
description: "Successful response",
content: {
"application/json": {
schema: createApiResponseSchema(ListOrgsResponseDataSchema)
}
}
}
}
}); });
export type ListOrgsResponse = { export type ListOrgsResponse = {
@@ -41,6 +51,15 @@ export type ListOrgsResponse = {
pagination: { total: number; limit: number; offset: number }; 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( export async function listOrgs(
req: Request, req: Request,
res: Response, res: Response,

View File

@@ -37,7 +37,22 @@ const listOrgsSchema = z.object({
// request: { // request: {
// query: listOrgsSchema // 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 & { type ResponseOrg = Org & {

View File

@@ -21,7 +21,22 @@ registry.registerPath({
request: { request: {
params: resetOrgBandwidthParamsSchema 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( export async function resetOrgBandwidth(

View File

@@ -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( export async function updateOrg(

View File

@@ -22,7 +22,7 @@ const addEmailToResourceWhitelistBodySchema = z.strictObject({
}); });
const addEmailToResourceWhitelistParamsSchema = z.strictObject({ const addEmailToResourceWhitelistParamsSchema = z.strictObject({
resourceId: z.string().transform(Number).pipe(z.int().positive()) resourceId: z.coerce.number().int().positive()
}); });
registry.registerPath({ 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( export async function addEmailToResourceWhitelist(

View File

@@ -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( export async function addRoleToResource(

View File

@@ -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( export async function addUserToResource(

View File

@@ -20,7 +20,7 @@ export const authWithPasswordBodySchema = z.strictObject({
}); });
export const authWithPasswordParamsSchema = 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 = { export type AuthWithPasswordResponse = {

View File

@@ -19,7 +19,7 @@ export const authWithPincodeBodySchema = z.strictObject({
}); });
export const authWithPincodeParamsSchema = 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 = { export type AuthWithPincodeResponse = {

View File

@@ -20,7 +20,7 @@ const authWithWhitelistBodySchema = z.strictObject({
}); });
const authWithWhitelistParamsSchema = z.strictObject({ const authWithWhitelistParamsSchema = z.strictObject({
resourceId: z.string().transform(Number).pipe(z.int().positive()) resourceId: z.coerce.number().int().positive()
}); });
export type AuthWithWhitelistResponse = { export type AuthWithWhitelistResponse = {

View File

@@ -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( export async function createResource(

View File

@@ -25,7 +25,7 @@ const createResourceRuleSchema = z.strictObject({
}); });
const createResourceRuleParamsSchema = z.strictObject({ const createResourceRuleParamsSchema = z.strictObject({
resourceId: z.string().transform(Number).pipe(z.int().positive()) resourceId: z.coerce.number().int().positive()
}); });
registry.registerPath({ 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( export async function createResourceRule(

Some files were not shown because too many files have changed in this diff Show More