From 7ac4b0b79fa496ae356b04268fa18d0337eb4384 Mon Sep 17 00:00:00 2001 From: Daniel Hougaard Date: Thu, 26 Sep 2024 20:48:00 +0400 Subject: [PATCH] feat(api-docs): add error responses to API documentation --- .../routes/v1/dynamic-secret-lease-router.ts | 6 ++- .../src/ee/routes/v1/dynamic-secret-router.ts | 9 ++++- backend/src/ee/routes/v1/group-router.ts | 9 +++++ ...ity-project-additional-privilege-router.ts | 7 ++++ .../src/ee/routes/v1/project-role-router.ts | 12 +++++- backend/src/ee/routes/v1/project-router.ts | 2 + backend/src/ee/routes/v1/snapshot-router.ts | 3 +- backend/src/server/routes/sanitizedSchemas.ts | 38 +++++++++++++++++++ .../routes/v1/certificate-authority-router.ts | 17 +++++++++ .../server/routes/v1/certificate-router.ts | 8 ++++ .../routes/v1/certificate-template-router.ts | 9 +++++ .../routes/v1/identity-aws-iam-auth-router.ts | 7 ++++ .../routes/v1/identity-azure-auth-router.ts | 7 ++++ .../routes/v1/identity-gcp-auth-router.ts | 7 ++++ .../v1/identity-kubernetes-auth-router.ts | 7 ++++ .../routes/v1/identity-oidc-auth-router.ts | 7 ++++ .../src/server/routes/v1/identity-router.ts | 7 +++- .../routes/v1/identity-token-auth-router.ts | 10 +++++ .../v1/identity-universal-auth-router.ts | 11 ++++++ .../routes/v1/integration-auth-router.ts | 6 ++- .../server/routes/v1/integration-router.ts | 5 +++ .../server/routes/v1/organization-router.ts | 3 ++ .../src/server/routes/v1/pki-alert-router.ts | 6 +++ .../server/routes/v1/pki-collection-router.ts | 9 +++++ .../server/routes/v1/project-env-router.ts | 5 +++ .../routes/v1/project-membership-router.ts | 5 +++ .../src/server/routes/v1/project-router.ts | 6 ++- .../server/routes/v1/secret-folder-router.ts | 7 ++++ .../server/routes/v1/secret-import-router.ts | 6 ++- .../src/server/routes/v1/secret-tag-router.ts | 8 ++++ .../server/routes/v2/group-project-router.ts | 7 ++++ .../server/routes/v2/identity-org-router.ts | 3 ++ .../routes/v2/identity-project-router.ts | 7 +++- .../server/routes/v2/organization-router.ts | 6 +++ .../routes/v2/project-membership-router.ts | 4 ++ .../src/server/routes/v2/project-router.ts | 5 ++- .../server/routes/v2/service-token-router.ts | 3 +- backend/src/server/routes/v3/secret-router.ts | 25 +++++++++++- docs/mint.json | 2 +- 39 files changed, 297 insertions(+), 14 deletions(-) diff --git a/backend/src/ee/routes/v1/dynamic-secret-lease-router.ts b/backend/src/ee/routes/v1/dynamic-secret-lease-router.ts index c19af4d22..60b333a61 100644 --- a/backend/src/ee/routes/v1/dynamic-secret-lease-router.ts +++ b/backend/src/ee/routes/v1/dynamic-secret-lease-router.ts @@ -7,7 +7,7 @@ import { daysToMillisecond } from "@app/lib/dates"; import { removeTrailingSlash } from "@app/lib/fn"; import { readLimit, writeLimit } from "@app/server/config/rateLimiter"; import { verifyAuth } from "@app/server/plugins/auth/verify-auth"; -import { SanitizedDynamicSecretSchema } from "@app/server/routes/sanitizedSchemas"; +import { DefaultResponseErrorsSchema, SanitizedDynamicSecretSchema } from "@app/server/routes/sanitizedSchemas"; import { AuthMode } from "@app/services/auth/auth-type"; export const registerDynamicSecretLeaseRouter = async (server: FastifyZodProvider) => { @@ -37,6 +37,7 @@ export const registerDynamicSecretLeaseRouter = async (server: FastifyZodProvide environmentSlug: z.string().min(1).describe(DYNAMIC_SECRET_LEASES.CREATE.path) }), response: { + ...DefaultResponseErrorsSchema, 200: z.object({ lease: DynamicSecretLeasesSchema, dynamicSecret: SanitizedDynamicSecretSchema, @@ -81,6 +82,7 @@ export const registerDynamicSecretLeaseRouter = async (server: FastifyZodProvide isForced: z.boolean().default(false).describe(DYNAMIC_SECRET_LEASES.DELETE.isForced) }), response: { + ...DefaultResponseErrorsSchema, 200: z.object({ lease: DynamicSecretLeasesSchema }) @@ -134,6 +136,7 @@ export const registerDynamicSecretLeaseRouter = async (server: FastifyZodProvide environmentSlug: z.string().min(1).describe(DYNAMIC_SECRET_LEASES.RENEW.environmentSlug) }), response: { + ...DefaultResponseErrorsSchema, 200: z.object({ lease: DynamicSecretLeasesSchema }) @@ -174,6 +177,7 @@ export const registerDynamicSecretLeaseRouter = async (server: FastifyZodProvide environmentSlug: z.string().min(1).describe(DYNAMIC_SECRET_LEASES.GET_BY_LEASEID.environmentSlug) }), response: { + ...DefaultResponseErrorsSchema, 200: z.object({ lease: DynamicSecretLeasesSchema.extend({ dynamicSecret: SanitizedDynamicSecretSchema diff --git a/backend/src/ee/routes/v1/dynamic-secret-router.ts b/backend/src/ee/routes/v1/dynamic-secret-router.ts index 4b1566c55..1b28467eb 100644 --- a/backend/src/ee/routes/v1/dynamic-secret-router.ts +++ b/backend/src/ee/routes/v1/dynamic-secret-router.ts @@ -9,7 +9,7 @@ import { daysToMillisecond } from "@app/lib/dates"; import { removeTrailingSlash } from "@app/lib/fn"; import { readLimit, writeLimit } from "@app/server/config/rateLimiter"; import { verifyAuth } from "@app/server/plugins/auth/verify-auth"; -import { SanitizedDynamicSecretSchema } from "@app/server/routes/sanitizedSchemas"; +import { DefaultResponseErrorsSchema, SanitizedDynamicSecretSchema } from "@app/server/routes/sanitizedSchemas"; import { AuthMode } from "@app/services/auth/auth-type"; export const registerDynamicSecretRouter = async (server: FastifyZodProvider) => { @@ -59,6 +59,7 @@ export const registerDynamicSecretRouter = async (server: FastifyZodProvider) => }) }), response: { + ...DefaultResponseErrorsSchema, 200: z.object({ dynamicSecret: SanitizedDynamicSecretSchema }) @@ -90,6 +91,7 @@ export const registerDynamicSecretRouter = async (server: FastifyZodProvider) => clientSecret: z.string().min(1).describe("The client secret of the Azure Entra ID App Registration") }), response: { + ...DefaultResponseErrorsSchema, 200: z .object({ name: z.string().min(1).describe("The name of the user"), @@ -155,6 +157,7 @@ export const registerDynamicSecretRouter = async (server: FastifyZodProvider) => }) }), response: { + ...DefaultResponseErrorsSchema, 200: z.object({ dynamicSecret: SanitizedDynamicSecretSchema }) @@ -194,6 +197,7 @@ export const registerDynamicSecretRouter = async (server: FastifyZodProvider) => isForced: z.boolean().default(false).describe(DYNAMIC_SECRETS.DELETE.isForced) }), response: { + ...DefaultResponseErrorsSchema, 200: z.object({ dynamicSecret: SanitizedDynamicSecretSchema }) @@ -229,6 +233,7 @@ export const registerDynamicSecretRouter = async (server: FastifyZodProvider) => environmentSlug: z.string().min(1).describe(DYNAMIC_SECRETS.GET_BY_NAME.environmentSlug) }), response: { + ...DefaultResponseErrorsSchema, 200: z.object({ dynamicSecret: SanitizedDynamicSecretSchema.extend({ inputs: z.unknown() @@ -263,6 +268,7 @@ export const registerDynamicSecretRouter = async (server: FastifyZodProvider) => environmentSlug: z.string().min(1).describe(DYNAMIC_SECRETS.LIST.environmentSlug) }), response: { + ...DefaultResponseErrorsSchema, 200: z.object({ dynamicSecrets: SanitizedDynamicSecretSchema.array() }) @@ -302,6 +308,7 @@ export const registerDynamicSecretRouter = async (server: FastifyZodProvider) => environmentSlug: z.string().min(1).describe(DYNAMIC_SECRETS.LIST_LEAES_BY_NAME.environmentSlug) }), response: { + ...DefaultResponseErrorsSchema, 200: z.object({ leases: DynamicSecretLeasesSchema.array() }) diff --git a/backend/src/ee/routes/v1/group-router.ts b/backend/src/ee/routes/v1/group-router.ts index fed6adaba..738f71cf5 100644 --- a/backend/src/ee/routes/v1/group-router.ts +++ b/backend/src/ee/routes/v1/group-router.ts @@ -4,6 +4,7 @@ import { z } from "zod"; import { GroupsSchema, OrgMembershipRole, UsersSchema } from "@app/db/schemas"; import { GROUPS } from "@app/lib/api-docs"; import { verifyAuth } from "@app/server/plugins/auth/verify-auth"; +import { DefaultResponseErrorsSchema } from "@app/server/routes/sanitizedSchemas"; import { AuthMode } from "@app/services/auth/auth-type"; export const registerGroupRouter = async (server: FastifyZodProvider) => { @@ -26,6 +27,7 @@ export const registerGroupRouter = async (server: FastifyZodProvider) => { role: z.string().trim().min(1).default(OrgMembershipRole.NoAccess).describe(GROUPS.CREATE.role) }), response: { + ...DefaultResponseErrorsSchema, 200: GroupsSchema } }, @@ -51,6 +53,7 @@ export const registerGroupRouter = async (server: FastifyZodProvider) => { id: z.string().trim().describe(GROUPS.GET_BY_ID.id) }), response: { + ...DefaultResponseErrorsSchema, 200: GroupsSchema } }, @@ -73,6 +76,7 @@ export const registerGroupRouter = async (server: FastifyZodProvider) => { onRequest: verifyAuth([AuthMode.JWT, AuthMode.IDENTITY_ACCESS_TOKEN]), schema: { response: { + ...DefaultResponseErrorsSchema, 200: GroupsSchema.array() } }, @@ -112,6 +116,7 @@ export const registerGroupRouter = async (server: FastifyZodProvider) => { }) .partial(), response: { + ...DefaultResponseErrorsSchema, 200: GroupsSchema } }, @@ -138,6 +143,7 @@ export const registerGroupRouter = async (server: FastifyZodProvider) => { id: z.string().trim().describe(GROUPS.DELETE.id) }), response: { + ...DefaultResponseErrorsSchema, 200: GroupsSchema } }, @@ -168,6 +174,7 @@ export const registerGroupRouter = async (server: FastifyZodProvider) => { username: z.string().optional().describe(GROUPS.LIST_USERS.username) }), response: { + ...DefaultResponseErrorsSchema, 200: z.object({ users: UsersSchema.pick({ email: true, @@ -210,6 +217,7 @@ export const registerGroupRouter = async (server: FastifyZodProvider) => { username: z.string().trim().describe(GROUPS.ADD_USER.username) }), response: { + ...DefaultResponseErrorsSchema, 200: UsersSchema.pick({ email: true, username: true, @@ -243,6 +251,7 @@ export const registerGroupRouter = async (server: FastifyZodProvider) => { username: z.string().trim().describe(GROUPS.DELETE_USER.username) }), response: { + ...DefaultResponseErrorsSchema, 200: UsersSchema.pick({ email: true, username: true, diff --git a/backend/src/ee/routes/v1/identity-project-additional-privilege-router.ts b/backend/src/ee/routes/v1/identity-project-additional-privilege-router.ts index 2e7fd60d3..1024766f5 100644 --- a/backend/src/ee/routes/v1/identity-project-additional-privilege-router.ts +++ b/backend/src/ee/routes/v1/identity-project-additional-privilege-router.ts @@ -10,6 +10,7 @@ import { alphaNumericNanoId } from "@app/lib/nanoid"; import { readLimit, writeLimit } from "@app/server/config/rateLimiter"; import { verifyAuth } from "@app/server/plugins/auth/verify-auth"; import { + DefaultResponseErrorsSchema, ProjectPermissionSchema, ProjectSpecificPrivilegePermissionSchema, SanitizedIdentityPrivilegeSchema @@ -52,6 +53,7 @@ export const registerIdentityProjectAdditionalPrivilegeRouter = async (server: F ).optional() }), response: { + ...DefaultResponseErrorsSchema, 200: z.object({ privilege: SanitizedIdentityPrivilegeSchema }) @@ -131,6 +133,7 @@ export const registerIdentityProjectAdditionalPrivilegeRouter = async (server: F .describe(IDENTITY_ADDITIONAL_PRIVILEGE.CREATE.temporaryAccessStartTime) }), response: { + ...DefaultResponseErrorsSchema, 200: z.object({ privilege: SanitizedIdentityPrivilegeSchema }) @@ -215,6 +218,7 @@ export const registerIdentityProjectAdditionalPrivilegeRouter = async (server: F .partial() }), response: { + ...DefaultResponseErrorsSchema, 200: z.object({ privilege: SanitizedIdentityPrivilegeSchema }) @@ -270,6 +274,7 @@ export const registerIdentityProjectAdditionalPrivilegeRouter = async (server: F projectSlug: z.string().min(1).describe(IDENTITY_ADDITIONAL_PRIVILEGE.DELETE.projectSlug) }), response: { + ...DefaultResponseErrorsSchema, 200: z.object({ privilege: SanitizedIdentityPrivilegeSchema }) @@ -311,6 +316,7 @@ export const registerIdentityProjectAdditionalPrivilegeRouter = async (server: F projectSlug: z.string().min(1).describe(IDENTITY_ADDITIONAL_PRIVILEGE.GET_BY_SLUG.projectSlug) }), response: { + ...DefaultResponseErrorsSchema, 200: z.object({ privilege: SanitizedIdentityPrivilegeSchema }) @@ -348,6 +354,7 @@ export const registerIdentityProjectAdditionalPrivilegeRouter = async (server: F projectSlug: z.string().min(1).describe(IDENTITY_ADDITIONAL_PRIVILEGE.LIST.projectSlug) }), response: { + ...DefaultResponseErrorsSchema, 200: z.object({ privileges: SanitizedIdentityPrivilegeSchema.array() }) diff --git a/backend/src/ee/routes/v1/project-role-router.ts b/backend/src/ee/routes/v1/project-role-router.ts index bbb03f4ae..ed60e0a22 100644 --- a/backend/src/ee/routes/v1/project-role-router.ts +++ b/backend/src/ee/routes/v1/project-role-router.ts @@ -6,7 +6,11 @@ import { ProjectMembershipRole, ProjectMembershipsSchema, ProjectRolesSchema } f import { PROJECT_ROLE } from "@app/lib/api-docs"; import { readLimit, writeLimit } from "@app/server/config/rateLimiter"; import { verifyAuth } from "@app/server/plugins/auth/verify-auth"; -import { ProjectPermissionSchema, SanitizedRoleSchema } from "@app/server/routes/sanitizedSchemas"; +import { + DefaultResponseErrorsSchema, + ProjectPermissionSchema, + SanitizedRoleSchema +} from "@app/server/routes/sanitizedSchemas"; import { AuthMode } from "@app/services/auth/auth-type"; export const registerProjectRoleRouter = async (server: FastifyZodProvider) => { @@ -45,6 +49,7 @@ export const registerProjectRoleRouter = async (server: FastifyZodProvider) => { permissions: ProjectPermissionSchema.array().describe(PROJECT_ROLE.CREATE.permissions) }), response: { + ...DefaultResponseErrorsSchema, 200: z.object({ role: SanitizedRoleSchema }) @@ -105,6 +110,7 @@ export const registerProjectRoleRouter = async (server: FastifyZodProvider) => { permissions: ProjectPermissionSchema.array().describe(PROJECT_ROLE.UPDATE.permissions).optional() }), response: { + ...DefaultResponseErrorsSchema, 200: z.object({ role: SanitizedRoleSchema }) @@ -146,6 +152,7 @@ export const registerProjectRoleRouter = async (server: FastifyZodProvider) => { roleId: z.string().trim().describe(PROJECT_ROLE.DELETE.roleId) }), response: { + ...DefaultResponseErrorsSchema, 200: z.object({ role: SanitizedRoleSchema }) @@ -182,6 +189,7 @@ export const registerProjectRoleRouter = async (server: FastifyZodProvider) => { projectSlug: z.string().trim().describe(PROJECT_ROLE.LIST.projectSlug) }), response: { + ...DefaultResponseErrorsSchema, 200: z.object({ roles: ProjectRolesSchema.omit({ permissions: true }).array() }) @@ -212,6 +220,7 @@ export const registerProjectRoleRouter = async (server: FastifyZodProvider) => { slug: z.string().trim().describe(PROJECT_ROLE.GET_ROLE_BY_SLUG.roleSlug) }), response: { + ...DefaultResponseErrorsSchema, 200: z.object({ role: SanitizedRoleSchema }) @@ -242,6 +251,7 @@ export const registerProjectRoleRouter = async (server: FastifyZodProvider) => { projectId: z.string().trim() }), response: { + ...DefaultResponseErrorsSchema, 200: z.object({ data: z.object({ membership: ProjectMembershipsSchema.extend({ diff --git a/backend/src/ee/routes/v1/project-router.ts b/backend/src/ee/routes/v1/project-router.ts index fccfbd158..bb006789b 100644 --- a/backend/src/ee/routes/v1/project-router.ts +++ b/backend/src/ee/routes/v1/project-router.ts @@ -6,6 +6,7 @@ import { AUDIT_LOGS, PROJECTS } from "@app/lib/api-docs"; import { getLastMidnightDateISO, removeTrailingSlash } from "@app/lib/fn"; import { readLimit, writeLimit } from "@app/server/config/rateLimiter"; import { verifyAuth } from "@app/server/plugins/auth/verify-auth"; +import { DefaultResponseErrorsSchema } from "@app/server/routes/sanitizedSchemas"; import { AuthMode } from "@app/services/auth/auth-type"; import { KmsType } from "@app/services/kms/kms-types"; @@ -33,6 +34,7 @@ export const registerProjectRouter = async (server: FastifyZodProvider) => { limit: z.coerce.number().default(20).describe(PROJECTS.GET_SNAPSHOTS.limit) }), response: { + ...DefaultResponseErrorsSchema, 200: z.object({ secretSnapshots: SecretSnapshotsSchema.array() }) diff --git a/backend/src/ee/routes/v1/snapshot-router.ts b/backend/src/ee/routes/v1/snapshot-router.ts index a716aabd7..52130500d 100644 --- a/backend/src/ee/routes/v1/snapshot-router.ts +++ b/backend/src/ee/routes/v1/snapshot-router.ts @@ -4,7 +4,7 @@ import { SecretSnapshotsSchema, SecretTagsSchema } from "@app/db/schemas"; import { PROJECTS } from "@app/lib/api-docs"; import { readLimit, writeLimit } from "@app/server/config/rateLimiter"; import { verifyAuth } from "@app/server/plugins/auth/verify-auth"; -import { secretRawSchema } from "@app/server/routes/sanitizedSchemas"; +import { DefaultResponseErrorsSchema, secretRawSchema } from "@app/server/routes/sanitizedSchemas"; import { AuthMode } from "@app/services/auth/auth-type"; export const registerSnapshotRouter = async (server: FastifyZodProvider) => { @@ -77,6 +77,7 @@ export const registerSnapshotRouter = async (server: FastifyZodProvider) => { secretSnapshotId: z.string().trim().describe(PROJECTS.ROLLBACK_TO_SNAPSHOT.secretSnapshotId) }), response: { + ...DefaultResponseErrorsSchema, 200: z.object({ secretSnapshot: SecretSnapshotsSchema }) diff --git a/backend/src/server/routes/sanitizedSchemas.ts b/backend/src/server/routes/sanitizedSchemas.ts index 02d9e37e0..578106567 100644 --- a/backend/src/server/routes/sanitizedSchemas.ts +++ b/backend/src/server/routes/sanitizedSchemas.ts @@ -27,6 +27,44 @@ export const integrationAuthPubSchema = IntegrationAuthsSchema.pick({ updatedAt: true }); +export const DefaultResponseErrorsSchema = { + 400: z.object({ + statusCode: z.literal(400), + message: z.literal( + `: Contains a human-readable message about what went wrong. 400 errors are bad request errors, and are will occur to happen when passing or unexpected bad data in the request` + ), + error: z.literal(`: Contains a human-readable error name.`) + }), + 404: z.object({ + statusCode: z.literal(404), + message: z.literal( + `: Contains a human-readable message about what went wrong. 404 errors are not found errors, and will occur when a resource is not found` + ), + error: z.literal(`: Contains a human-readable error name.`) + }), + 401: z.object({ + statusCode: z.literal(401), + message: z.literal( + `: Contains a human-readable message about what went wrong. 401 errors are unauthorized errors, and will occur when attempting to access a resource with invalid or missing credentials` + ), + error: z.literal(`: Contains a human-readable error name.`) + }), + 403: z.object({ + statusCode: z.literal(403), + message: z.literal( + `: Contains a human-readable message about what went wrong. 403 errors are forbidden errors, and will occur when attempting to access a resource without the necessary permissions` + ), + error: z.literal(`: Contains a human-readable error name.`) + }), + 500: z.object({ + statusCode: z.literal(500), + message: z.literal( + `: Contains a human-readable message about what went wrong. 500 errors are internal server errors, and will occur when an unexpected error occurs on the server` + ), + error: z.literal(`: Contains a human-readable error name.`) + }) +}; + export const sapPubSchema = SecretApprovalPoliciesSchema.merge( z.object({ environment: z.object({ diff --git a/backend/src/server/routes/v1/certificate-authority-router.ts b/backend/src/server/routes/v1/certificate-authority-router.ts index 88ec8500e..145295022 100644 --- a/backend/src/server/routes/v1/certificate-authority-router.ts +++ b/backend/src/server/routes/v1/certificate-authority-router.ts @@ -15,6 +15,8 @@ import { validateCaDateField } from "@app/services/certificate-authority/certificate-authority-validators"; +import { DefaultResponseErrorsSchema } from "../sanitizedSchemas"; + export const registerCaRouter = async (server: FastifyZodProvider) => { server.route({ method: "POST", @@ -63,6 +65,7 @@ export const registerCaRouter = async (server: FastifyZodProvider) => { } ), response: { + ...DefaultResponseErrorsSchema, 200: z.object({ ca: CertificateAuthoritiesSchema }) @@ -108,6 +111,7 @@ export const registerCaRouter = async (server: FastifyZodProvider) => { caId: z.string().trim().describe(CERTIFICATE_AUTHORITIES.GET.caId) }), response: { + ...DefaultResponseErrorsSchema, 200: z.object({ ca: CertificateAuthoritiesSchema }) @@ -155,6 +159,7 @@ export const registerCaRouter = async (server: FastifyZodProvider) => { caCertId: z.string().trim().describe(CERTIFICATE_AUTHORITIES.GET_CERT_BY_ID.caCertId) }), response: { + ...DefaultResponseErrorsSchema, 200: z.instanceof(Buffer) } }, @@ -187,6 +192,7 @@ export const registerCaRouter = async (server: FastifyZodProvider) => { .describe(CERTIFICATE_AUTHORITIES.CREATE.requireTemplateForIssuance) }), response: { + ...DefaultResponseErrorsSchema, 200: z.object({ ca: CertificateAuthoritiesSchema }) @@ -234,6 +240,7 @@ export const registerCaRouter = async (server: FastifyZodProvider) => { caId: z.string().trim().describe(CERTIFICATE_AUTHORITIES.DELETE.caId) }), response: { + ...DefaultResponseErrorsSchema, 200: z.object({ ca: CertificateAuthoritiesSchema }) @@ -279,6 +286,7 @@ export const registerCaRouter = async (server: FastifyZodProvider) => { caId: z.string().trim().describe(CERTIFICATE_AUTHORITIES.GET_CSR.caId) }), response: { + ...DefaultResponseErrorsSchema, 200: z.object({ csr: z.string().describe(CERTIFICATE_AUTHORITIES.GET_CSR.csr) }) @@ -328,6 +336,7 @@ export const registerCaRouter = async (server: FastifyZodProvider) => { notAfter: validateCaDateField.describe(CERTIFICATE_AUTHORITIES.RENEW_CA_CERT.notAfter) }), response: { + ...DefaultResponseErrorsSchema, 200: z.object({ certificate: z.string().trim().describe(CERTIFICATE_AUTHORITIES.RENEW_CA_CERT.certificate), certificateChain: z.string().trim().describe(CERTIFICATE_AUTHORITIES.RENEW_CA_CERT.certificateChain), @@ -379,6 +388,7 @@ export const registerCaRouter = async (server: FastifyZodProvider) => { caId: z.string().trim().describe(CERTIFICATE_AUTHORITIES.GET_CA_CERTS.caId) }), response: { + ...DefaultResponseErrorsSchema, 200: z.array( z.object({ certificate: z.string().describe(CERTIFICATE_AUTHORITIES.GET_CA_CERTS.certificate), @@ -427,6 +437,7 @@ export const registerCaRouter = async (server: FastifyZodProvider) => { caId: z.string().trim().describe(CERTIFICATE_AUTHORITIES.GET_CERT.caId) }), response: { + ...DefaultResponseErrorsSchema, 200: z.object({ certificate: z.string().describe(CERTIFICATE_AUTHORITIES.GET_CERT.certificate), certificateChain: z.string().describe(CERTIFICATE_AUTHORITIES.GET_CERT.certificateChain), @@ -482,6 +493,7 @@ export const registerCaRouter = async (server: FastifyZodProvider) => { maxPathLength: z.number().min(-1).default(-1).describe(CERTIFICATE_AUTHORITIES.SIGN_INTERMEDIATE.maxPathLength) }), response: { + ...DefaultResponseErrorsSchema, 200: z.object({ certificate: z.string().trim().describe(CERTIFICATE_AUTHORITIES.SIGN_INTERMEDIATE.certificate), certificateChain: z.string().trim().describe(CERTIFICATE_AUTHORITIES.SIGN_INTERMEDIATE.certificateChain), @@ -543,6 +555,7 @@ export const registerCaRouter = async (server: FastifyZodProvider) => { certificateChain: z.string().trim().describe(CERTIFICATE_AUTHORITIES.IMPORT_CERT.certificateChain) }), response: { + ...DefaultResponseErrorsSchema, 200: z.object({ message: z.string().trim(), caId: z.string().trim() @@ -616,6 +629,7 @@ export const registerCaRouter = async (server: FastifyZodProvider) => { } ), response: { + ...DefaultResponseErrorsSchema, 200: z.object({ certificate: z.string().trim().describe(CERTIFICATE_AUTHORITIES.ISSUE_CERT.certificate), issuingCaCertificate: z.string().trim().describe(CERTIFICATE_AUTHORITIES.ISSUE_CERT.issuingCaCertificate), @@ -698,6 +712,7 @@ export const registerCaRouter = async (server: FastifyZodProvider) => { } ), response: { + ...DefaultResponseErrorsSchema, 200: z.object({ certificate: z.string().trim().describe(CERTIFICATE_AUTHORITIES.SIGN_CERT.certificate), issuingCaCertificate: z.string().trim().describe(CERTIFICATE_AUTHORITIES.ISSUE_CERT.issuingCaCertificate), @@ -753,6 +768,7 @@ export const registerCaRouter = async (server: FastifyZodProvider) => { caId: z.string().trim().describe(CERTIFICATE_AUTHORITIES.SIGN_CERT.caId) }), response: { + ...DefaultResponseErrorsSchema, 200: z.object({ certificateTemplates: CertificateTemplatesSchema.array() }) @@ -798,6 +814,7 @@ export const registerCaRouter = async (server: FastifyZodProvider) => { caId: z.string().trim().describe(CERTIFICATE_AUTHORITIES.GET_CRLS.caId) }), response: { + ...DefaultResponseErrorsSchema, 200: z.array( z.object({ id: z.string().describe(CERTIFICATE_AUTHORITIES.GET_CRLS.id), diff --git a/backend/src/server/routes/v1/certificate-router.ts b/backend/src/server/routes/v1/certificate-router.ts index 99d57e802..cf9093287 100644 --- a/backend/src/server/routes/v1/certificate-router.ts +++ b/backend/src/server/routes/v1/certificate-router.ts @@ -13,6 +13,8 @@ import { validateCaDateField } from "@app/services/certificate-authority/certificate-authority-validators"; +import { DefaultResponseErrorsSchema } from "../sanitizedSchemas"; + export const registerCertRouter = async (server: FastifyZodProvider) => { server.route({ method: "GET", @@ -27,6 +29,7 @@ export const registerCertRouter = async (server: FastifyZodProvider) => { serialNumber: z.string().trim().describe(CERTIFICATES.GET.serialNumber) }), response: { + ...DefaultResponseErrorsSchema, 200: z.object({ certificate: CertificatesSchema }) @@ -118,6 +121,7 @@ export const registerCertRouter = async (server: FastifyZodProvider) => { } ), response: { + ...DefaultResponseErrorsSchema, 200: z.object({ certificate: z.string().trim().describe(CERTIFICATE_AUTHORITIES.ISSUE_CERT.certificate), issuingCaCertificate: z.string().trim().describe(CERTIFICATE_AUTHORITIES.ISSUE_CERT.issuingCaCertificate), @@ -219,6 +223,7 @@ export const registerCertRouter = async (server: FastifyZodProvider) => { } ), response: { + ...DefaultResponseErrorsSchema, 200: z.object({ certificate: z.string().trim().describe(CERTIFICATE_AUTHORITIES.SIGN_CERT.certificate), issuingCaCertificate: z.string().trim().describe(CERTIFICATE_AUTHORITIES.ISSUE_CERT.issuingCaCertificate), @@ -276,6 +281,7 @@ export const registerCertRouter = async (server: FastifyZodProvider) => { revocationReason: z.nativeEnum(CrlReason).describe(CERTIFICATES.REVOKE.revocationReason) }), response: { + ...DefaultResponseErrorsSchema, 200: z.object({ message: z.string().trim(), serialNumber: z.string().trim().describe(CERTIFICATES.REVOKE.serialNumberRes), @@ -327,6 +333,7 @@ export const registerCertRouter = async (server: FastifyZodProvider) => { serialNumber: z.string().trim().describe(CERTIFICATES.DELETE.serialNumber) }), response: { + ...DefaultResponseErrorsSchema, 200: z.object({ certificate: CertificatesSchema }) @@ -373,6 +380,7 @@ export const registerCertRouter = async (server: FastifyZodProvider) => { serialNumber: z.string().trim().describe(CERTIFICATES.GET_CERT.serialNumber) }), response: { + ...DefaultResponseErrorsSchema, 200: z.object({ certificate: z.string().trim().describe(CERTIFICATES.GET_CERT.certificate), certificateChain: z.string().trim().describe(CERTIFICATES.GET_CERT.certificateChain), diff --git a/backend/src/server/routes/v1/certificate-template-router.ts b/backend/src/server/routes/v1/certificate-template-router.ts index 54ce571a2..8fc732c73 100644 --- a/backend/src/server/routes/v1/certificate-template-router.ts +++ b/backend/src/server/routes/v1/certificate-template-router.ts @@ -11,6 +11,8 @@ import { CertExtendedKeyUsage, CertKeyUsage } from "@app/services/certificate/ce import { sanitizedCertificateTemplate } from "@app/services/certificate-template/certificate-template-schema"; import { validateTemplateRegexField } from "@app/services/certificate-template/certificate-template-validators"; +import { DefaultResponseErrorsSchema } from "../sanitizedSchemas"; + const sanitizedEstConfig = CertificateTemplateEstConfigsSchema.pick({ id: true, certificateTemplateId: true, @@ -29,6 +31,7 @@ export const registerCertificateTemplateRouter = async (server: FastifyZodProvid certificateTemplateId: z.string().describe(CERTIFICATE_TEMPLATES.GET.certificateTemplateId) }), response: { + ...DefaultResponseErrorsSchema, 200: sanitizedCertificateTemplate } }, @@ -90,6 +93,7 @@ export const registerCertificateTemplateRouter = async (server: FastifyZodProvid .describe(CERTIFICATE_TEMPLATES.CREATE.extendedKeyUsages) }), response: { + ...DefaultResponseErrorsSchema, 200: sanitizedCertificateTemplate } }, @@ -155,6 +159,7 @@ export const registerCertificateTemplateRouter = async (server: FastifyZodProvid certificateTemplateId: z.string().describe(CERTIFICATE_TEMPLATES.UPDATE.certificateTemplateId) }), response: { + ...DefaultResponseErrorsSchema, 200: sanitizedCertificateTemplate } }, @@ -201,6 +206,7 @@ export const registerCertificateTemplateRouter = async (server: FastifyZodProvid certificateTemplateId: z.string().describe(CERTIFICATE_TEMPLATES.DELETE.certificateTemplateId) }), response: { + ...DefaultResponseErrorsSchema, 200: sanitizedCertificateTemplate } }, @@ -247,6 +253,7 @@ export const registerCertificateTemplateRouter = async (server: FastifyZodProvid isEnabled: z.boolean().default(true) }), response: { + ...DefaultResponseErrorsSchema, 200: sanitizedEstConfig } }, @@ -294,6 +301,7 @@ export const registerCertificateTemplateRouter = async (server: FastifyZodProvid isEnabled: z.boolean().optional() }), response: { + ...DefaultResponseErrorsSchema, 200: sanitizedEstConfig } }, @@ -336,6 +344,7 @@ export const registerCertificateTemplateRouter = async (server: FastifyZodProvid certificateTemplateId: z.string().trim() }), response: { + ...DefaultResponseErrorsSchema, 200: sanitizedEstConfig.extend({ caChain: z.string() }) diff --git a/backend/src/server/routes/v1/identity-aws-iam-auth-router.ts b/backend/src/server/routes/v1/identity-aws-iam-auth-router.ts index 9721e46c5..a940db655 100644 --- a/backend/src/server/routes/v1/identity-aws-iam-auth-router.ts +++ b/backend/src/server/routes/v1/identity-aws-iam-auth-router.ts @@ -12,6 +12,8 @@ import { validatePrincipalArns } from "@app/services/identity-aws-auth/identity-aws-auth-validators"; +import { DefaultResponseErrorsSchema } from "../sanitizedSchemas"; + export const registerIdentityAwsAuthRouter = async (server: FastifyZodProvider) => { server.route({ method: "POST", @@ -28,6 +30,7 @@ export const registerIdentityAwsAuthRouter = async (server: FastifyZodProvider) iamRequestHeaders: z.string().describe(AWS_AUTH.LOGIN.iamRequestHeaders) }), response: { + ...DefaultResponseErrorsSchema, 200: z.object({ accessToken: z.string(), expiresIn: z.coerce.number(), @@ -118,6 +121,7 @@ export const registerIdentityAwsAuthRouter = async (server: FastifyZodProvider) accessTokenNumUsesLimit: z.number().int().min(0).default(0).describe(AWS_AUTH.ATTACH.accessTokenNumUsesLimit) }), response: { + ...DefaultResponseErrorsSchema, 200: z.object({ identityAwsAuth: IdentityAwsAuthsSchema }) @@ -197,6 +201,7 @@ export const registerIdentityAwsAuthRouter = async (server: FastifyZodProvider) .describe(AWS_AUTH.UPDATE.accessTokenMaxTTL) }), response: { + ...DefaultResponseErrorsSchema, 200: z.object({ identityAwsAuth: IdentityAwsAuthsSchema }) @@ -252,6 +257,7 @@ export const registerIdentityAwsAuthRouter = async (server: FastifyZodProvider) identityId: z.string().describe(AWS_AUTH.RETRIEVE.identityId) }), response: { + ...DefaultResponseErrorsSchema, 200: z.object({ identityAwsAuth: IdentityAwsAuthsSchema }) @@ -298,6 +304,7 @@ export const registerIdentityAwsAuthRouter = async (server: FastifyZodProvider) identityId: z.string().describe(AWS_AUTH.REVOKE.identityId) }), response: { + ...DefaultResponseErrorsSchema, 200: z.object({ identityAwsAuth: IdentityAwsAuthsSchema }) diff --git a/backend/src/server/routes/v1/identity-azure-auth-router.ts b/backend/src/server/routes/v1/identity-azure-auth-router.ts index 589f9e92c..07c00bb16 100644 --- a/backend/src/server/routes/v1/identity-azure-auth-router.ts +++ b/backend/src/server/routes/v1/identity-azure-auth-router.ts @@ -9,6 +9,8 @@ import { AuthMode } from "@app/services/auth/auth-type"; import { TIdentityTrustedIp } from "@app/services/identity/identity-types"; import { validateAzureAuthField } from "@app/services/identity-azure-auth/identity-azure-auth-validators"; +import { DefaultResponseErrorsSchema } from "../sanitizedSchemas"; + export const registerIdentityAzureAuthRouter = async (server: FastifyZodProvider) => { server.route({ method: "POST", @@ -23,6 +25,7 @@ export const registerIdentityAzureAuthRouter = async (server: FastifyZodProvider jwt: z.string() }), response: { + ...DefaultResponseErrorsSchema, 200: z.object({ accessToken: z.string(), expiresIn: z.coerce.number(), @@ -108,6 +111,7 @@ export const registerIdentityAzureAuthRouter = async (server: FastifyZodProvider accessTokenNumUsesLimit: z.number().int().min(0).default(0).describe(AZURE_AUTH.ATTACH.accessTokenNumUsesLimit) }), response: { + ...DefaultResponseErrorsSchema, 200: z.object({ identityAzureAuth: IdentityAzureAuthsSchema }) @@ -188,6 +192,7 @@ export const registerIdentityAzureAuthRouter = async (server: FastifyZodProvider .describe(AZURE_AUTH.UPDATE.accessTokenMaxTTL) }), response: { + ...DefaultResponseErrorsSchema, 200: z.object({ identityAzureAuth: IdentityAzureAuthsSchema }) @@ -242,6 +247,7 @@ export const registerIdentityAzureAuthRouter = async (server: FastifyZodProvider identityId: z.string().describe(AZURE_AUTH.RETRIEVE.identityId) }), response: { + ...DefaultResponseErrorsSchema, 200: z.object({ identityAzureAuth: IdentityAzureAuthsSchema }) @@ -289,6 +295,7 @@ export const registerIdentityAzureAuthRouter = async (server: FastifyZodProvider identityId: z.string().describe(AZURE_AUTH.REVOKE.identityId) }), response: { + ...DefaultResponseErrorsSchema, 200: z.object({ identityAzureAuth: IdentityAzureAuthsSchema }) diff --git a/backend/src/server/routes/v1/identity-gcp-auth-router.ts b/backend/src/server/routes/v1/identity-gcp-auth-router.ts index 2022aef58..632b11184 100644 --- a/backend/src/server/routes/v1/identity-gcp-auth-router.ts +++ b/backend/src/server/routes/v1/identity-gcp-auth-router.ts @@ -9,6 +9,8 @@ import { AuthMode } from "@app/services/auth/auth-type"; import { TIdentityTrustedIp } from "@app/services/identity/identity-types"; import { validateGcpAuthField } from "@app/services/identity-gcp-auth/identity-gcp-auth-validators"; +import { DefaultResponseErrorsSchema } from "../sanitizedSchemas"; + export const registerIdentityGcpAuthRouter = async (server: FastifyZodProvider) => { server.route({ method: "POST", @@ -23,6 +25,7 @@ export const registerIdentityGcpAuthRouter = async (server: FastifyZodProvider) jwt: z.string() }), response: { + ...DefaultResponseErrorsSchema, 200: z.object({ accessToken: z.string(), expiresIn: z.coerce.number(), @@ -109,6 +112,7 @@ export const registerIdentityGcpAuthRouter = async (server: FastifyZodProvider) accessTokenNumUsesLimit: z.number().int().min(0).default(0).describe(GCP_AUTH.ATTACH.accessTokenNumUsesLimit) }), response: { + ...DefaultResponseErrorsSchema, 200: z.object({ identityGcpAuth: IdentityGcpAuthsSchema }) @@ -190,6 +194,7 @@ export const registerIdentityGcpAuthRouter = async (server: FastifyZodProvider) .describe(GCP_AUTH.UPDATE.accessTokenMaxTTL) }), response: { + ...DefaultResponseErrorsSchema, 200: z.object({ identityGcpAuth: IdentityGcpAuthsSchema }) @@ -246,6 +251,7 @@ export const registerIdentityGcpAuthRouter = async (server: FastifyZodProvider) identityId: z.string().describe(GCP_AUTH.RETRIEVE.identityId) }), response: { + ...DefaultResponseErrorsSchema, 200: z.object({ identityGcpAuth: IdentityGcpAuthsSchema }) @@ -293,6 +299,7 @@ export const registerIdentityGcpAuthRouter = async (server: FastifyZodProvider) identityId: z.string().describe(GCP_AUTH.REVOKE.identityId) }), response: { + ...DefaultResponseErrorsSchema, 200: z.object({ identityGcpAuth: IdentityGcpAuthsSchema }) diff --git a/backend/src/server/routes/v1/identity-kubernetes-auth-router.ts b/backend/src/server/routes/v1/identity-kubernetes-auth-router.ts index 3a71ba7a2..4ee192d59 100644 --- a/backend/src/server/routes/v1/identity-kubernetes-auth-router.ts +++ b/backend/src/server/routes/v1/identity-kubernetes-auth-router.ts @@ -8,6 +8,8 @@ import { verifyAuth } from "@app/server/plugins/auth/verify-auth"; import { AuthMode } from "@app/services/auth/auth-type"; import { TIdentityTrustedIp } from "@app/services/identity/identity-types"; +import { DefaultResponseErrorsSchema } from "../sanitizedSchemas"; + const IdentityKubernetesAuthResponseSchema = IdentityKubernetesAuthsSchema.omit({ encryptedCaCert: true, caCertIV: true, @@ -34,6 +36,7 @@ export const registerIdentityKubernetesRouter = async (server: FastifyZodProvide jwt: z.string().trim() }), response: { + ...DefaultResponseErrorsSchema, 200: z.object({ accessToken: z.string(), expiresIn: z.coerce.number(), @@ -129,6 +132,7 @@ export const registerIdentityKubernetesRouter = async (server: FastifyZodProvide .describe(KUBERNETES_AUTH.ATTACH.accessTokenNumUsesLimit) }), response: { + ...DefaultResponseErrorsSchema, 200: z.object({ identityKubernetesAuth: IdentityKubernetesAuthResponseSchema }) @@ -222,6 +226,7 @@ export const registerIdentityKubernetesRouter = async (server: FastifyZodProvide .describe(KUBERNETES_AUTH.UPDATE.accessTokenMaxTTL) }), response: { + ...DefaultResponseErrorsSchema, 200: z.object({ identityKubernetesAuth: IdentityKubernetesAuthResponseSchema }) @@ -277,6 +282,7 @@ export const registerIdentityKubernetesRouter = async (server: FastifyZodProvide identityId: z.string().describe(KUBERNETES_AUTH.RETRIEVE.identityId) }), response: { + ...DefaultResponseErrorsSchema, 200: z.object({ identityKubernetesAuth: IdentityKubernetesAuthResponseSchema }) @@ -324,6 +330,7 @@ export const registerIdentityKubernetesRouter = async (server: FastifyZodProvide identityId: z.string().describe(KUBERNETES_AUTH.REVOKE.identityId) }), response: { + ...DefaultResponseErrorsSchema, 200: z.object({ identityKubernetesAuth: IdentityKubernetesAuthResponseSchema.omit({ caCert: true, diff --git a/backend/src/server/routes/v1/identity-oidc-auth-router.ts b/backend/src/server/routes/v1/identity-oidc-auth-router.ts index 280dbc5d5..d193863b2 100644 --- a/backend/src/server/routes/v1/identity-oidc-auth-router.ts +++ b/backend/src/server/routes/v1/identity-oidc-auth-router.ts @@ -12,6 +12,8 @@ import { validateOidcBoundClaimsField } from "@app/services/identity-oidc-auth/identity-oidc-auth-validators"; +import { DefaultResponseErrorsSchema } from "../sanitizedSchemas"; + const IdentityOidcAuthResponseSchema = IdentityOidcAuthsSchema.omit({ encryptedCaCert: true, caCertIV: true, @@ -34,6 +36,7 @@ export const registerIdentityOidcAuthRouter = async (server: FastifyZodProvider) jwt: z.string().trim() }), response: { + ...DefaultResponseErrorsSchema, 200: z.object({ accessToken: z.string(), expiresIn: z.coerce.number(), @@ -124,6 +127,7 @@ export const registerIdentityOidcAuthRouter = async (server: FastifyZodProvider) accessTokenNumUsesLimit: z.number().int().min(0).default(0).describe(OIDC_AUTH.ATTACH.accessTokenNumUsesLimit) }), response: { + ...DefaultResponseErrorsSchema, 200: z.object({ identityOidcAuth: IdentityOidcAuthResponseSchema }) @@ -223,6 +227,7 @@ export const registerIdentityOidcAuthRouter = async (server: FastifyZodProvider) }) .partial(), response: { + ...DefaultResponseErrorsSchema, 200: z.object({ identityOidcAuth: IdentityOidcAuthResponseSchema }) @@ -281,6 +286,7 @@ export const registerIdentityOidcAuthRouter = async (server: FastifyZodProvider) identityId: z.string().describe(OIDC_AUTH.RETRIEVE.identityId) }), response: { + ...DefaultResponseErrorsSchema, 200: z.object({ identityOidcAuth: IdentityOidcAuthResponseSchema }) @@ -328,6 +334,7 @@ export const registerIdentityOidcAuthRouter = async (server: FastifyZodProvider) identityId: z.string().describe(OIDC_AUTH.REVOKE.identityId) }), response: { + ...DefaultResponseErrorsSchema, 200: z.object({ identityOidcAuth: IdentityOidcAuthResponseSchema.omit({ caCert: true diff --git a/backend/src/server/routes/v1/identity-router.ts b/backend/src/server/routes/v1/identity-router.ts index cf72ba2ff..5b3fb6bf4 100644 --- a/backend/src/server/routes/v1/identity-router.ts +++ b/backend/src/server/routes/v1/identity-router.ts @@ -9,7 +9,7 @@ import { verifyAuth } from "@app/server/plugins/auth/verify-auth"; import { AuthMode } from "@app/services/auth/auth-type"; import { PostHogEventTypes } from "@app/services/telemetry/telemetry-types"; -import { SanitizedProjectSchema } from "../sanitizedSchemas"; +import { DefaultResponseErrorsSchema, SanitizedProjectSchema } from "../sanitizedSchemas"; export const registerIdentityRouter = async (server: FastifyZodProvider) => { server.route({ @@ -32,6 +32,7 @@ export const registerIdentityRouter = async (server: FastifyZodProvider) => { role: z.string().trim().min(1).default(OrgMembershipRole.NoAccess).describe(IDENTITIES.CREATE.role) }), response: { + ...DefaultResponseErrorsSchema, 200: z.object({ identity: IdentitiesSchema }) @@ -96,6 +97,7 @@ export const registerIdentityRouter = async (server: FastifyZodProvider) => { role: z.string().trim().min(1).optional().describe(IDENTITIES.UPDATE.role) }), response: { + ...DefaultResponseErrorsSchema, 200: z.object({ identity: IdentitiesSchema }) @@ -145,6 +147,7 @@ export const registerIdentityRouter = async (server: FastifyZodProvider) => { identityId: z.string().describe(IDENTITIES.DELETE.identityId) }), response: { + ...DefaultResponseErrorsSchema, 200: z.object({ identity: IdentitiesSchema }) @@ -191,6 +194,7 @@ export const registerIdentityRouter = async (server: FastifyZodProvider) => { identityId: z.string().describe(IDENTITIES.GET_BY_ID.identityId) }), response: { + ...DefaultResponseErrorsSchema, 200: z.object({ identity: IdentityOrgMembershipsSchema.extend({ customRole: OrgRolesSchema.pick({ @@ -236,6 +240,7 @@ export const registerIdentityRouter = async (server: FastifyZodProvider) => { orgId: z.string().describe(IDENTITIES.LIST.orgId) }), response: { + ...DefaultResponseErrorsSchema, 200: z.object({ identities: IdentityOrgMembershipsSchema.extend({ customRole: OrgRolesSchema.pick({ diff --git a/backend/src/server/routes/v1/identity-token-auth-router.ts b/backend/src/server/routes/v1/identity-token-auth-router.ts index f367e6033..aa9565628 100644 --- a/backend/src/server/routes/v1/identity-token-auth-router.ts +++ b/backend/src/server/routes/v1/identity-token-auth-router.ts @@ -8,6 +8,8 @@ import { verifyAuth } from "@app/server/plugins/auth/verify-auth"; import { AuthMode } from "@app/services/auth/auth-type"; import { TIdentityTrustedIp } from "@app/services/identity/identity-types"; +import { DefaultResponseErrorsSchema } from "../sanitizedSchemas"; + export const registerIdentityTokenAuthRouter = async (server: FastifyZodProvider) => { server.route({ method: "POST", @@ -57,6 +59,7 @@ export const registerIdentityTokenAuthRouter = async (server: FastifyZodProvider accessTokenNumUsesLimit: z.number().int().min(0).default(0).describe(TOKEN_AUTH.ATTACH.accessTokenNumUsesLimit) }), response: { + ...DefaultResponseErrorsSchema, 200: z.object({ identityTokenAuth: IdentityTokenAuthsSchema }) @@ -132,6 +135,7 @@ export const registerIdentityTokenAuthRouter = async (server: FastifyZodProvider .describe(TOKEN_AUTH.UPDATE.accessTokenMaxTTL) }), response: { + ...DefaultResponseErrorsSchema, 200: z.object({ identityTokenAuth: IdentityTokenAuthsSchema }) @@ -186,6 +190,7 @@ export const registerIdentityTokenAuthRouter = async (server: FastifyZodProvider identityId: z.string().describe(TOKEN_AUTH.RETRIEVE.identityId) }), response: { + ...DefaultResponseErrorsSchema, 200: z.object({ identityTokenAuth: IdentityTokenAuthsSchema }) @@ -233,6 +238,7 @@ export const registerIdentityTokenAuthRouter = async (server: FastifyZodProvider identityId: z.string().describe(TOKEN_AUTH.REVOKE.identityId) }), response: { + ...DefaultResponseErrorsSchema, 200: z.object({ identityTokenAuth: IdentityTokenAuthsSchema }) @@ -283,6 +289,7 @@ export const registerIdentityTokenAuthRouter = async (server: FastifyZodProvider name: z.string().optional().describe(TOKEN_AUTH.CREATE_TOKEN.name) }), response: { + ...DefaultResponseErrorsSchema, 200: z.object({ accessToken: z.string(), expiresIn: z.coerce.number(), @@ -345,6 +352,7 @@ export const registerIdentityTokenAuthRouter = async (server: FastifyZodProvider limit: z.coerce.number().min(1).max(100).default(20).describe(TOKEN_AUTH.GET_TOKENS.limit) }), response: { + ...DefaultResponseErrorsSchema, 200: z.object({ tokens: IdentityAccessTokensSchema.array() }) @@ -396,6 +404,7 @@ export const registerIdentityTokenAuthRouter = async (server: FastifyZodProvider name: z.string().optional().describe(TOKEN_AUTH.UPDATE_TOKEN.name) }), response: { + ...DefaultResponseErrorsSchema, 200: z.object({ token: IdentityAccessTokensSchema }) @@ -446,6 +455,7 @@ export const registerIdentityTokenAuthRouter = async (server: FastifyZodProvider tokenId: z.string().describe(TOKEN_AUTH.REVOKE_TOKEN.tokenId) }), response: { + ...DefaultResponseErrorsSchema, 200: z.object({ message: z.string() }) diff --git a/backend/src/server/routes/v1/identity-universal-auth-router.ts b/backend/src/server/routes/v1/identity-universal-auth-router.ts index f103a39e0..07f2f05a5 100644 --- a/backend/src/server/routes/v1/identity-universal-auth-router.ts +++ b/backend/src/server/routes/v1/identity-universal-auth-router.ts @@ -8,6 +8,8 @@ import { verifyAuth } from "@app/server/plugins/auth/verify-auth"; import { AuthMode } from "@app/services/auth/auth-type"; import { TIdentityTrustedIp } from "@app/services/identity/identity-types"; +import { DefaultResponseErrorsSchema } from "../sanitizedSchemas"; + export const sanitizedClientSecretSchema = IdentityUaClientSecretsSchema.pick({ id: true, createdAt: true, @@ -35,6 +37,7 @@ export const registerIdentityUaRouter = async (server: FastifyZodProvider) => { clientSecret: z.string().trim().describe(UNIVERSAL_AUTH.LOGIN.clientSecret) }), response: { + ...DefaultResponseErrorsSchema, 200: z.object({ accessToken: z.string(), expiresIn: z.coerce.number(), @@ -130,6 +133,7 @@ export const registerIdentityUaRouter = async (server: FastifyZodProvider) => { .describe(UNIVERSAL_AUTH.ATTACH.accessTokenNumUsesLimit) }), response: { + ...DefaultResponseErrorsSchema, 200: z.object({ identityUniversalAuth: IdentityUniversalAuthsSchema }) @@ -222,6 +226,7 @@ export const registerIdentityUaRouter = async (server: FastifyZodProvider) => { .describe(UNIVERSAL_AUTH.UPDATE.accessTokenMaxTTL) }), response: { + ...DefaultResponseErrorsSchema, 200: z.object({ identityUniversalAuth: IdentityUniversalAuthsSchema }) @@ -275,6 +280,7 @@ export const registerIdentityUaRouter = async (server: FastifyZodProvider) => { identityId: z.string().describe(UNIVERSAL_AUTH.RETRIEVE.identityId) }), response: { + ...DefaultResponseErrorsSchema, 200: z.object({ identityUniversalAuth: IdentityUniversalAuthsSchema }) @@ -322,6 +328,7 @@ export const registerIdentityUaRouter = async (server: FastifyZodProvider) => { identityId: z.string().describe(UNIVERSAL_AUTH.REVOKE.identityId) }), response: { + ...DefaultResponseErrorsSchema, 200: z.object({ identityUniversalAuth: IdentityUniversalAuthsSchema }) @@ -374,6 +381,7 @@ export const registerIdentityUaRouter = async (server: FastifyZodProvider) => { ttl: z.number().min(0).max(315360000).default(0).describe(UNIVERSAL_AUTH.CREATE_CLIENT_SECRET.ttl) }), response: { + ...DefaultResponseErrorsSchema, 200: z.object({ clientSecret: z.string(), clientSecretData: sanitizedClientSecretSchema @@ -425,6 +433,7 @@ export const registerIdentityUaRouter = async (server: FastifyZodProvider) => { identityId: z.string().describe(UNIVERSAL_AUTH.LIST_CLIENT_SECRETS.identityId) }), response: { + ...DefaultResponseErrorsSchema, 200: z.object({ clientSecretData: sanitizedClientSecretSchema.array() }) @@ -474,6 +483,7 @@ export const registerIdentityUaRouter = async (server: FastifyZodProvider) => { clientSecretId: z.string().describe(UNIVERSAL_AUTH.GET_CLIENT_SECRET.clientSecretId) }), response: { + ...DefaultResponseErrorsSchema, 200: z.object({ clientSecretData: sanitizedClientSecretSchema }) @@ -524,6 +534,7 @@ export const registerIdentityUaRouter = async (server: FastifyZodProvider) => { clientSecretId: z.string().describe(UNIVERSAL_AUTH.REVOKE_CLIENT_SECRET.clientSecretId) }), response: { + ...DefaultResponseErrorsSchema, 200: z.object({ clientSecretData: sanitizedClientSecretSchema }) diff --git a/backend/src/server/routes/v1/integration-auth-router.ts b/backend/src/server/routes/v1/integration-auth-router.ts index 4baa39f76..6ff9f8c3c 100644 --- a/backend/src/server/routes/v1/integration-auth-router.ts +++ b/backend/src/server/routes/v1/integration-auth-router.ts @@ -6,7 +6,7 @@ import { readLimit, writeLimit } from "@app/server/config/rateLimiter"; import { verifyAuth } from "@app/server/plugins/auth/verify-auth"; import { AuthMode } from "@app/services/auth/auth-type"; -import { integrationAuthPubSchema } from "../sanitizedSchemas"; +import { DefaultResponseErrorsSchema, integrationAuthPubSchema } from "../sanitizedSchemas"; export const registerIntegrationAuthRouter = async (server: FastifyZodProvider) => { server.route({ @@ -64,6 +64,7 @@ export const registerIntegrationAuthRouter = async (server: FastifyZodProvider) integrationAuthId: z.string().trim().describe(INTEGRATION_AUTH.GET.integrationAuthId) }), response: { + ...DefaultResponseErrorsSchema, 200: z.object({ integrationAuth: integrationAuthPubSchema }) @@ -100,6 +101,7 @@ export const registerIntegrationAuthRouter = async (server: FastifyZodProvider) projectId: z.string().trim().describe(INTEGRATION_AUTH.DELETE.projectId) }), response: { + ...DefaultResponseErrorsSchema, 200: z.object({ integrationAuth: integrationAuthPubSchema.array() }) @@ -148,6 +150,7 @@ export const registerIntegrationAuthRouter = async (server: FastifyZodProvider) integrationAuthId: z.string().trim().describe(INTEGRATION_AUTH.DELETE_BY_ID.integrationAuthId) }), response: { + ...DefaultResponseErrorsSchema, 200: z.object({ integrationAuth: integrationAuthPubSchema }) @@ -251,6 +254,7 @@ export const registerIntegrationAuthRouter = async (server: FastifyZodProvider) refreshToken: z.string().trim().optional().describe(INTEGRATION_AUTH.CREATE_ACCESS_TOKEN.refreshToken) }), response: { + ...DefaultResponseErrorsSchema, 200: z.object({ integrationAuth: integrationAuthPubSchema }) diff --git a/backend/src/server/routes/v1/integration-router.ts b/backend/src/server/routes/v1/integration-router.ts index f08bb7e3b..b5c550af9 100644 --- a/backend/src/server/routes/v1/integration-router.ts +++ b/backend/src/server/routes/v1/integration-router.ts @@ -11,6 +11,8 @@ import { AuthMode } from "@app/services/auth/auth-type"; import { IntegrationMetadataSchema } from "@app/services/integration/integration-schema"; import { PostHogEventTypes, TIntegrationCreatedEvent } from "@app/services/telemetry/telemetry-types"; +import { DefaultResponseErrorsSchema } from "../sanitizedSchemas"; + export const registerIntegrationRouter = async (server: FastifyZodProvider) => { server.route({ method: "POST", @@ -49,6 +51,7 @@ export const registerIntegrationRouter = async (server: FastifyZodProvider) => { metadata: IntegrationMetadataSchema.default({}) }), response: { + ...DefaultResponseErrorsSchema, 200: z.object({ integration: IntegrationsSchema }) @@ -135,6 +138,7 @@ export const registerIntegrationRouter = async (server: FastifyZodProvider) => { metadata: IntegrationMetadataSchema.optional() }), response: { + ...DefaultResponseErrorsSchema, 200: z.object({ integration: IntegrationsSchema }) @@ -219,6 +223,7 @@ export const registerIntegrationRouter = async (server: FastifyZodProvider) => { .transform((val) => val === "true") }), response: { + ...DefaultResponseErrorsSchema, 200: z.object({ integration: IntegrationsSchema }) diff --git a/backend/src/server/routes/v1/organization-router.ts b/backend/src/server/routes/v1/organization-router.ts index 9e2f09821..d72998493 100644 --- a/backend/src/server/routes/v1/organization-router.ts +++ b/backend/src/server/routes/v1/organization-router.ts @@ -18,6 +18,8 @@ import { readLimit, writeLimit } from "@app/server/config/rateLimiter"; import { verifyAuth } from "@app/server/plugins/auth/verify-auth"; import { ActorType, AuthMode } from "@app/services/auth/auth-type"; +import { DefaultResponseErrorsSchema } from "../sanitizedSchemas"; + export const registerOrgRouter = async (server: FastifyZodProvider) => { server.route({ method: "GET", @@ -114,6 +116,7 @@ export const registerOrgRouter = async (server: FastifyZodProvider) => { }), response: { + ...DefaultResponseErrorsSchema, 200: z.object({ auditLogs: AuditLogsSchema.omit({ eventMetadata: true, diff --git a/backend/src/server/routes/v1/pki-alert-router.ts b/backend/src/server/routes/v1/pki-alert-router.ts index f64ec9e47..7e3e0a921 100644 --- a/backend/src/server/routes/v1/pki-alert-router.ts +++ b/backend/src/server/routes/v1/pki-alert-router.ts @@ -7,6 +7,8 @@ import { readLimit, writeLimit } from "@app/server/config/rateLimiter"; import { verifyAuth } from "@app/server/plugins/auth/verify-auth"; import { AuthMode } from "@app/services/auth/auth-type"; +import { DefaultResponseErrorsSchema } from "../sanitizedSchemas"; + export const registerPkiAlertRouter = async (server: FastifyZodProvider) => { server.route({ method: "POST", @@ -29,6 +31,7 @@ export const registerPkiAlertRouter = async (server: FastifyZodProvider) => { .describe(ALERTS.CREATE.emails) }), response: { + ...DefaultResponseErrorsSchema, 200: PkiAlertsSchema } }, @@ -73,6 +76,7 @@ export const registerPkiAlertRouter = async (server: FastifyZodProvider) => { alertId: z.string().trim().describe(ALERTS.GET.alertId) }), response: { + ...DefaultResponseErrorsSchema, 200: PkiAlertsSchema } }, @@ -124,6 +128,7 @@ export const registerPkiAlertRouter = async (server: FastifyZodProvider) => { .describe(ALERTS.UPDATE.emails) }), response: { + ...DefaultResponseErrorsSchema, 200: PkiAlertsSchema } }, @@ -169,6 +174,7 @@ export const registerPkiAlertRouter = async (server: FastifyZodProvider) => { alertId: z.string().trim().describe(ALERTS.DELETE.alertId) }), response: { + ...DefaultResponseErrorsSchema, 200: PkiAlertsSchema } }, diff --git a/backend/src/server/routes/v1/pki-collection-router.ts b/backend/src/server/routes/v1/pki-collection-router.ts index 2f2add5c1..9d0c5e569 100644 --- a/backend/src/server/routes/v1/pki-collection-router.ts +++ b/backend/src/server/routes/v1/pki-collection-router.ts @@ -8,6 +8,8 @@ import { verifyAuth } from "@app/server/plugins/auth/verify-auth"; import { AuthMode } from "@app/services/auth/auth-type"; import { PkiItemType } from "@app/services/pki-collection/pki-collection-types"; +import { DefaultResponseErrorsSchema } from "../sanitizedSchemas"; + export const registerPkiCollectionRouter = async (server: FastifyZodProvider) => { server.route({ method: "POST", @@ -24,6 +26,7 @@ export const registerPkiCollectionRouter = async (server: FastifyZodProvider) => description: z.string().trim().default("").describe(PKI_COLLECTIONS.CREATE.description) }), response: { + ...DefaultResponseErrorsSchema, 200: PkiCollectionsSchema } }, @@ -65,6 +68,7 @@ export const registerPkiCollectionRouter = async (server: FastifyZodProvider) => collectionId: z.string().trim().describe(PKI_COLLECTIONS.GET.collectionId) }), response: { + ...DefaultResponseErrorsSchema, 200: PkiCollectionsSchema } }, @@ -109,6 +113,7 @@ export const registerPkiCollectionRouter = async (server: FastifyZodProvider) => description: z.string().trim().optional().describe(PKI_COLLECTIONS.UPDATE.description) }), response: { + ...DefaultResponseErrorsSchema, 200: PkiCollectionsSchema } }, @@ -151,6 +156,7 @@ export const registerPkiCollectionRouter = async (server: FastifyZodProvider) => collectionId: z.string().trim().describe(PKI_COLLECTIONS.DELETE.collectionId) }), response: { + ...DefaultResponseErrorsSchema, 200: PkiCollectionsSchema } }, @@ -196,6 +202,7 @@ export const registerPkiCollectionRouter = async (server: FastifyZodProvider) => limit: z.coerce.number().min(1).max(100).default(25).describe(PKI_COLLECTIONS.LIST_ITEMS.limit) }), response: { + ...DefaultResponseErrorsSchema, 200: z.object({ collectionItems: z.array( PkiCollectionItemsSchema.omit({ caId: true, certId: true }).extend({ @@ -256,6 +263,7 @@ export const registerPkiCollectionRouter = async (server: FastifyZodProvider) => itemId: z.string().trim().describe(PKI_COLLECTIONS.ADD_ITEM.itemId) }), response: { + ...DefaultResponseErrorsSchema, 200: PkiCollectionItemsSchema.omit({ caId: true, certId: true }).extend({ type: z.nativeEnum(PkiItemType).describe(PKI_COLLECTIONS.ADD_ITEM.type), itemId: z.string().trim().describe(PKI_COLLECTIONS.ADD_ITEM.itemId) @@ -304,6 +312,7 @@ export const registerPkiCollectionRouter = async (server: FastifyZodProvider) => collectionItemId: z.string().trim().describe(PKI_COLLECTIONS.DELETE_ITEM.collectionItemId) }), response: { + ...DefaultResponseErrorsSchema, 200: PkiCollectionItemsSchema.omit({ caId: true, certId: true }).extend({ type: z.nativeEnum(PkiItemType).describe(PKI_COLLECTIONS.DELETE_ITEM.type), itemId: z.string().trim().describe(PKI_COLLECTIONS.DELETE_ITEM.itemId) diff --git a/backend/src/server/routes/v1/project-env-router.ts b/backend/src/server/routes/v1/project-env-router.ts index fed609196..08c548519 100644 --- a/backend/src/server/routes/v1/project-env-router.ts +++ b/backend/src/server/routes/v1/project-env-router.ts @@ -8,6 +8,8 @@ import { writeLimit } from "@app/server/config/rateLimiter"; import { verifyAuth } from "@app/server/plugins/auth/verify-auth"; import { AuthMode } from "@app/services/auth/auth-type"; +import { DefaultResponseErrorsSchema } from "../sanitizedSchemas"; + export const registerProjectEnvRouter = async (server: FastifyZodProvider) => { server.route({ method: "GET", @@ -85,6 +87,7 @@ export const registerProjectEnvRouter = async (server: FastifyZodProvider) => { .describe(ENVIRONMENTS.CREATE.slug) }), response: { + ...DefaultResponseErrorsSchema, 200: z.object({ message: z.string(), workspace: z.string(), @@ -152,6 +155,7 @@ export const registerProjectEnvRouter = async (server: FastifyZodProvider) => { position: z.number().optional().describe(ENVIRONMENTS.UPDATE.position) }), response: { + ...DefaultResponseErrorsSchema, 200: z.object({ message: z.string(), workspace: z.string(), @@ -213,6 +217,7 @@ export const registerProjectEnvRouter = async (server: FastifyZodProvider) => { id: z.string().trim().describe(ENVIRONMENTS.DELETE.id) }), response: { + ...DefaultResponseErrorsSchema, 200: z.object({ message: z.string(), workspace: z.string(), diff --git a/backend/src/server/routes/v1/project-membership-router.ts b/backend/src/server/routes/v1/project-membership-router.ts index 4f92783c5..4a0771709 100644 --- a/backend/src/server/routes/v1/project-membership-router.ts +++ b/backend/src/server/routes/v1/project-membership-router.ts @@ -15,6 +15,8 @@ import { verifyAuth } from "@app/server/plugins/auth/verify-auth"; import { AuthMode } from "@app/services/auth/auth-type"; import { ProjectUserMembershipTemporaryMode } from "@app/services/project-membership/project-membership-types"; +import { DefaultResponseErrorsSchema } from "../sanitizedSchemas"; + export const registerProjectMembershipRouter = async (server: FastifyZodProvider) => { server.route({ method: "GET", @@ -33,6 +35,7 @@ export const registerProjectMembershipRouter = async (server: FastifyZodProvider workspaceId: z.string().trim().describe(PROJECT_USERS.GET_USER_MEMBERSHIPS.workspaceId) }), response: { + ...DefaultResponseErrorsSchema, 200: z.object({ memberships: ProjectMembershipsSchema.extend({ user: UsersSchema.pick({ @@ -94,6 +97,7 @@ export const registerProjectMembershipRouter = async (server: FastifyZodProvider username: z.string().min(1).trim().describe(PROJECT_USERS.GET_USER_MEMBERSHIP.username) }), response: { + ...DefaultResponseErrorsSchema, 200: z.object({ membership: ProjectMembershipsSchema.extend({ user: UsersSchema.pick({ @@ -227,6 +231,7 @@ export const registerProjectMembershipRouter = async (server: FastifyZodProvider .describe(PROJECT_USERS.UPDATE_USER_MEMBERSHIP.roles) }), response: { + ...DefaultResponseErrorsSchema, 200: z.object({ roles: ProjectUserMembershipRolesSchema.array() }) diff --git a/backend/src/server/routes/v1/project-router.ts b/backend/src/server/routes/v1/project-router.ts index e5e2f636c..b005bd176 100644 --- a/backend/src/server/routes/v1/project-router.ts +++ b/backend/src/server/routes/v1/project-router.ts @@ -16,7 +16,7 @@ import { AuthMode } from "@app/services/auth/auth-type"; import { ProjectFilterType } from "@app/services/project/project-types"; import { validateSlackChannelsField } from "@app/services/slack/slack-auth-validators"; -import { integrationAuthPubSchema, SanitizedProjectSchema } from "../sanitizedSchemas"; +import { DefaultResponseErrorsSchema, integrationAuthPubSchema, SanitizedProjectSchema } from "../sanitizedSchemas"; import { sanitizedServiceTokenSchema } from "../v2/service-token-router"; const projectWithEnv = SanitizedProjectSchema.merge( @@ -177,6 +177,7 @@ export const registerProjectRouter = async (server: FastifyZodProvider) => { workspaceId: z.string().trim().describe(PROJECTS.GET.workspaceId) }), response: { + ...DefaultResponseErrorsSchema, 200: z.object({ workspace: projectWithEnv.optional() }) @@ -299,6 +300,7 @@ export const registerProjectRouter = async (server: FastifyZodProvider) => { autoCapitalization: z.boolean().optional().describe(PROJECTS.UPDATE.autoCapitalization) }), response: { + ...DefaultResponseErrorsSchema, 200: z.object({ workspace: SanitizedProjectSchema }) @@ -456,6 +458,7 @@ export const registerProjectRouter = async (server: FastifyZodProvider) => { workspaceId: z.string().trim().describe(PROJECTS.LIST_INTEGRATION.workspaceId) }), response: { + ...DefaultResponseErrorsSchema, 200: z.object({ integrations: IntegrationsSchema.merge( z.object({ @@ -499,6 +502,7 @@ export const registerProjectRouter = async (server: FastifyZodProvider) => { workspaceId: z.string().trim().describe(PROJECTS.LIST_INTEGRATION_AUTHORIZATION.workspaceId) }), response: { + ...DefaultResponseErrorsSchema, 200: z.object({ authorizations: integrationAuthPubSchema.array() }) diff --git a/backend/src/server/routes/v1/secret-folder-router.ts b/backend/src/server/routes/v1/secret-folder-router.ts index f67f9ec67..560ade1ee 100644 --- a/backend/src/server/routes/v1/secret-folder-router.ts +++ b/backend/src/server/routes/v1/secret-folder-router.ts @@ -8,6 +8,8 @@ import { readLimit, secretsLimit } from "@app/server/config/rateLimiter"; import { verifyAuth } from "@app/server/plugins/auth/verify-auth"; import { AuthMode } from "@app/services/auth/auth-type"; +import { DefaultResponseErrorsSchema } from "../sanitizedSchemas"; + export const registerSecretFolderRouter = async (server: FastifyZodProvider) => { server.route({ url: "/", @@ -43,6 +45,7 @@ export const registerSecretFolderRouter = async (server: FastifyZodProvider) => .describe(FOLDERS.CREATE.directory) }), response: { + ...DefaultResponseErrorsSchema, 200: z.object({ folder: SecretFoldersSchema }) @@ -115,6 +118,7 @@ export const registerSecretFolderRouter = async (server: FastifyZodProvider) => .describe(FOLDERS.UPDATE.directory) }), response: { + ...DefaultResponseErrorsSchema, 200: z.object({ folder: SecretFoldersSchema }) @@ -258,6 +262,7 @@ export const registerSecretFolderRouter = async (server: FastifyZodProvider) => .describe(FOLDERS.DELETE.directory) }), response: { + ...DefaultResponseErrorsSchema, 200: z.object({ folder: SecretFoldersSchema }) @@ -326,6 +331,7 @@ export const registerSecretFolderRouter = async (server: FastifyZodProvider) => .describe(FOLDERS.LIST.directory) }), response: { + ...DefaultResponseErrorsSchema, 200: z.object({ folders: SecretFoldersSchema.array() }) @@ -364,6 +370,7 @@ export const registerSecretFolderRouter = async (server: FastifyZodProvider) => id: z.string().trim().describe(FOLDERS.GET_BY_ID.folderId) }), response: { + ...DefaultResponseErrorsSchema, 200: z.object({ folder: SecretFoldersSchema }) diff --git a/backend/src/server/routes/v1/secret-import-router.ts b/backend/src/server/routes/v1/secret-import-router.ts index ec48803f6..941ea9aa9 100644 --- a/backend/src/server/routes/v1/secret-import-router.ts +++ b/backend/src/server/routes/v1/secret-import-router.ts @@ -8,7 +8,7 @@ import { readLimit, secretsLimit } from "@app/server/config/rateLimiter"; import { verifyAuth } from "@app/server/plugins/auth/verify-auth"; import { AuthMode } from "@app/services/auth/auth-type"; -import { secretRawSchema } from "../sanitizedSchemas"; +import { DefaultResponseErrorsSchema, secretRawSchema } from "../sanitizedSchemas"; export const registerSecretImportRouter = async (server: FastifyZodProvider) => { server.route({ @@ -35,6 +35,7 @@ export const registerSecretImportRouter = async (server: FastifyZodProvider) => isReplication: z.boolean().default(false).describe(SECRET_IMPORTS.CREATE.isReplication) }), response: { + ...DefaultResponseErrorsSchema, 200: z.object({ message: z.string(), secretImport: SecretImportsSchema.omit({ importEnv: true }).merge( @@ -108,6 +109,7 @@ export const registerSecretImportRouter = async (server: FastifyZodProvider) => }) }), response: { + ...DefaultResponseErrorsSchema, 200: z.object({ message: z.string(), secretImport: SecretImportsSchema.omit({ importEnv: true }).merge( @@ -172,6 +174,7 @@ export const registerSecretImportRouter = async (server: FastifyZodProvider) => path: z.string().trim().default("/").transform(removeTrailingSlash).describe(SECRET_IMPORTS.DELETE.path) }), response: { + ...DefaultResponseErrorsSchema, 200: z.object({ message: z.string(), secretImport: SecretImportsSchema.omit({ importEnv: true }).merge( @@ -275,6 +278,7 @@ export const registerSecretImportRouter = async (server: FastifyZodProvider) => path: z.string().trim().default("/").transform(removeTrailingSlash).describe(SECRET_IMPORTS.LIST.path) }), response: { + ...DefaultResponseErrorsSchema, 200: z.object({ message: z.string(), secretImports: SecretImportsSchema.omit({ importEnv: true }) diff --git a/backend/src/server/routes/v1/secret-tag-router.ts b/backend/src/server/routes/v1/secret-tag-router.ts index 7d696999e..8e6b1df7c 100644 --- a/backend/src/server/routes/v1/secret-tag-router.ts +++ b/backend/src/server/routes/v1/secret-tag-router.ts @@ -7,6 +7,8 @@ import { readLimit, writeLimit } from "@app/server/config/rateLimiter"; import { verifyAuth } from "@app/server/plugins/auth/verify-auth"; import { AuthMode } from "@app/services/auth/auth-type"; +import { DefaultResponseErrorsSchema } from "../sanitizedSchemas"; + export const registerSecretTagRouter = async (server: FastifyZodProvider) => { server.route({ method: "GET", @@ -19,6 +21,7 @@ export const registerSecretTagRouter = async (server: FastifyZodProvider) => { projectId: z.string().trim().describe(SECRET_TAGS.LIST.projectId) }), response: { + ...DefaultResponseErrorsSchema, 200: z.object({ workspaceTags: SecretTagsSchema.array() }) @@ -49,6 +52,7 @@ export const registerSecretTagRouter = async (server: FastifyZodProvider) => { tagId: z.string().trim().describe(SECRET_TAGS.GET_TAG_BY_ID.tagId) }), response: { + ...DefaultResponseErrorsSchema, 200: z.object({ // akhilmhdh: for terraform backward compatiability workspaceTag: SecretTagsSchema.extend({ name: z.string() }) @@ -80,6 +84,7 @@ export const registerSecretTagRouter = async (server: FastifyZodProvider) => { tagSlug: z.string().trim().describe(SECRET_TAGS.GET_TAG_BY_SLUG.tagSlug) }), response: { + ...DefaultResponseErrorsSchema, 200: z.object({ // akhilmhdh: for terraform backward compatiability workspaceTag: SecretTagsSchema.extend({ name: z.string() }) @@ -122,6 +127,7 @@ export const registerSecretTagRouter = async (server: FastifyZodProvider) => { color: z.string().trim().describe(SECRET_TAGS.CREATE.color) }), response: { + ...DefaultResponseErrorsSchema, 200: z.object({ workspaceTag: SecretTagsSchema }) @@ -164,6 +170,7 @@ export const registerSecretTagRouter = async (server: FastifyZodProvider) => { color: z.string().trim().describe(SECRET_TAGS.UPDATE.color) }), response: { + ...DefaultResponseErrorsSchema, 200: z.object({ workspaceTag: SecretTagsSchema }) @@ -195,6 +202,7 @@ export const registerSecretTagRouter = async (server: FastifyZodProvider) => { tagId: z.string().trim().describe(SECRET_TAGS.DELETE.tagId) }), response: { + ...DefaultResponseErrorsSchema, 200: z.object({ workspaceTag: SecretTagsSchema }) diff --git a/backend/src/server/routes/v2/group-project-router.ts b/backend/src/server/routes/v2/group-project-router.ts index cbc54f5ac..01512fde4 100644 --- a/backend/src/server/routes/v2/group-project-router.ts +++ b/backend/src/server/routes/v2/group-project-router.ts @@ -13,6 +13,8 @@ import { verifyAuth } from "@app/server/plugins/auth/verify-auth"; import { AuthMode } from "@app/services/auth/auth-type"; import { ProjectUserMembershipTemporaryMode } from "@app/services/project-membership/project-membership-types"; +import { DefaultResponseErrorsSchema } from "../sanitizedSchemas"; + export const registerGroupProjectRouter = async (server: FastifyZodProvider) => { server.route({ method: "POST", @@ -63,6 +65,7 @@ export const registerGroupProjectRouter = async (server: FastifyZodProvider) => path: ["role", "roles"] }), response: { + ...DefaultResponseErrorsSchema, 200: z.object({ groupMembership: GroupProjectMembershipsSchema }) @@ -119,6 +122,7 @@ export const registerGroupProjectRouter = async (server: FastifyZodProvider) => .describe(PROJECTS.UPDATE_GROUP_IN_PROJECT.roles) }), response: { + ...DefaultResponseErrorsSchema, 200: z.object({ roles: ProjectUserMembershipRolesSchema.array() }) @@ -158,6 +162,7 @@ export const registerGroupProjectRouter = async (server: FastifyZodProvider) => groupId: z.string().trim().describe(PROJECTS.REMOVE_GROUP_FROM_PROJECT.groupId) }), response: { + ...DefaultResponseErrorsSchema, 200: z.object({ groupMembership: GroupProjectMembershipsSchema }) @@ -195,6 +200,7 @@ export const registerGroupProjectRouter = async (server: FastifyZodProvider) => projectId: z.string().trim().describe(PROJECTS.LIST_GROUPS_IN_PROJECT.projectId) }), response: { + ...DefaultResponseErrorsSchema, 200: z.object({ groupMemberships: z .object({ @@ -254,6 +260,7 @@ export const registerGroupProjectRouter = async (server: FastifyZodProvider) => groupId: z.string().trim() }), response: { + ...DefaultResponseErrorsSchema, 200: z.object({ groupMembership: z.object({ id: z.string(), diff --git a/backend/src/server/routes/v2/identity-org-router.ts b/backend/src/server/routes/v2/identity-org-router.ts index edc270171..30d8c72f3 100644 --- a/backend/src/server/routes/v2/identity-org-router.ts +++ b/backend/src/server/routes/v2/identity-org-router.ts @@ -8,6 +8,8 @@ import { verifyAuth } from "@app/server/plugins/auth/verify-auth"; import { AuthMode } from "@app/services/auth/auth-type"; import { OrgIdentityOrderBy } from "@app/services/identity/identity-types"; +import { DefaultResponseErrorsSchema } from "../sanitizedSchemas"; + export const registerIdentityOrgRouter = async (server: FastifyZodProvider) => { server.route({ method: "GET", @@ -48,6 +50,7 @@ export const registerIdentityOrgRouter = async (server: FastifyZodProvider) => { search: z.string().trim().describe(ORGANIZATIONS.LIST_IDENTITY_MEMBERSHIPS.search).optional() }), response: { + ...DefaultResponseErrorsSchema, 200: z.object({ identityMemberships: IdentityOrgMembershipsSchema.merge( z.object({ diff --git a/backend/src/server/routes/v2/identity-project-router.ts b/backend/src/server/routes/v2/identity-project-router.ts index adb070ad9..e53903141 100644 --- a/backend/src/server/routes/v2/identity-project-router.ts +++ b/backend/src/server/routes/v2/identity-project-router.ts @@ -16,7 +16,7 @@ import { AuthMode } from "@app/services/auth/auth-type"; import { ProjectIdentityOrderBy } from "@app/services/identity-project/identity-project-types"; import { ProjectUserMembershipTemporaryMode } from "@app/services/project-membership/project-membership-types"; -import { SanitizedProjectSchema } from "../sanitizedSchemas"; +import { DefaultResponseErrorsSchema, SanitizedProjectSchema } from "../sanitizedSchemas"; export const registerIdentityProjectRouter = async (server: FastifyZodProvider) => { server.route({ @@ -71,6 +71,7 @@ export const registerIdentityProjectRouter = async (server: FastifyZodProvider) .optional() }), response: { + ...DefaultResponseErrorsSchema, 200: z.object({ identityMembership: IdentityProjectMembershipsSchema }) @@ -143,6 +144,7 @@ export const registerIdentityProjectRouter = async (server: FastifyZodProvider) .describe(PROJECT_IDENTITIES.UPDATE_IDENTITY_MEMBERSHIP.roles.description) }), response: { + ...DefaultResponseErrorsSchema, 200: z.object({ roles: ProjectUserMembershipRolesSchema.array() }) @@ -181,6 +183,7 @@ export const registerIdentityProjectRouter = async (server: FastifyZodProvider) identityId: z.string().trim().describe(PROJECT_IDENTITIES.DELETE_IDENTITY_MEMBERSHIP.identityId) }), response: { + ...DefaultResponseErrorsSchema, 200: z.object({ identityMembership: IdentityProjectMembershipsSchema }) @@ -243,6 +246,7 @@ export const registerIdentityProjectRouter = async (server: FastifyZodProvider) search: z.string().trim().describe(PROJECT_IDENTITIES.LIST_IDENTITY_MEMBERSHIPS.search).optional() }), response: { + ...DefaultResponseErrorsSchema, 200: z.object({ identityMemberships: z .object({ @@ -308,6 +312,7 @@ export const registerIdentityProjectRouter = async (server: FastifyZodProvider) identityId: z.string().trim().describe(PROJECT_IDENTITIES.GET_IDENTITY_MEMBERSHIP_BY_ID.identityId) }), response: { + ...DefaultResponseErrorsSchema, 200: z.object({ identityMembership: z.object({ id: z.string(), diff --git a/backend/src/server/routes/v2/organization-router.ts b/backend/src/server/routes/v2/organization-router.ts index e6ea094c3..6f01553c0 100644 --- a/backend/src/server/routes/v2/organization-router.ts +++ b/backend/src/server/routes/v2/organization-router.ts @@ -13,6 +13,8 @@ import { readLimit, writeLimit } from "@app/server/config/rateLimiter"; import { verifyAuth } from "@app/server/plugins/auth/verify-auth"; import { ActorType, AuthMode } from "@app/services/auth/auth-type"; +import { DefaultResponseErrorsSchema } from "../sanitizedSchemas"; + export const registerOrgRouter = async (server: FastifyZodProvider) => { server.route({ method: "GET", @@ -31,6 +33,7 @@ export const registerOrgRouter = async (server: FastifyZodProvider) => { organizationId: z.string().trim().describe(ORGANIZATIONS.LIST_USER_MEMBERSHIPS.organizationId) }), response: { + ...DefaultResponseErrorsSchema, 200: z.object({ users: OrgMembershipsSchema.merge( z.object({ @@ -79,6 +82,7 @@ export const registerOrgRouter = async (server: FastifyZodProvider) => { organizationId: z.string().trim().describe(ORGANIZATIONS.GET_PROJECTS.organizationId) }), response: { + ...DefaultResponseErrorsSchema, 200: z.object({ workspaces: z .object({ @@ -181,6 +185,7 @@ export const registerOrgRouter = async (server: FastifyZodProvider) => { isActive: z.boolean().optional().describe(ORGANIZATIONS.UPDATE_USER_MEMBERSHIP.isActive) }), response: { + ...DefaultResponseErrorsSchema, 200: z.object({ membership: OrgMembershipsSchema }) @@ -220,6 +225,7 @@ export const registerOrgRouter = async (server: FastifyZodProvider) => { membershipId: z.string().trim().describe(ORGANIZATIONS.DELETE_USER_MEMBERSHIP.membershipId) }), response: { + ...DefaultResponseErrorsSchema, 200: z.object({ membership: OrgMembershipsSchema }) diff --git a/backend/src/server/routes/v2/project-membership-router.ts b/backend/src/server/routes/v2/project-membership-router.ts index 4aa03f33c..2d791b64b 100644 --- a/backend/src/server/routes/v2/project-membership-router.ts +++ b/backend/src/server/routes/v2/project-membership-router.ts @@ -7,6 +7,8 @@ import { writeLimit } from "@app/server/config/rateLimiter"; import { verifyAuth } from "@app/server/plugins/auth/verify-auth"; import { AuthMode } from "@app/services/auth/auth-type"; +import { DefaultResponseErrorsSchema } from "../sanitizedSchemas"; + export const registerProjectMembershipRouter = async (server: FastifyZodProvider) => { server.route({ method: "POST", @@ -30,6 +32,7 @@ export const registerProjectMembershipRouter = async (server: FastifyZodProvider roleSlugs: z.string().array().optional().describe(PROJECT_USERS.INVITE_MEMBER.roleSlugs) }), response: { + ...DefaultResponseErrorsSchema, 200: z.object({ memberships: ProjectMembershipsSchema.array() }) @@ -92,6 +95,7 @@ export const registerProjectMembershipRouter = async (server: FastifyZodProvider usernames: z.string().array().default([]).describe(PROJECT_USERS.REMOVE_MEMBER.usernames) }), response: { + ...DefaultResponseErrorsSchema, 200: z.object({ memberships: ProjectMembershipsSchema.array() }) diff --git a/backend/src/server/routes/v2/project-router.ts b/backend/src/server/routes/v2/project-router.ts index 61e175cfd..83970b850 100644 --- a/backend/src/server/routes/v2/project-router.ts +++ b/backend/src/server/routes/v2/project-router.ts @@ -19,7 +19,7 @@ import { sanitizedCertificateTemplate } from "@app/services/certificate-template import { ProjectFilterType } from "@app/services/project/project-types"; import { PostHogEventTypes } from "@app/services/telemetry/telemetry-types"; -import { SanitizedProjectSchema } from "../sanitizedSchemas"; +import { DefaultResponseErrorsSchema, SanitizedProjectSchema } from "../sanitizedSchemas"; const projectWithEnv = SanitizedProjectSchema.extend({ _id: z.string(), @@ -172,6 +172,7 @@ export const registerProjectRouter = async (server: FastifyZodProvider) => { kmsKeyId: z.string().optional() }), response: { + ...DefaultResponseErrorsSchema, 200: z.object({ project: projectWithEnv }) @@ -221,6 +222,7 @@ export const registerProjectRouter = async (server: FastifyZodProvider) => { slug: slugSchema.describe("The slug of the project to delete.") }), response: { + ...DefaultResponseErrorsSchema, 200: SanitizedProjectSchema } }, @@ -376,6 +378,7 @@ export const registerProjectRouter = async (server: FastifyZodProvider) => { limit: z.coerce.number().min(1).max(100).default(25).describe(PROJECTS.LIST_CERTIFICATES.limit) }), response: { + ...DefaultResponseErrorsSchema, 200: z.object({ certificates: z.array(CertificatesSchema), totalCount: z.number() diff --git a/backend/src/server/routes/v2/service-token-router.ts b/backend/src/server/routes/v2/service-token-router.ts index fb10f17db..92e65ac9e 100644 --- a/backend/src/server/routes/v2/service-token-router.ts +++ b/backend/src/server/routes/v2/service-token-router.ts @@ -7,7 +7,7 @@ import { readLimit, writeLimit } from "@app/server/config/rateLimiter"; import { verifyAuth } from "@app/server/plugins/auth/verify-auth"; import { AuthMode } from "@app/services/auth/auth-type"; -import { sanitizedServiceTokenUserSchema } from "../sanitizedSchemas"; +import { DefaultResponseErrorsSchema, sanitizedServiceTokenUserSchema } from "../sanitizedSchemas"; export const sanitizedServiceTokenSchema = ServiceTokensSchema.omit({ secretHash: true, @@ -32,6 +32,7 @@ export const registerServiceTokenRouter = async (server: FastifyZodProvider) => } ], response: { + ...DefaultResponseErrorsSchema, 200: ServiceTokensSchema.merge( z.object({ workspace: z.string(), diff --git a/backend/src/server/routes/v3/secret-router.ts b/backend/src/server/routes/v3/secret-router.ts index e0341cc78..f537e02df 100644 --- a/backend/src/server/routes/v3/secret-router.ts +++ b/backend/src/server/routes/v3/secret-router.ts @@ -21,7 +21,7 @@ import { ProjectFilterType } from "@app/services/project/project-types"; import { SecretOperations, SecretProtectionType } from "@app/services/secret/secret-types"; import { PostHogEventTypes } from "@app/services/telemetry/telemetry-types"; -import { secretRawSchema } from "../sanitizedSchemas"; +import { DefaultResponseErrorsSchema, secretRawSchema } from "../sanitizedSchemas"; export const registerSecretRouter = async (server: FastifyZodProvider) => { server.route({ @@ -53,6 +53,7 @@ export const registerSecretRouter = async (server: FastifyZodProvider) => { tagSlugs: z.string().array().min(1).describe(SECRETS.ATTACH_TAGS.tagSlugs) }), response: { + ...DefaultResponseErrorsSchema, 200: z.object({ secret: SecretsSchema.omit({ secretBlindIndex: true }).merge( z.object({ @@ -116,6 +117,7 @@ export const registerSecretRouter = async (server: FastifyZodProvider) => { tagSlugs: z.string().array().min(1).describe(SECRETS.DETACH_TAGS.tagSlugs) }), response: { + ...DefaultResponseErrorsSchema, 200: z.object({ secret: SecretsSchema.omit({ secretBlindIndex: true }).extend({ tags: SecretTagsSchema.pick({ @@ -189,6 +191,7 @@ export const registerSecretRouter = async (server: FastifyZodProvider) => { .transform((el) => (el ? el.split(",").map((i) => i.trim()) : [])) }), response: { + ...DefaultResponseErrorsSchema, 200: z.object({ secrets: secretRawSchema .extend({ @@ -212,7 +215,8 @@ export const registerSecretRouter = async (server: FastifyZodProvider) => { }) .array() .optional() - }) + }), + ...DefaultResponseErrorsSchema } }, onRequest: verifyAuth([AuthMode.JWT, AuthMode.API_KEY, AuthMode.SERVICE_TOKEN, AuthMode.IDENTITY_ACCESS_TOKEN]), @@ -327,6 +331,7 @@ export const registerSecretRouter = async (server: FastifyZodProvider) => { .describe(RAW_SECRETS.GET.includeImports) }), response: { + ...DefaultResponseErrorsSchema, 200: z.object({ secret: secretRawSchema.extend({ tags: SecretTagsSchema.pick({ @@ -449,6 +454,7 @@ export const registerSecretRouter = async (server: FastifyZodProvider) => { secretReminderNote: z.string().optional().nullable().describe(RAW_SECRETS.CREATE.secretReminderNote) }), response: { + ...DefaultResponseErrorsSchema, 200: z.union([ z.object({ secret: secretRawSchema @@ -556,6 +562,7 @@ export const registerSecretRouter = async (server: FastifyZodProvider) => { secretComment: z.string().optional().describe(RAW_SECRETS.UPDATE.secretComment) }), response: { + ...DefaultResponseErrorsSchema, 200: z.union([ z.object({ secret: secretRawSchema @@ -649,6 +656,7 @@ export const registerSecretRouter = async (server: FastifyZodProvider) => { type: z.nativeEnum(SecretType).default(SecretType.Shared).describe(RAW_SECRETS.DELETE.type) }), response: { + ...DefaultResponseErrorsSchema, 200: z.union([ z.object({ secret: secretRawSchema @@ -728,6 +736,7 @@ export const registerSecretRouter = async (server: FastifyZodProvider) => { .transform((value) => value === "true") }), response: { + ...DefaultResponseErrorsSchema, 200: z.object({ secrets: SecretsSchema.omit({ secretBlindIndex: true }) .extend({ @@ -843,6 +852,7 @@ export const registerSecretRouter = async (server: FastifyZodProvider) => { .transform((value) => value === "true") }), response: { + ...DefaultResponseErrorsSchema, 200: z.object({ secret: SecretsSchema.omit({ secretBlindIndex: true }).merge( z.object({ @@ -930,6 +940,7 @@ export const registerSecretRouter = async (server: FastifyZodProvider) => { secretName: z.string().trim() }), response: { + ...DefaultResponseErrorsSchema, 200: z.union([ z.object({ secret: SecretsSchema.omit({ secretBlindIndex: true }).merge( @@ -1107,6 +1118,7 @@ export const registerSecretRouter = async (server: FastifyZodProvider) => { metadata: z.record(z.string()).optional() }), response: { + ...DefaultResponseErrorsSchema, 200: z.union([ z.object({ secret: SecretsSchema.omit({ secretBlindIndex: true }).merge( @@ -1278,6 +1290,7 @@ export const registerSecretRouter = async (server: FastifyZodProvider) => { environment: z.string().trim() }), response: { + ...DefaultResponseErrorsSchema, 200: z.union([ z.object({ secret: SecretsSchema.omit({ secretBlindIndex: true }).merge( @@ -1401,6 +1414,7 @@ export const registerSecretRouter = async (server: FastifyZodProvider) => { shouldOverwrite: z.boolean().default(false) }), response: { + ...DefaultResponseErrorsSchema, 200: z.object({ isSourceUpdated: z.boolean(), isDestinationUpdated: z.boolean() @@ -1469,6 +1483,7 @@ export const registerSecretRouter = async (server: FastifyZodProvider) => { .min(1) }), response: { + ...DefaultResponseErrorsSchema, 200: z.union([ z.object({ secrets: SecretsSchema.omit({ secretBlindIndex: true }).array() @@ -1596,6 +1611,7 @@ export const registerSecretRouter = async (server: FastifyZodProvider) => { .min(1) }), response: { + ...DefaultResponseErrorsSchema, 200: z.union([ z.object({ secrets: SecretsSchema.omit({ secretBlindIndex: true }).array() @@ -1711,6 +1727,7 @@ export const registerSecretRouter = async (server: FastifyZodProvider) => { .min(1) }), response: { + ...DefaultResponseErrorsSchema, 200: z.union([ z.object({ secrets: SecretsSchema.omit({ secretBlindIndex: true }).array() @@ -1844,6 +1861,7 @@ export const registerSecretRouter = async (server: FastifyZodProvider) => { .min(1) }), response: { + ...DefaultResponseErrorsSchema, 200: z.union([ z.object({ secrets: secretRawSchema.array() @@ -1950,6 +1968,7 @@ export const registerSecretRouter = async (server: FastifyZodProvider) => { .min(1) }), response: { + ...DefaultResponseErrorsSchema, 200: z.union([ z.object({ secrets: secretRawSchema.array() @@ -2042,6 +2061,7 @@ export const registerSecretRouter = async (server: FastifyZodProvider) => { .min(1) }), response: { + ...DefaultResponseErrorsSchema, 200: z.union([ z.object({ secrets: secretRawSchema.array() @@ -2119,6 +2139,7 @@ export const registerSecretRouter = async (server: FastifyZodProvider) => { projectId: z.string().trim().min(1) }), response: { + ...DefaultResponseErrorsSchema, 200: z.object({ message: z.string() }) diff --git a/docs/mint.json b/docs/mint.json index d2ca12605..55b629aed 100644 --- a/docs/mint.json +++ b/docs/mint.json @@ -1,6 +1,6 @@ { "name": "Infisical", - "openapi": "https://app.infisical.com/api/docs/json", + "openapi": "http://localhost:8080/api/docs/json", "logo": { "dark": "/logo/dark.svg", "light": "/logo/light.svg",