diff --git a/apps/remix/server/api/download/download.ts b/apps/remix/server/api/download/download.ts index a3af42508..26371b401 100644 --- a/apps/remix/server/api/download/download.ts +++ b/apps/remix/server/api/download/download.ts @@ -21,7 +21,7 @@ export const downloadRoute = new Hono() * Requires API key authentication via Authorization header. */ .get( - '/envelopeItem/:envelopeItemId/download', + '/envelope/item/:envelopeItemId/download', sValidator('param', ZDownloadEnvelopeItemRequestParamsSchema), async (c) => { const logger = c.get('logger'); diff --git a/packages/trpc/server/document-router/attachment/create-attachment.ts b/packages/trpc/server/document-router/attachment/create-attachment.ts index 16eea3121..98877fee0 100644 --- a/packages/trpc/server/document-router/attachment/create-attachment.ts +++ b/packages/trpc/server/document-router/attachment/create-attachment.ts @@ -41,10 +41,14 @@ export const createAttachmentRoute = authenticatedProcedure type: EnvelopeType.DOCUMENT, }); - await createAttachment({ + const attachment = await createAttachment({ envelopeId: envelope.id, teamId, userId, data, }); + + return { + id: attachment.id, + }; }); diff --git a/packages/trpc/server/document-router/attachment/create-attachment.types.ts b/packages/trpc/server/document-router/attachment/create-attachment.types.ts index 1baf69b24..6d13d911a 100644 --- a/packages/trpc/server/document-router/attachment/create-attachment.types.ts +++ b/packages/trpc/server/document-router/attachment/create-attachment.types.ts @@ -8,7 +8,9 @@ export const ZCreateAttachmentRequestSchema = z.object({ }), }); -export const ZCreateAttachmentResponseSchema = z.void(); +export const ZCreateAttachmentResponseSchema = z.object({ + id: z.string(), +}); export type TCreateAttachmentRequest = z.infer; export type TCreateAttachmentResponse = z.infer; diff --git a/packages/trpc/server/document-router/attachment/delete-attachment.ts b/packages/trpc/server/document-router/attachment/delete-attachment.ts index f7c058c5b..38aa9b34d 100644 --- a/packages/trpc/server/document-router/attachment/delete-attachment.ts +++ b/packages/trpc/server/document-router/attachment/delete-attachment.ts @@ -1,5 +1,6 @@ import { deleteAttachment } from '@documenso/lib/server-only/envelope-attachment/delete-attachment'; +import { ZGenericSuccessResponse } from '../../schema'; import { authenticatedProcedure } from '../../trpc'; import { ZDeleteAttachmentRequestSchema, @@ -33,4 +34,6 @@ export const deleteAttachmentRoute = authenticatedProcedure userId, teamId, }); + + return ZGenericSuccessResponse; }); diff --git a/packages/trpc/server/document-router/attachment/delete-attachment.types.ts b/packages/trpc/server/document-router/attachment/delete-attachment.types.ts index 81d7c0614..d1caa2fa8 100644 --- a/packages/trpc/server/document-router/attachment/delete-attachment.types.ts +++ b/packages/trpc/server/document-router/attachment/delete-attachment.types.ts @@ -1,10 +1,12 @@ import { z } from 'zod'; +import { ZSuccessResponseSchema } from '../../schema'; + export const ZDeleteAttachmentRequestSchema = z.object({ id: z.string(), }); -export const ZDeleteAttachmentResponseSchema = z.void(); +export const ZDeleteAttachmentResponseSchema = ZSuccessResponseSchema; export type TDeleteAttachmentRequest = z.infer; export type TDeleteAttachmentResponse = z.infer; diff --git a/packages/trpc/server/document-router/attachment/update-attachment.ts b/packages/trpc/server/document-router/attachment/update-attachment.ts index d03715d03..539f213ed 100644 --- a/packages/trpc/server/document-router/attachment/update-attachment.ts +++ b/packages/trpc/server/document-router/attachment/update-attachment.ts @@ -1,5 +1,6 @@ import { updateAttachment } from '@documenso/lib/server-only/envelope-attachment/update-attachment'; +import { ZGenericSuccessResponse } from '../../schema'; import { authenticatedProcedure } from '../../trpc'; import { ZUpdateAttachmentRequestSchema, @@ -34,4 +35,6 @@ export const updateAttachmentRoute = authenticatedProcedure teamId, data, }); + + return ZGenericSuccessResponse; }); diff --git a/packages/trpc/server/document-router/attachment/update-attachment.types.ts b/packages/trpc/server/document-router/attachment/update-attachment.types.ts index eaf12b559..237f99623 100644 --- a/packages/trpc/server/document-router/attachment/update-attachment.types.ts +++ b/packages/trpc/server/document-router/attachment/update-attachment.types.ts @@ -1,5 +1,7 @@ import { z } from 'zod'; +import { ZSuccessResponseSchema } from '../../schema'; + export const ZUpdateAttachmentRequestSchema = z.object({ id: z.string(), data: z.object({ @@ -8,7 +10,7 @@ export const ZUpdateAttachmentRequestSchema = z.object({ }), }); -export const ZUpdateAttachmentResponseSchema = z.void(); +export const ZUpdateAttachmentResponseSchema = ZSuccessResponseSchema; export type TUpdateAttachmentRequest = z.infer; export type TUpdateAttachmentResponse = z.infer; diff --git a/packages/trpc/server/document-router/delete-document.ts b/packages/trpc/server/document-router/delete-document.ts index 4a0f30c08..511560254 100644 --- a/packages/trpc/server/document-router/delete-document.ts +++ b/packages/trpc/server/document-router/delete-document.ts @@ -1,12 +1,12 @@ import { deleteDocument } from '@documenso/lib/server-only/document/delete-document'; +import { ZGenericSuccessResponse } from '../schema'; import { authenticatedProcedure } from '../trpc'; import { ZDeleteDocumentRequestSchema, ZDeleteDocumentResponseSchema, deleteDocumentMeta, } from './delete-document.types'; -import { ZGenericSuccessResponse } from './schema'; export const deleteDocumentRoute = authenticatedProcedure .meta(deleteDocumentMeta) diff --git a/packages/trpc/server/document-router/delete-document.types.ts b/packages/trpc/server/document-router/delete-document.types.ts index 72c7a711d..a84ac0027 100644 --- a/packages/trpc/server/document-router/delete-document.types.ts +++ b/packages/trpc/server/document-router/delete-document.types.ts @@ -1,7 +1,7 @@ import { z } from 'zod'; +import { ZSuccessResponseSchema } from '../schema'; import type { TrpcRouteMeta } from '../trpc'; -import { ZSuccessResponseSchema } from './schema'; export const deleteDocumentMeta: TrpcRouteMeta = { openapi: { diff --git a/packages/trpc/server/document-router/download-document.ts b/packages/trpc/server/document-router/download-document.ts index 241479f54..946fb0d68 100644 --- a/packages/trpc/server/document-router/download-document.ts +++ b/packages/trpc/server/document-router/download-document.ts @@ -19,5 +19,6 @@ export const downloadDocumentRoute = authenticatedProcedure }, }); + // This endpoint is purely for V2 API, which is implemented in the Hono remix server. throw new Error('NOT_IMPLEMENTED'); }); diff --git a/packages/trpc/server/document-router/redistribute-document.ts b/packages/trpc/server/document-router/redistribute-document.ts index c925bca6c..f4867465e 100644 --- a/packages/trpc/server/document-router/redistribute-document.ts +++ b/packages/trpc/server/document-router/redistribute-document.ts @@ -1,12 +1,12 @@ import { resendDocument } from '@documenso/lib/server-only/document/resend-document'; +import { ZGenericSuccessResponse } from '../schema'; import { authenticatedProcedure } from '../trpc'; import { ZRedistributeDocumentRequestSchema, ZRedistributeDocumentResponseSchema, redistributeDocumentMeta, } from './redistribute-document.types'; -import { ZGenericSuccessResponse } from './schema'; export const redistributeDocumentRoute = authenticatedProcedure .meta(redistributeDocumentMeta) diff --git a/packages/trpc/server/document-router/redistribute-document.types.ts b/packages/trpc/server/document-router/redistribute-document.types.ts index 6444b6fe5..274f4e09a 100644 --- a/packages/trpc/server/document-router/redistribute-document.types.ts +++ b/packages/trpc/server/document-router/redistribute-document.types.ts @@ -1,7 +1,7 @@ import { z } from 'zod'; +import { ZSuccessResponseSchema } from '../schema'; import type { TrpcRouteMeta } from '../trpc'; -import { ZSuccessResponseSchema } from './schema'; export const redistributeDocumentMeta: TrpcRouteMeta = { openapi: { diff --git a/packages/trpc/server/document-router/schema.ts b/packages/trpc/server/document-router/schema.ts index 429ca7af1..f7cfd93b8 100644 --- a/packages/trpc/server/document-router/schema.ts +++ b/packages/trpc/server/document-router/schema.ts @@ -1,19 +1,6 @@ import { DocumentVisibility } from '@prisma/client'; import { z } from 'zod'; -/** - * 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/envelope-router/attachment/create-attachment.ts b/packages/trpc/server/envelope-router/attachment/create-attachment.ts index f149bbe31..e3111dee8 100644 --- a/packages/trpc/server/envelope-router/attachment/create-attachment.ts +++ b/packages/trpc/server/envelope-router/attachment/create-attachment.ts @@ -21,10 +21,14 @@ export const createAttachmentRoute = authenticatedProcedure input: { envelopeId, label: data.label }, }); - await createAttachment({ + const attachment = await createAttachment({ envelopeId, teamId, userId, data, }); + + return { + id: attachment.id, + }; }); diff --git a/packages/trpc/server/envelope-router/attachment/create-attachment.types.ts b/packages/trpc/server/envelope-router/attachment/create-attachment.types.ts index 661427815..f07be361d 100644 --- a/packages/trpc/server/envelope-router/attachment/create-attachment.types.ts +++ b/packages/trpc/server/envelope-router/attachment/create-attachment.types.ts @@ -20,7 +20,9 @@ export const ZCreateAttachmentRequestSchema = z.object({ }), }); -export const ZCreateAttachmentResponseSchema = z.void(); +export const ZCreateAttachmentResponseSchema = z.object({ + id: z.string(), +}); export type TCreateAttachmentRequest = z.infer; export type TCreateAttachmentResponse = z.infer; diff --git a/packages/trpc/server/envelope-router/attachment/delete-attachment.ts b/packages/trpc/server/envelope-router/attachment/delete-attachment.ts index f49280825..8d93b1fda 100644 --- a/packages/trpc/server/envelope-router/attachment/delete-attachment.ts +++ b/packages/trpc/server/envelope-router/attachment/delete-attachment.ts @@ -1,5 +1,6 @@ import { deleteAttachment } from '@documenso/lib/server-only/envelope-attachment/delete-attachment'; +import { ZGenericSuccessResponse } from '../../schema'; import { authenticatedProcedure } from '../../trpc'; import { ZDeleteAttachmentRequestSchema, @@ -26,4 +27,6 @@ export const deleteAttachmentRoute = authenticatedProcedure userId, teamId, }); + + return ZGenericSuccessResponse; }); diff --git a/packages/trpc/server/envelope-router/attachment/delete-attachment.types.ts b/packages/trpc/server/envelope-router/attachment/delete-attachment.types.ts index b5dd8f6af..122d11f1d 100644 --- a/packages/trpc/server/envelope-router/attachment/delete-attachment.types.ts +++ b/packages/trpc/server/envelope-router/attachment/delete-attachment.types.ts @@ -1,5 +1,6 @@ import { z } from 'zod'; +import { ZSuccessResponseSchema } from '../../schema'; import type { TrpcRouteMeta } from '../../trpc'; export const deleteAttachmentMeta: TrpcRouteMeta = { @@ -16,7 +17,7 @@ export const ZDeleteAttachmentRequestSchema = z.object({ id: z.string(), }); -export const ZDeleteAttachmentResponseSchema = z.void(); +export const ZDeleteAttachmentResponseSchema = ZSuccessResponseSchema; export type TDeleteAttachmentRequest = z.infer; export type TDeleteAttachmentResponse = z.infer; diff --git a/packages/trpc/server/envelope-router/attachment/update-attachment.ts b/packages/trpc/server/envelope-router/attachment/update-attachment.ts index dd0613cc7..d89af19ca 100644 --- a/packages/trpc/server/envelope-router/attachment/update-attachment.ts +++ b/packages/trpc/server/envelope-router/attachment/update-attachment.ts @@ -1,5 +1,6 @@ import { updateAttachment } from '@documenso/lib/server-only/envelope-attachment/update-attachment'; +import { ZGenericSuccessResponse } from '../../schema'; import { authenticatedProcedure } from '../../trpc'; import { ZUpdateAttachmentRequestSchema, @@ -27,4 +28,6 @@ export const updateAttachmentRoute = authenticatedProcedure teamId, data, }); + + return ZGenericSuccessResponse; }); diff --git a/packages/trpc/server/envelope-router/attachment/update-attachment.types.ts b/packages/trpc/server/envelope-router/attachment/update-attachment.types.ts index d46b15251..2acff8257 100644 --- a/packages/trpc/server/envelope-router/attachment/update-attachment.types.ts +++ b/packages/trpc/server/envelope-router/attachment/update-attachment.types.ts @@ -1,5 +1,6 @@ import { z } from 'zod'; +import { ZSuccessResponseSchema } from '../../schema'; import type { TrpcRouteMeta } from '../../trpc'; export const updateAttachmentMeta: TrpcRouteMeta = { @@ -20,7 +21,7 @@ export const ZUpdateAttachmentRequestSchema = z.object({ }), }); -export const ZUpdateAttachmentResponseSchema = z.void(); +export const ZUpdateAttachmentResponseSchema = ZSuccessResponseSchema; export type TUpdateAttachmentRequest = z.infer; export type TUpdateAttachmentResponse = z.infer; diff --git a/packages/trpc/server/envelope-router/create-envelope-items.types.ts b/packages/trpc/server/envelope-router/create-envelope-items.types.ts index 12467bce9..4bcfa7f90 100644 --- a/packages/trpc/server/envelope-router/create-envelope-items.types.ts +++ b/packages/trpc/server/envelope-router/create-envelope-items.types.ts @@ -11,6 +11,7 @@ export const createEnvelopeItemsMeta: TrpcRouteMeta = { method: 'POST', path: '/envelope/item/create-many', summary: 'Create envelope items', + contentTypes: ['multipart/form-data'], description: 'Create multiple envelope items for an envelope', tags: ['Envelope Items'], }, diff --git a/packages/trpc/server/envelope-router/delete-envelope-item.ts b/packages/trpc/server/envelope-router/delete-envelope-item.ts index b5200ebdd..024bdf7e1 100644 --- a/packages/trpc/server/envelope-router/delete-envelope-item.ts +++ b/packages/trpc/server/envelope-router/delete-envelope-item.ts @@ -5,6 +5,7 @@ import { createDocumentAuditLogData } from '@documenso/lib/utils/document-audit- import { canEnvelopeItemsBeModified } from '@documenso/lib/utils/envelope'; import { prisma } from '@documenso/prisma'; +import { ZGenericSuccessResponse } from '../schema'; import { authenticatedProcedure } from '../trpc'; import { ZDeleteEnvelopeItemRequestSchema, @@ -100,4 +101,6 @@ export const deleteEnvelopeItemRoute = authenticatedProcedure }, }, }); + + return ZGenericSuccessResponse; }); diff --git a/packages/trpc/server/envelope-router/delete-envelope-item.types.ts b/packages/trpc/server/envelope-router/delete-envelope-item.types.ts index 392a88be2..7e2d5d2bb 100644 --- a/packages/trpc/server/envelope-router/delete-envelope-item.types.ts +++ b/packages/trpc/server/envelope-router/delete-envelope-item.types.ts @@ -1,5 +1,6 @@ import { z } from 'zod'; +import { ZSuccessResponseSchema } from '../schema'; import type { TrpcRouteMeta } from '../trpc'; export const deleteEnvelopeItemMeta: TrpcRouteMeta = { @@ -17,7 +18,7 @@ export const ZDeleteEnvelopeItemRequestSchema = z.object({ envelopeItemId: z.string(), }); -export const ZDeleteEnvelopeItemResponseSchema = z.void(); +export const ZDeleteEnvelopeItemResponseSchema = ZSuccessResponseSchema; export type TDeleteEnvelopeItemRequest = z.infer; export type TDeleteEnvelopeItemResponse = z.infer; diff --git a/packages/trpc/server/envelope-router/delete-envelope.ts b/packages/trpc/server/envelope-router/delete-envelope.ts index d909a7fd0..6750b4aa4 100644 --- a/packages/trpc/server/envelope-router/delete-envelope.ts +++ b/packages/trpc/server/envelope-router/delete-envelope.ts @@ -6,6 +6,7 @@ import { deleteDocument } from '@documenso/lib/server-only/document/delete-docum import { deleteTemplate } from '@documenso/lib/server-only/template/delete-template'; import { prisma } from '@documenso/prisma'; +import { ZGenericSuccessResponse } from '../schema'; import { authenticatedProcedure } from '../trpc'; import { ZDeleteEnvelopeRequestSchema, @@ -65,4 +66,6 @@ export const deleteEnvelopeRoute = authenticatedProcedure }), ) .exhaustive(); + + return ZGenericSuccessResponse; }); diff --git a/packages/trpc/server/envelope-router/delete-envelope.types.ts b/packages/trpc/server/envelope-router/delete-envelope.types.ts index 4f2b7aac8..654d24c6d 100644 --- a/packages/trpc/server/envelope-router/delete-envelope.types.ts +++ b/packages/trpc/server/envelope-router/delete-envelope.types.ts @@ -1,5 +1,6 @@ import { z } from 'zod'; +import { ZSuccessResponseSchema } from '../schema'; import type { TrpcRouteMeta } from '../trpc'; export const deleteEnvelopeMeta: TrpcRouteMeta = { @@ -15,7 +16,7 @@ export const ZDeleteEnvelopeRequestSchema = z.object({ envelopeId: z.string(), }); -export const ZDeleteEnvelopeResponseSchema = z.void(); +export const ZDeleteEnvelopeResponseSchema = ZSuccessResponseSchema; export type TDeleteEnvelopeRequest = z.infer; export type TDeleteEnvelopeResponse = z.infer; diff --git a/packages/trpc/server/envelope-router/distribute-envelope.ts b/packages/trpc/server/envelope-router/distribute-envelope.ts index 09436c2bc..8f1db3fa1 100644 --- a/packages/trpc/server/envelope-router/distribute-envelope.ts +++ b/packages/trpc/server/envelope-router/distribute-envelope.ts @@ -1,6 +1,7 @@ import { updateDocumentMeta } from '@documenso/lib/server-only/document-meta/upsert-document-meta'; import { sendDocument } from '@documenso/lib/server-only/document/send-document'; +import { ZGenericSuccessResponse } from '../schema'; import { authenticatedProcedure } from '../trpc'; import { ZDistributeEnvelopeRequestSchema, @@ -53,4 +54,6 @@ export const distributeEnvelopeRoute = authenticatedProcedure teamId, requestMetadata: ctx.metadata, }); + + return ZGenericSuccessResponse; }); diff --git a/packages/trpc/server/envelope-router/distribute-envelope.types.ts b/packages/trpc/server/envelope-router/distribute-envelope.types.ts index 9d9acab72..2f650f9bd 100644 --- a/packages/trpc/server/envelope-router/distribute-envelope.types.ts +++ b/packages/trpc/server/envelope-router/distribute-envelope.types.ts @@ -2,6 +2,7 @@ import { z } from 'zod'; import { ZDocumentMetaUpdateSchema } from '@documenso/lib/types/document-meta'; +import { ZSuccessResponseSchema } from '../schema'; import type { TrpcRouteMeta } from '../trpc'; export const distributeEnvelopeMeta: TrpcRouteMeta = { @@ -30,7 +31,7 @@ export const ZDistributeEnvelopeRequestSchema = z.object({ }).optional(), }); -export const ZDistributeEnvelopeResponseSchema = z.void(); +export const ZDistributeEnvelopeResponseSchema = ZSuccessResponseSchema; export type TDistributeEnvelopeRequest = z.infer; export type TDistributeEnvelopeResponse = z.infer; diff --git a/packages/trpc/server/envelope-router/download-envelope-item.ts b/packages/trpc/server/envelope-router/download-envelope-item.ts index 3b60c2899..0854d6a28 100644 --- a/packages/trpc/server/envelope-router/download-envelope-item.ts +++ b/packages/trpc/server/envelope-router/download-envelope-item.ts @@ -19,5 +19,6 @@ export const downloadEnvelopeItemRoute = authenticatedProcedure }, }); + // This endpoint is purely for V2 API, which is implemented in the Hono remix server. throw new Error('NOT_IMPLEMENTED'); }); diff --git a/packages/trpc/server/envelope-router/envelope-fields/create-envelope-fields.types.ts b/packages/trpc/server/envelope-router/envelope-fields/create-envelope-fields.types.ts index 1ae9dd172..128c2cceb 100644 --- a/packages/trpc/server/envelope-router/envelope-fields/create-envelope-fields.types.ts +++ b/packages/trpc/server/envelope-router/envelope-fields/create-envelope-fields.types.ts @@ -16,7 +16,6 @@ export const createEnvelopeFieldsMeta: TrpcRouteMeta = { openapi: { method: 'POST', path: '/envelope/field/create-many', - contentTypes: ['multipart/form-data'], summary: 'Create envelope fields', description: 'Create multiple fields for an envelope', tags: ['Envelope Fields'], diff --git a/packages/trpc/server/envelope-router/envelope-fields/delete-envelope-field.ts b/packages/trpc/server/envelope-router/envelope-fields/delete-envelope-field.ts index 4b4dc35d4..ea6942fb8 100644 --- a/packages/trpc/server/envelope-router/envelope-fields/delete-envelope-field.ts +++ b/packages/trpc/server/envelope-router/envelope-fields/delete-envelope-field.ts @@ -7,6 +7,7 @@ import { createDocumentAuditLogData } from '@documenso/lib/utils/document-audit- import { canRecipientFieldsBeModified } from '@documenso/lib/utils/recipients'; import { prisma } from '@documenso/prisma'; +import { ZGenericSuccessResponse } from '../../schema'; import { authenticatedProcedure } from '../../trpc'; import { ZDeleteEnvelopeFieldRequestSchema, @@ -115,4 +116,6 @@ export const deleteEnvelopeFieldRoute = authenticatedProcedure return deletedField; }); + + return ZGenericSuccessResponse; }); diff --git a/packages/trpc/server/envelope-router/envelope-fields/delete-envelope-field.types.ts b/packages/trpc/server/envelope-router/envelope-fields/delete-envelope-field.types.ts index b4de27118..d5f27d4da 100644 --- a/packages/trpc/server/envelope-router/envelope-fields/delete-envelope-field.types.ts +++ b/packages/trpc/server/envelope-router/envelope-fields/delete-envelope-field.types.ts @@ -1,5 +1,6 @@ import { z } from 'zod'; +import { ZSuccessResponseSchema } from '../../schema'; import type { TrpcRouteMeta } from '../../trpc'; export const deleteEnvelopeFieldMeta: TrpcRouteMeta = { @@ -16,7 +17,7 @@ export const ZDeleteEnvelopeFieldRequestSchema = z.object({ fieldId: z.number(), }); -export const ZDeleteEnvelopeFieldResponseSchema = z.void(); +export const ZDeleteEnvelopeFieldResponseSchema = ZSuccessResponseSchema; export type TDeleteEnvelopeFieldRequest = z.infer; export type TDeleteEnvelopeFieldResponse = z.infer; diff --git a/packages/trpc/server/envelope-router/envelope-recipients/delete-envelope-recipient.ts b/packages/trpc/server/envelope-router/envelope-recipients/delete-envelope-recipient.ts index a6c63cd65..bbdf8c1a2 100644 --- a/packages/trpc/server/envelope-router/envelope-recipients/delete-envelope-recipient.ts +++ b/packages/trpc/server/envelope-router/envelope-recipients/delete-envelope-recipient.ts @@ -1,5 +1,6 @@ import { deleteEnvelopeRecipient } from '@documenso/lib/server-only/recipient/delete-envelope-recipient'; +import { ZGenericSuccessResponse } from '../../schema'; import { authenticatedProcedure } from '../../trpc'; import { ZDeleteEnvelopeRecipientRequestSchema, @@ -27,4 +28,6 @@ export const deleteEnvelopeRecipientRoute = authenticatedProcedure recipientId, requestMetadata: metadata, }); + + return ZGenericSuccessResponse; }); diff --git a/packages/trpc/server/envelope-router/envelope-recipients/delete-envelope-recipient.types.ts b/packages/trpc/server/envelope-router/envelope-recipients/delete-envelope-recipient.types.ts index f82609cd2..a376913e9 100644 --- a/packages/trpc/server/envelope-router/envelope-recipients/delete-envelope-recipient.types.ts +++ b/packages/trpc/server/envelope-router/envelope-recipients/delete-envelope-recipient.types.ts @@ -1,5 +1,6 @@ import { z } from 'zod'; +import { ZSuccessResponseSchema } from '../../schema'; import type { TrpcRouteMeta } from '../../trpc'; export const deleteEnvelopeRecipientMeta: TrpcRouteMeta = { @@ -16,7 +17,7 @@ export const ZDeleteEnvelopeRecipientRequestSchema = z.object({ recipientId: z.number(), }); -export const ZDeleteEnvelopeRecipientResponseSchema = z.void(); +export const ZDeleteEnvelopeRecipientResponseSchema = ZSuccessResponseSchema; export type TDeleteEnvelopeRecipientRequest = z.infer; export type TDeleteEnvelopeRecipientResponse = z.infer< diff --git a/packages/trpc/server/envelope-router/redistribute-envelope.ts b/packages/trpc/server/envelope-router/redistribute-envelope.ts index b38d8a26d..1fc41194a 100644 --- a/packages/trpc/server/envelope-router/redistribute-envelope.ts +++ b/packages/trpc/server/envelope-router/redistribute-envelope.ts @@ -1,5 +1,6 @@ import { resendDocument } from '@documenso/lib/server-only/document/resend-document'; +import { ZGenericSuccessResponse } from '../schema'; import { authenticatedProcedure } from '../trpc'; import { ZRedistributeEnvelopeRequestSchema, @@ -32,4 +33,6 @@ export const redistributeEnvelopeRoute = authenticatedProcedure recipients, requestMetadata: ctx.metadata, }); + + return ZGenericSuccessResponse; }); diff --git a/packages/trpc/server/envelope-router/redistribute-envelope.types.ts b/packages/trpc/server/envelope-router/redistribute-envelope.types.ts index a9e499474..94e63b237 100644 --- a/packages/trpc/server/envelope-router/redistribute-envelope.types.ts +++ b/packages/trpc/server/envelope-router/redistribute-envelope.types.ts @@ -1,5 +1,6 @@ import { z } from 'zod'; +import { ZSuccessResponseSchema } from '../schema'; import type { TrpcRouteMeta } from '../trpc'; export const redistributeEnvelopeMeta: TrpcRouteMeta = { @@ -21,7 +22,7 @@ export const ZRedistributeEnvelopeRequestSchema = z.object({ .describe('The IDs of the recipients to redistribute the envelope to.'), }); -export const ZRedistributeEnvelopeResponseSchema = z.void(); +export const ZRedistributeEnvelopeResponseSchema = ZSuccessResponseSchema; export type TRedistributeEnvelopeRequest = z.infer; export type TRedistributeEnvelopeResponse = z.infer; diff --git a/packages/trpc/server/envelope-router/router.ts b/packages/trpc/server/envelope-router/router.ts index 0e93520b3..c4662c2ab 100644 --- a/packages/trpc/server/envelope-router/router.ts +++ b/packages/trpc/server/envelope-router/router.ts @@ -8,6 +8,7 @@ import { createEnvelopeItemsRoute } from './create-envelope-items'; import { deleteEnvelopeRoute } from './delete-envelope'; import { deleteEnvelopeItemRoute } from './delete-envelope-item'; import { distributeEnvelopeRoute } from './distribute-envelope'; +import { downloadEnvelopeItemRoute } from './download-envelope-item'; import { duplicateEnvelopeRoute } from './duplicate-envelope'; import { createEnvelopeFieldsRoute } from './envelope-fields/create-envelope-fields'; import { deleteEnvelopeFieldRoute } from './envelope-fields/delete-envelope-field'; @@ -46,6 +47,7 @@ export const envelopeRouter = router({ createMany: createEnvelopeItemsRoute, updateMany: updateEnvelopeItemsRoute, delete: deleteEnvelopeItemRoute, + download: downloadEnvelopeItemRoute, }, recipient: { get: getEnvelopeRecipientRoute, diff --git a/packages/trpc/server/field-router/router.ts b/packages/trpc/server/field-router/router.ts index 92efab7fa..de437d12f 100644 --- a/packages/trpc/server/field-router/router.ts +++ b/packages/trpc/server/field-router/router.ts @@ -10,7 +10,7 @@ import { setFieldsForTemplate } from '@documenso/lib/server-only/field/set-field import { signFieldWithToken } from '@documenso/lib/server-only/field/sign-field-with-token'; import { updateEnvelopeFields } from '@documenso/lib/server-only/field/update-envelope-fields'; -import { ZGenericSuccessResponse, ZSuccessResponseSchema } from '../document-router/schema'; +import { ZGenericSuccessResponse, ZSuccessResponseSchema } from '../schema'; import { authenticatedProcedure, procedure, router } from '../trpc'; import { ZCreateDocumentFieldRequestSchema, diff --git a/packages/trpc/server/folder-router/router.ts b/packages/trpc/server/folder-router/router.ts index fa9a7e2e2..755b23452 100644 --- a/packages/trpc/server/folder-router/router.ts +++ b/packages/trpc/server/folder-router/router.ts @@ -7,6 +7,7 @@ import { getFolderBreadcrumbs } from '@documenso/lib/server-only/folder/get-fold import { getFolderById } from '@documenso/lib/server-only/folder/get-folder-by-id'; import { updateFolder } from '@documenso/lib/server-only/folder/update-folder'; +import { ZGenericSuccessResponse, ZSuccessResponseSchema } from '../schema'; import { authenticatedProcedure, router } from '../trpc'; import { ZCreateFolderRequestSchema, @@ -16,10 +17,8 @@ import { ZFindFoldersInternalResponseSchema, ZFindFoldersRequestSchema, ZFindFoldersResponseSchema, - ZGenericSuccessResponse, ZGetFoldersResponseSchema, ZGetFoldersSchema, - ZSuccessResponseSchema, ZUpdateFolderRequestSchema, ZUpdateFolderResponseSchema, } from './schema'; diff --git a/packages/trpc/server/folder-router/schema.ts b/packages/trpc/server/folder-router/schema.ts index 8873add30..cac57d082 100644 --- a/packages/trpc/server/folder-router/schema.ts +++ b/packages/trpc/server/folder-router/schema.ts @@ -5,19 +5,6 @@ import { ZFindResultResponse, ZFindSearchParamsSchema } from '@documenso/lib/typ import { DocumentVisibility } from '@documenso/prisma/generated/types'; import FolderSchema from '@documenso/prisma/generated/zod/modelSchema/FolderSchema'; -/** - * 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.boolean(), -}); - -export const ZGenericSuccessResponse = { - success: true, -} satisfies z.infer; - export const ZFolderSchema = FolderSchema.pick({ id: true, name: true, diff --git a/packages/trpc/server/recipient-router/router.ts b/packages/trpc/server/recipient-router/router.ts index e80189207..9996d62ba 100644 --- a/packages/trpc/server/recipient-router/router.ts +++ b/packages/trpc/server/recipient-router/router.ts @@ -9,7 +9,7 @@ import { setDocumentRecipients } from '@documenso/lib/server-only/recipient/set- import { setTemplateRecipients } from '@documenso/lib/server-only/recipient/set-template-recipients'; import { updateEnvelopeRecipients } from '@documenso/lib/server-only/recipient/update-envelope-recipients'; -import { ZGenericSuccessResponse, ZSuccessResponseSchema } from '../document-router/schema'; +import { ZGenericSuccessResponse, ZSuccessResponseSchema } from '../schema'; import { authenticatedProcedure, procedure, router } from '../trpc'; import { findRecipientSuggestionsRoute } from './find-recipient-suggestions'; import { diff --git a/packages/trpc/server/schema.ts b/packages/trpc/server/schema.ts new file mode 100644 index 000000000..4af04740e --- /dev/null +++ b/packages/trpc/server/schema.ts @@ -0,0 +1,14 @@ +import { z } from 'zod'; + +/** + * 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.boolean(), +}); + +export const ZGenericSuccessResponse = { + success: true, +} satisfies z.infer; diff --git a/packages/trpc/server/template-router/router.ts b/packages/trpc/server/template-router/router.ts index 4c1e62d15..44a66a349 100644 --- a/packages/trpc/server/template-router/router.ts +++ b/packages/trpc/server/template-router/router.ts @@ -28,7 +28,7 @@ import { mapFieldToLegacyField } from '@documenso/lib/utils/fields'; import { mapRecipientToLegacyRecipient } from '@documenso/lib/utils/recipients'; import { mapEnvelopeToTemplateLite } from '@documenso/lib/utils/templates'; -import { ZGenericSuccessResponse, ZSuccessResponseSchema } from '../document-router/schema'; +import { ZGenericSuccessResponse, ZSuccessResponseSchema } from '../schema'; import { authenticatedProcedure, maybeAuthenticatedProcedure, router } from '../trpc'; import { ZBulkSendTemplateMutationSchema, @@ -177,7 +177,19 @@ export const templateRouter = router({ const { payload, file } = input; - const { title, folderId } = payload; + const { + title, + folderId, + externalId, + visibility, + globalAccessAuth, + globalActionAuth, + publicTitle, + publicDescription, + type, + meta, + attachments, + } = payload; const { id: templateDocumentDataId } = await putNormalizedPdfFileServerSide(file); @@ -194,13 +206,22 @@ export const templateRouter = router({ data: { type: EnvelopeType.TEMPLATE, title, - folderId, envelopeItems: [ { documentDataId: templateDocumentDataId, }, ], + folderId, + externalId: externalId ?? undefined, + visibility, + globalAccessAuth, + globalActionAuth, + templateType: type, + publicTitle, + publicDescription, }, + meta, + attachments, requestMetadata: ctx.metadata, }); diff --git a/packages/trpc/server/template-router/schema.ts b/packages/trpc/server/template-router/schema.ts index 60b56ff3d..b6f4c32de 100644 --- a/packages/trpc/server/template-router/schema.ts +++ b/packages/trpc/server/template-router/schema.ts @@ -79,16 +79,6 @@ export const ZTemplateMetaUpsertSchema = z.object({ allowDictateNextSigner: z.boolean().optional(), }); -export const ZCreateTemplatePayloadSchema = z.object({ - title: z.string().min(1).trim(), - folderId: z.string().optional(), -}); - -export const ZCreateTemplateMutationSchema = zodFormData({ - payload: zfd.json(ZCreateTemplatePayloadSchema), - file: zfd.file(), -}); - export const ZCreateDocumentFromDirectTemplateRequestSchema = z.object({ directRecipientName: z.string().max(255).optional(), directRecipientEmail: z.string().email().max(254), @@ -234,6 +224,13 @@ export const ZCreateTemplateResponseSchema = z.object({ id: z.number(), }); +export const ZCreateTemplatePayloadSchema = ZCreateTemplateV2RequestSchema; + +export const ZCreateTemplateMutationSchema = zodFormData({ + payload: zfd.json(ZCreateTemplatePayloadSchema), + file: zfd.file(), +}); + export const ZUpdateTemplateRequestSchema = z.object({ templateId: z.number(), data: z @@ -280,7 +277,7 @@ export const ZBulkSendTemplateMutationSchema = z.object({ sendImmediately: z.boolean(), }); -export type TCreateTemplatePayloadSchema = z.infer; +export type TCreateTemplatePayloadSchema = z.input; export type TCreateTemplateMutationSchema = z.infer; export type TDuplicateTemplateMutationSchema = z.infer; export type TDeleteTemplateMutationSchema = z.infer; diff --git a/packages/trpc/utils/openapi-fetch-handler.ts b/packages/trpc/utils/openapi-fetch-handler.ts index c597a45cd..f352903a7 100644 --- a/packages/trpc/utils/openapi-fetch-handler.ts +++ b/packages/trpc/utils/openapi-fetch-handler.ts @@ -24,11 +24,17 @@ const getMultipartBody = async (req: Request) => { const data: Record = {}; - for (const key of formData.keys()) { - const values = formData.getAll(key); + for (const [key, value] of formData.entries()) { + // !: Handles cases where our generated SDKs send key[] syntax for arrays. + const normalizedKey = key.endsWith('[]') ? key.slice(0, -2) : key; - // Return array for multiple values, single value otherwise (matches URL-encoded behavior) - data[key] = values.length > 1 ? values : values[0]; + if (data[normalizedKey] === undefined) { + data[normalizedKey] = value; + } else if (Array.isArray(data[normalizedKey])) { + data[normalizedKey].push(value); + } else { + data[normalizedKey] = [data[normalizedKey], value]; + } } return data;