From 74bb2302471b55210c8eb8e6b9d356d0c74d1bdc Mon Sep 17 00:00:00 2001 From: David Nguyen Date: Mon, 20 Jan 2025 19:47:39 +1100 Subject: [PATCH] fix: add empty success responses (#1600) --- packages/trpc/server/document-router/router.ts | 13 +++++++++---- packages/trpc/server/document-router/schema.ts | 13 +++++++++++++ packages/trpc/server/field-router/router.ts | 11 +++++++---- packages/trpc/server/recipient-router/router.ts | 11 +++++++---- packages/trpc/server/template-router/router.ts | 11 +++++++---- 5 files changed, 43 insertions(+), 16 deletions(-) diff --git a/packages/trpc/server/document-router/router.ts b/packages/trpc/server/document-router/router.ts index daa180c3a..2a151b7c1 100644 --- a/packages/trpc/server/document-router/router.ts +++ b/packages/trpc/server/document-router/router.ts @@ -1,6 +1,5 @@ import { TRPCError } from '@trpc/server'; import { DateTime } from 'luxon'; -import { z } from 'zod'; import { getServerLimits } from '@documenso/ee/server-only/limits/server'; import { NEXT_PUBLIC_WEBAPP_URL } from '@documenso/lib/constants/app'; @@ -42,6 +41,7 @@ import { ZFindDocumentAuditLogsQuerySchema, ZFindDocumentsRequestSchema, ZFindDocumentsResponseSchema, + ZGenericSuccessResponse, ZGetDocumentByIdQuerySchema, ZGetDocumentByTokenQuerySchema, ZGetDocumentWithDetailsByIdRequestSchema, @@ -52,6 +52,7 @@ import { ZSearchDocumentsMutationSchema, ZSetPasswordForDocumentMutationSchema, ZSetSigningOrderForDocumentMutationSchema, + ZSuccessResponseSchema, ZUpdateDocumentRequestSchema, ZUpdateDocumentResponseSchema, } from './schema'; @@ -326,7 +327,7 @@ export const documentRouter = router({ }, }) .input(ZDeleteDocumentMutationSchema) - .output(z.void()) + .output(ZSuccessResponseSchema) .mutation(async ({ input, ctx }) => { const { teamId } = ctx; const { documentId } = input; @@ -339,6 +340,8 @@ export const documentRouter = router({ teamId, requestMetadata: ctx.metadata, }); + + return ZGenericSuccessResponse; }), /** @@ -481,18 +484,20 @@ export const documentRouter = router({ }, }) .input(ZResendDocumentMutationSchema) - .output(z.void()) + .output(ZSuccessResponseSchema) .mutation(async ({ input, ctx }) => { const { teamId } = ctx; const { documentId, recipients } = input; - return await resendDocument({ + await resendDocument({ userId: ctx.user.id, teamId, documentId, recipients, requestMetadata: ctx.metadata, }); + + return ZGenericSuccessResponse; }), /** diff --git a/packages/trpc/server/document-router/schema.ts b/packages/trpc/server/document-router/schema.ts index c9b3b4d3c..887bc48e2 100644 --- a/packages/trpc/server/document-router/schema.ts +++ b/packages/trpc/server/document-router/schema.ts @@ -34,6 +34,19 @@ import { import { ZCreateRecipientSchema } from '../recipient-router/schema'; +/** + * Required for empty responses since we currently can't 201 requests for our openapi setup. + * + * Without this it will throw an error in Speakeasy SDK when it tries to parse an empty response. + */ +export const ZSuccessResponseSchema = z.object({ + success: z.literal(true), +}); + +export const ZGenericSuccessResponse = { + success: true, +} satisfies z.infer; + export const ZDocumentTitleSchema = z .string() .trim() diff --git a/packages/trpc/server/field-router/router.ts b/packages/trpc/server/field-router/router.ts index a05811675..df17aef88 100644 --- a/packages/trpc/server/field-router/router.ts +++ b/packages/trpc/server/field-router/router.ts @@ -1,5 +1,3 @@ -import { z } from 'zod'; - import { createDocumentFields } from '@documenso/lib/server-only/field/create-document-fields'; import { createTemplateFields } from '@documenso/lib/server-only/field/create-template-fields'; import { deleteDocumentField } from '@documenso/lib/server-only/field/delete-document-field'; @@ -13,6 +11,7 @@ import { updateDocumentFields } from '@documenso/lib/server-only/field/update-do import { updateTemplateFields } from '@documenso/lib/server-only/field/update-template-fields'; import { extractNextApiRequestMetadata } from '@documenso/lib/universal/extract-request-metadata'; +import { ZGenericSuccessResponse, ZSuccessResponseSchema } from '../document-router/schema'; import { authenticatedProcedure, procedure, router } from '../trpc'; import { ZCreateDocumentFieldRequestSchema, @@ -200,7 +199,7 @@ export const fieldRouter = router({ }, }) .input(ZDeleteDocumentFieldRequestSchema) - .output(z.void()) + .output(ZSuccessResponseSchema) .mutation(async ({ input, ctx }) => { const { teamId } = ctx; const { fieldId } = input; @@ -211,6 +210,8 @@ export const fieldRouter = router({ fieldId, requestMetadata: ctx.metadata, }); + + return ZGenericSuccessResponse; }), /** @@ -396,7 +397,7 @@ export const fieldRouter = router({ }, }) .input(ZDeleteTemplateFieldRequestSchema) - .output(z.void()) + .output(ZSuccessResponseSchema) .mutation(async ({ input, ctx }) => { const { teamId } = ctx; const { fieldId } = input; @@ -406,6 +407,8 @@ export const fieldRouter = router({ teamId, fieldId, }); + + return ZGenericSuccessResponse; }), /** diff --git a/packages/trpc/server/recipient-router/router.ts b/packages/trpc/server/recipient-router/router.ts index f62660da8..b323ba5f0 100644 --- a/packages/trpc/server/recipient-router/router.ts +++ b/packages/trpc/server/recipient-router/router.ts @@ -1,5 +1,3 @@ -import { z } from 'zod'; - import { completeDocumentWithToken } from '@documenso/lib/server-only/document/complete-document-with-token'; import { rejectDocumentWithToken } from '@documenso/lib/server-only/document/reject-document-with-token'; import { createDocumentRecipients } from '@documenso/lib/server-only/recipient/create-document-recipients'; @@ -13,6 +11,7 @@ import { updateDocumentRecipients } from '@documenso/lib/server-only/recipient/u import { updateTemplateRecipients } from '@documenso/lib/server-only/recipient/update-template-recipients'; import { extractNextApiRequestMetadata } from '@documenso/lib/universal/extract-request-metadata'; +import { ZGenericSuccessResponse, ZSuccessResponseSchema } from '../document-router/schema'; import { authenticatedProcedure, procedure, router } from '../trpc'; import { ZCompleteDocumentWithTokenMutationSchema, @@ -200,7 +199,7 @@ export const recipientRouter = router({ }, }) .input(ZDeleteDocumentRecipientRequestSchema) - .output(z.void()) + .output(ZSuccessResponseSchema) .mutation(async ({ input, ctx }) => { const { teamId } = ctx; const { recipientId } = input; @@ -211,6 +210,8 @@ export const recipientRouter = router({ recipientId, requestMetadata: ctx.metadata, }); + + return ZGenericSuccessResponse; }), /** @@ -391,7 +392,7 @@ export const recipientRouter = router({ }, }) .input(ZDeleteTemplateRecipientRequestSchema) - .output(z.void()) + .output(ZSuccessResponseSchema) .mutation(async ({ input, ctx }) => { const { teamId } = ctx; const { recipientId } = input; @@ -401,6 +402,8 @@ export const recipientRouter = router({ userId: ctx.user.id, teamId, }); + + return ZGenericSuccessResponse; }), /** diff --git a/packages/trpc/server/template-router/router.ts b/packages/trpc/server/template-router/router.ts index 13fc637de..0be0e89a1 100644 --- a/packages/trpc/server/template-router/router.ts +++ b/packages/trpc/server/template-router/router.ts @@ -1,5 +1,3 @@ -import { z } from 'zod'; - import { getServerLimits } from '@documenso/ee/server-only/limits/server'; import { AppError, AppErrorCode } from '@documenso/lib/errors/app-error'; import { getDocumentWithDetailsById } from '@documenso/lib/server-only/document/get-document-with-details-by-id'; @@ -24,6 +22,7 @@ import { toggleTemplateDirectLink } from '@documenso/lib/server-only/template/to import { updateTemplate } from '@documenso/lib/server-only/template/update-template'; import type { Document } from '@documenso/prisma/client'; +import { ZGenericSuccessResponse, ZSuccessResponseSchema } from '../document-router/schema'; import { authenticatedProcedure, maybeAuthenticatedProcedure, router } from '../trpc'; import { ZCreateDocumentFromDirectTemplateRequestSchema, @@ -195,7 +194,7 @@ export const templateRouter = router({ }, }) .input(ZDeleteTemplateMutationSchema) - .output(z.void()) + .output(ZSuccessResponseSchema) .mutation(async ({ input, ctx }) => { const { teamId } = ctx; const { templateId } = input; @@ -203,6 +202,8 @@ export const templateRouter = router({ const userId = ctx.user.id; await deleteTemplate({ userId, id: templateId, teamId }); + + return ZGenericSuccessResponse; }), /** @@ -352,7 +353,7 @@ export const templateRouter = router({ }, }) .input(ZDeleteTemplateDirectLinkRequestSchema) - .output(z.void()) + .output(ZSuccessResponseSchema) .mutation(async ({ input, ctx }) => { const { teamId } = ctx; const { templateId } = input; @@ -360,6 +361,8 @@ export const templateRouter = router({ const userId = ctx.user.id; await deleteTemplateDirectLink({ userId, teamId, templateId }); + + return ZGenericSuccessResponse; }), /**