diff --git a/packages/lib/server-only/envelope/create-envelope.ts b/packages/lib/server-only/envelope/create-envelope.ts index 210346b4d..bc7d4da15 100644 --- a/packages/lib/server-only/envelope/create-envelope.ts +++ b/packages/lib/server-only/envelope/create-envelope.ts @@ -11,6 +11,7 @@ import { import { AppError, AppErrorCode } from '@documenso/lib/errors/app-error'; import { normalizePdf as makeNormalizedPdf } from '@documenso/lib/server-only/pdf/normalize-pdf'; +import { ZDefaultRecipientsSchema } from '@documenso/lib/types/default-recipients'; import { DOCUMENT_AUDIT_LOG_TYPE } from '@documenso/lib/types/document-audit-logs'; import type { ApiRequestMetadata } from '@documenso/lib/universal/extract-request-metadata'; import { nanoid, prefixedId } from '@documenso/lib/universal/id'; @@ -306,8 +307,22 @@ export const createEnvelope = async ({ const firstEnvelopeItem = envelope.envelopeItems[0]; + const defaultRecipients = settings.defaultRecipients + ? ZDefaultRecipientsSchema.parse(settings.defaultRecipients) + : []; + + const mappedDefaultRecipients: CreateEnvelopeRecipientOptions[] = defaultRecipients.map( + (recipient) => ({ + email: recipient.email, + name: recipient.name, + role: recipient.role, + }), + ); + + const allRecipients = [...(data.recipients || []), ...mappedDefaultRecipients]; + await Promise.all( - (data.recipients || []).map(async (recipient) => { + allRecipients.map(async (recipient) => { const recipientAuthOptions = createRecipientAuthOptions({ accessAuth: recipient.accessAuth ?? [], actionAuth: recipient.actionAuth ?? [], diff --git a/packages/lib/server-only/template/create-document-from-template.ts b/packages/lib/server-only/template/create-document-from-template.ts index daf04f1e5..bea4ea690 100644 --- a/packages/lib/server-only/template/create-document-from-template.ts +++ b/packages/lib/server-only/template/create-document-from-template.ts @@ -19,6 +19,7 @@ import { prisma } from '@documenso/prisma'; import { DEFAULT_DOCUMENT_DATE_FORMAT } from '../../constants/date-formats'; import type { SupportedLanguageCodes } from '../../constants/i18n'; import { AppError, AppErrorCode } from '../../errors/app-error'; +import { ZDefaultRecipientsSchema } from '../../types/default-recipients'; import { DOCUMENT_AUDIT_LOG_TYPE } from '../../types/document-audit-logs'; import { ZRecipientAuthOptionsSchema } from '../../types/document-auth'; import type { TDocumentEmailSettings } from '../../types/document-email'; @@ -396,6 +397,30 @@ export const createDocumentFromTemplate = async ({ }; }); + const defaultRecipients = settings.defaultRecipients + ? ZDefaultRecipientsSchema.parse(settings.defaultRecipients) + : []; + + const defaultRecipientsFinal: FinalRecipient[] = defaultRecipients.map((recipient) => { + const authOptions = ZRecipientAuthOptionsSchema.parse({}); + + return { + templateRecipientId: -1, + fields: [], + name: recipient.name || recipient.email, + email: recipient.email, + role: recipient.role, + signingOrder: null, + authOptions: createRecipientAuthOptions({ + accessAuth: authOptions.accessAuth, + actionAuth: authOptions.actionAuth, + }), + token: nanoid(), + }; + }); + + const allFinalRecipients = [...finalRecipients, ...defaultRecipientsFinal]; + // Key = original envelope item ID // Value = duplicated envelope item ID. const oldEnvelopeItemToNewEnvelopeItemIdMap: Record = {}; @@ -515,7 +540,7 @@ export const createDocumentFromTemplate = async ({ documentMetaId: documentMeta.id, recipients: { createMany: { - data: finalRecipients.map((recipient) => { + data: allFinalRecipients.map((recipient) => { const authOptions = ZRecipientAuthOptionsSchema.parse(recipient?.authOptions); return { @@ -596,7 +621,7 @@ export const createDocumentFromTemplate = async ({ } } - Object.values(finalRecipients).forEach(({ token, fields }) => { + Object.values(allFinalRecipients).forEach(({ token, fields }) => { const recipient = envelope.recipients.find((recipient) => recipient.token === token); if (!recipient) { diff --git a/packages/lib/types/default-recipients.ts b/packages/lib/types/default-recipients.ts new file mode 100644 index 000000000..1845d6a24 --- /dev/null +++ b/packages/lib/types/default-recipients.ts @@ -0,0 +1,12 @@ +import { RecipientRole } from '@prisma/client'; +import { z } from 'zod'; + +export const ZDefaultRecipientSchema = z.object({ + email: z.string().email(), + name: z.string(), + role: z.nativeEnum(RecipientRole), +}); + +export const ZDefaultRecipientsSchema = z.array(ZDefaultRecipientSchema); + +export type TDefaultRecipients = z.infer; diff --git a/packages/lib/utils/organisations.ts b/packages/lib/utils/organisations.ts index 01bcc490d..eab3c7d8a 100644 --- a/packages/lib/utils/organisations.ts +++ b/packages/lib/utils/organisations.ts @@ -135,5 +135,7 @@ export const generateDefaultOrganisationSettings = (): Omit< emailReplyTo: null, // emailReplyToName: null, emailDocumentSettings: DEFAULT_DOCUMENT_EMAIL_SETTINGS, + + defaultRecipients: null, }; }; diff --git a/packages/lib/utils/teams.ts b/packages/lib/utils/teams.ts index 867f8ef93..d9acb8aab 100644 --- a/packages/lib/utils/teams.ts +++ b/packages/lib/utils/teams.ts @@ -202,6 +202,8 @@ export const generateDefaultTeamSettings = (): Omit