Files
documenso/packages/trpc/server/envelope-router/set-envelope-fields.ts
David Nguyen 7f09ba72f4 feat: add envelopes (#2025)
This PR is handles the changes required to support envelopes. The new
envelope editor/signing page will be hidden during release.

The core changes here is to migrate the documents and templates model to
a centralized envelopes model.

Even though Documents and Templates are removed, from the user
perspective they will still exist as we remap envelopes to documents and
templates.
2025-10-14 21:56:36 +11:00

67 lines
1.9 KiB
TypeScript

import { EnvelopeType } from '@prisma/client';
import { match } from 'ts-pattern';
import { setFieldsForDocument } from '@documenso/lib/server-only/field/set-fields-for-document';
import { setFieldsForTemplate } from '@documenso/lib/server-only/field/set-fields-for-template';
import { authenticatedProcedure } from '../trpc';
import {
ZSetEnvelopeFieldsRequestSchema,
ZSetEnvelopeFieldsResponseSchema,
} from './set-envelope-fields.types';
// Note: This is intended to always be an internal route.
export const setEnvelopeFieldsRoute = authenticatedProcedure
.input(ZSetEnvelopeFieldsRequestSchema)
.output(ZSetEnvelopeFieldsResponseSchema)
.mutation(async ({ input, ctx }) => {
const { teamId } = ctx;
const { envelopeId, envelopeType, fields } = input;
ctx.logger.info({
input: {
envelopeId,
},
});
await match(envelopeType)
.with(EnvelopeType.DOCUMENT, async () =>
setFieldsForDocument({
userId: ctx.user.id,
teamId,
id: {
type: 'envelopeId',
id: envelopeId,
},
fields: fields.map((field) => ({
...field,
pageNumber: field.page,
pageX: field.positionX,
pageY: field.positionY,
pageWidth: field.width,
pageHeight: field.height,
})),
requestMetadata: ctx.metadata,
}),
)
.with(EnvelopeType.TEMPLATE, async () =>
setFieldsForTemplate({
userId: ctx.user.id,
teamId,
id: {
type: 'envelopeId',
id: envelopeId,
},
fields: fields.map((field) => ({
...field,
pageNumber: field.page,
pageX: field.positionX,
pageY: field.positionY,
pageWidth: field.width,
pageHeight: field.height,
})),
}),
)
.exhaustive();
});