diff --git a/packages/lib/server-only/envelope/duplicate-envelope.ts b/packages/lib/server-only/envelope/duplicate-envelope.ts index c83bc85a2..9dd528468 100644 --- a/packages/lib/server-only/envelope/duplicate-envelope.ts +++ b/packages/lib/server-only/envelope/duplicate-envelope.ts @@ -1,4 +1,5 @@ import { DocumentSource, EnvelopeType, WebhookTriggerEvents } from '@prisma/client'; +import pMap from 'p-map'; import { omit } from 'remeda'; import { prisma } from '@documenso/prisma'; @@ -68,23 +69,23 @@ export const duplicateEnvelope = async ({ id, userId, teamId }: DuplicateEnvelop }); } - const { legacyNumberId, secondaryId } = + const [{ legacyNumberId, secondaryId }, createdDocumentMeta] = await Promise.all([ envelope.type === EnvelopeType.DOCUMENT - ? await incrementDocumentId().then(({ documentId, formattedDocumentId }) => ({ + ? incrementDocumentId().then(({ documentId, formattedDocumentId }) => ({ legacyNumberId: documentId, secondaryId: formattedDocumentId, })) - : await incrementTemplateId().then(({ templateId, formattedTemplateId }) => ({ + : incrementTemplateId().then(({ templateId, formattedTemplateId }) => ({ legacyNumberId: templateId, secondaryId: formattedTemplateId, - })); - - const createdDocumentMeta = await prisma.documentMeta.create({ - data: { - ...omit(envelope.documentMeta, ['id']), - emailSettings: envelope.documentMeta.emailSettings || undefined, - }, - }); + })), + prisma.documentMeta.create({ + data: { + ...omit(envelope.documentMeta, ['id']), + emailSettings: envelope.documentMeta.emailSettings || undefined, + }, + }), + ]); const duplicatedEnvelope = await prisma.envelope.create({ data: { @@ -136,35 +137,38 @@ export const duplicateEnvelope = async ({ id, userId, teamId }: DuplicateEnvelop }), ); - for (const recipient of envelope.recipients) { - await prisma.recipient.create({ - data: { - envelopeId: duplicatedEnvelope.id, - email: recipient.email, - name: recipient.name, - role: recipient.role, - signingOrder: recipient.signingOrder, - token: nanoid(), - fields: { - createMany: { - data: recipient.fields.map((field) => ({ - envelopeId: duplicatedEnvelope.id, - envelopeItemId: oldEnvelopeItemToNewEnvelopeItemIdMap[field.envelopeItemId], - type: field.type, - page: field.page, - positionX: field.positionX, - positionY: field.positionY, - width: field.width, - height: field.height, - customText: '', - inserted: false, - fieldMeta: field.fieldMeta as PrismaJson.FieldMeta, - })), + await pMap( + envelope.recipients, + (recipient) => + prisma.recipient.create({ + data: { + envelopeId: duplicatedEnvelope.id, + email: recipient.email, + name: recipient.name, + role: recipient.role, + signingOrder: recipient.signingOrder, + token: nanoid(), + fields: { + createMany: { + data: recipient.fields.map((field) => ({ + envelopeId: duplicatedEnvelope.id, + envelopeItemId: oldEnvelopeItemToNewEnvelopeItemIdMap[field.envelopeItemId], + type: field.type, + page: field.page, + positionX: field.positionX, + positionY: field.positionY, + width: field.width, + height: field.height, + customText: '', + inserted: false, + fieldMeta: field.fieldMeta as PrismaJson.FieldMeta, + })), + }, }, }, - }, - }); - } + }), + { concurrency: 5 }, + ); if (duplicatedEnvelope.type === EnvelopeType.DOCUMENT) { const refetchedEnvelope = await prisma.envelope.findFirstOrThrow({