feat: add ability to save documents as template (#2661)

This commit is contained in:
David Nguyen
2026-04-01 16:03:26 +11:00
committed by GitHub
parent 74d79dc6b2
commit e3b7a9e7cb
12 changed files with 851 additions and 43 deletions
@@ -29,6 +29,7 @@ import { getEnvelopeItemsByTokenRoute } from './get-envelope-items-by-token';
import { getEnvelopesByIdsRoute } from './get-envelopes-by-ids';
import { redistributeEnvelopeRoute } from './redistribute-envelope';
import { replaceEnvelopeItemPdfRoute } from './replace-envelope-item-pdf';
import { saveAsTemplateRoute } from './save-as-template';
import { setEnvelopeFieldsRoute } from './set-envelope-fields';
import { setEnvelopeRecipientsRoute } from './set-envelope-recipients';
import { signEnvelopeFieldRoute } from './sign-envelope-field';
@@ -91,6 +92,7 @@ export const envelopeRouter = router({
update: updateEnvelopeRoute,
delete: deleteEnvelopeRoute,
duplicate: duplicateEnvelopeRoute,
saveAsTemplate: saveAsTemplateRoute,
distribute: distributeEnvelopeRoute,
redistribute: redistributeEnvelopeRoute,
signingStatus: signingStatusEnvelopeRoute,
@@ -0,0 +1,39 @@
import { duplicateEnvelope } from '@documenso/lib/server-only/envelope/duplicate-envelope';
import { authenticatedProcedure } from '../trpc';
import {
ZSaveAsTemplateRequestSchema,
ZSaveAsTemplateResponseSchema,
} from './save-as-template.types';
export const saveAsTemplateRoute = authenticatedProcedure
.input(ZSaveAsTemplateRequestSchema)
.output(ZSaveAsTemplateResponseSchema)
.mutation(async ({ input, ctx }) => {
const { envelopeId, includeRecipients, includeFields } = input;
const { teamId } = ctx;
ctx.logger.info({
input: {
envelopeId,
},
});
const result = await duplicateEnvelope({
userId: ctx.user.id,
teamId,
id: {
type: 'envelopeId',
id: envelopeId,
},
overrides: {
duplicateAsTemplate: true,
includeRecipients,
includeFields,
},
});
return {
id: result.id,
};
});
@@ -0,0 +1,14 @@
import { z } from 'zod';
export const ZSaveAsTemplateRequestSchema = z.object({
envelopeId: z.string().min(1).describe('The ID of the envelope to save as a template.'),
includeRecipients: z.boolean(),
includeFields: z.boolean(),
});
export const ZSaveAsTemplateResponseSchema = z.object({
id: z.string().describe('The ID of the newly created template envelope.'),
});
export type TSaveAsTemplateRequest = z.infer<typeof ZSaveAsTemplateRequestSchema>;
export type TSaveAsTemplateResponse = z.infer<typeof ZSaveAsTemplateResponseSchema>;