diff --git a/packages/api/v1/schema.ts b/packages/api/v1/schema.ts index c7ec8f5f8..c7411e68d 100644 --- a/packages/api/v1/schema.ts +++ b/packages/api/v1/schema.ts @@ -259,24 +259,14 @@ export type TCreateDocumentFromTemplateMutationResponseSchema = z.infer< export const ZGenerateDocumentFromTemplateMutationSchema = z.object({ title: z.string().optional(), externalId: z.string().optional(), - recipients: z - .array( - z.object({ - id: z.number(), - email: z.string().email(), - name: z.string().optional(), - signingOrder: z.number().optional(), - }), - ) - .refine( - (schema) => { - const emails = schema.map((signer) => signer.email.toLowerCase()); - const ids = schema.map((signer) => signer.id); - - return new Set(emails).size === emails.length && new Set(ids).size === ids.length; - }, - { message: 'Recipient IDs and emails must be unique' }, - ), + recipients: z.array( + z.object({ + id: z.number(), + email: z.string().email(), + name: z.string().optional(), + signingOrder: z.number().optional(), + }), + ), meta: z .object({ subject: z.string(), diff --git a/packages/trpc/server/document-router/schema.ts b/packages/trpc/server/document-router/schema.ts index 887bc48e2..6d9a18675 100644 --- a/packages/trpc/server/document-router/schema.ts +++ b/packages/trpc/server/document-router/schema.ts @@ -192,14 +192,6 @@ export const ZCreateDocumentV2RequestSchema = z.object({ .optional(), }), ) - .refine( - (recipients) => { - const emails = recipients.map((recipient) => recipient.email); - - return new Set(emails).size === emails.length; - }, - { message: 'Recipients must have unique emails' }, - ) .optional(), meta: z .object({ diff --git a/packages/trpc/server/recipient-router/schema.ts b/packages/trpc/server/recipient-router/schema.ts index bbad7981d..a004d217b 100644 --- a/packages/trpc/server/recipient-router/schema.ts +++ b/packages/trpc/server/recipient-router/schema.ts @@ -49,16 +49,7 @@ export const ZCreateDocumentRecipientResponseSchema = ZRecipientLiteSchema; export const ZCreateDocumentRecipientsRequestSchema = z.object({ documentId: z.number(), - recipients: z.array(ZCreateRecipientSchema).refine( - (recipients) => { - const emails = recipients.map((recipient) => recipient.email.toLowerCase()); - - return new Set(emails).size === emails.length; - }, - { - message: 'Recipients must have unique emails', - }, - ), + recipients: z.array(ZCreateRecipientSchema), }); export const ZCreateDocumentRecipientsResponseSchema = z.object({ @@ -74,18 +65,7 @@ export const ZUpdateDocumentRecipientResponseSchema = ZRecipientSchema; export const ZUpdateDocumentRecipientsRequestSchema = z.object({ documentId: z.number(), - recipients: z.array(ZUpdateRecipientSchema).refine( - (recipients) => { - const emails = recipients - .filter((recipient) => recipient.email !== undefined) - .map((recipient) => recipient.email?.toLowerCase()); - - return new Set(emails).size === emails.length; - }, - { - message: 'Recipients must have unique emails', - }, - ), + recipients: z.array(ZUpdateRecipientSchema), }); export const ZUpdateDocumentRecipientsResponseSchema = z.object({ @@ -123,16 +103,7 @@ export const ZCreateTemplateRecipientResponseSchema = ZRecipientLiteSchema; export const ZCreateTemplateRecipientsRequestSchema = z.object({ templateId: z.number(), - recipients: z.array(ZCreateRecipientSchema).refine( - (recipients) => { - const emails = recipients.map((recipient) => recipient.email); - - return new Set(emails).size === emails.length; - }, - { - message: 'Recipients must have unique emails', - }, - ), + recipients: z.array(ZCreateRecipientSchema), }); export const ZCreateTemplateRecipientsResponseSchema = z.object({ @@ -148,18 +119,7 @@ export const ZUpdateTemplateRecipientResponseSchema = ZRecipientSchema; export const ZUpdateTemplateRecipientsRequestSchema = z.object({ templateId: z.number(), - recipients: z.array(ZUpdateRecipientSchema).refine( - (recipients) => { - const emails = recipients - .filter((recipient) => recipient.email !== undefined) - .map((recipient) => recipient.email); - - return new Set(emails).size === emails.length; - }, - { - message: 'Recipients must have unique emails', - }, - ), + recipients: z.array(ZUpdateRecipientSchema), }); export const ZUpdateTemplateRecipientsResponseSchema = z.object({ @@ -170,29 +130,19 @@ export const ZDeleteTemplateRecipientRequestSchema = z.object({ recipientId: z.number(), }); -export const ZSetTemplateRecipientsRequestSchema = z - .object({ - templateId: z.number(), - recipients: z.array( - z.object({ - nativeId: z.number().optional(), - email: z.string().toLowerCase().email().min(1), - name: z.string(), - role: z.nativeEnum(RecipientRole), - signingOrder: z.number().optional(), - actionAuth: ZRecipientActionAuthTypesSchema.optional().nullable(), - }), - ), - }) - .refine( - (schema) => { - const emails = schema.recipients.map((recipient) => recipient.email); - - return new Set(emails).size === emails.length; - }, - // Dirty hack to handle errors when .root is populated for an array type - { message: 'Recipients must have unique emails', path: ['recipients__root'] }, - ); +export const ZSetTemplateRecipientsRequestSchema = z.object({ + templateId: z.number(), + recipients: z.array( + z.object({ + nativeId: z.number().optional(), + email: z.string().toLowerCase().email().min(1), + name: z.string(), + role: z.nativeEnum(RecipientRole), + signingOrder: z.number().optional(), + actionAuth: ZRecipientActionAuthTypesSchema.optional().nullable(), + }), + ), +}); export const ZSetTemplateRecipientsResponseSchema = z.object({ recipients: ZRecipientLiteSchema.array(), diff --git a/packages/trpc/server/template-router/schema.ts b/packages/trpc/server/template-router/schema.ts index ee07946ee..670a39bcb 100644 --- a/packages/trpc/server/template-router/schema.ts +++ b/packages/trpc/server/template-router/schema.ts @@ -51,12 +51,7 @@ export const ZCreateDocumentFromTemplateRequestSchema = z.object({ name: z.string().optional(), }), ) - .describe('The information of the recipients to create the document with.') - .refine((recipients) => { - const emails = recipients.map((signer) => signer.email); - - return new Set(emails).size === emails.length; - }, 'Recipients must have unique emails'), + .describe('The information of the recipients to create the document with.'), distributeDocument: z .boolean() .describe('Whether to create the document as pending and distribute it to recipients.') diff --git a/packages/ui/primitives/document-flow/types.ts b/packages/ui/primitives/document-flow/types.ts index 613fe0403..368fb6e91 100644 --- a/packages/ui/primitives/document-flow/types.ts +++ b/packages/ui/primitives/document-flow/types.ts @@ -8,19 +8,14 @@ import { FieldType } from '@documenso/prisma/client'; export const ZDocumentFlowFormSchema = z.object({ title: z.string().min(1), - signers: z - .array( - z.object({ - formId: z.string().min(1), - nativeId: z.number().optional(), - email: z.string().min(1).email(), - name: z.string(), - }), - ) - .refine((signers) => { - const emails = signers.map((signer) => signer.email); - return new Set(emails).size === emails.length; - }, 'Signers must have unique emails'), + signers: z.array( + z.object({ + formId: z.string().min(1), + nativeId: z.number().optional(), + email: z.string().min(1).email(), + name: z.string(), + }), + ), fields: z.array( z.object({ diff --git a/packages/ui/primitives/template-flow/add-template-placeholder-recipients.types.ts b/packages/ui/primitives/template-flow/add-template-placeholder-recipients.types.ts index 31c90076f..a0e665092 100644 --- a/packages/ui/primitives/template-flow/add-template-placeholder-recipients.types.ts +++ b/packages/ui/primitives/template-flow/add-template-placeholder-recipients.types.ts @@ -5,32 +5,20 @@ import { DocumentSigningOrder, RecipientRole } from '@documenso/prisma/client'; import { ZMapNegativeOneToUndefinedSchema } from '../document-flow/add-settings.types'; -export const ZAddTemplatePlacholderRecipientsFormSchema = z - .object({ - signers: z.array( - z.object({ - formId: z.string().min(1), - nativeId: z.number().optional(), - email: z.string().min(1).email(), - name: z.string(), - role: z.nativeEnum(RecipientRole), - signingOrder: z.number().optional(), - actionAuth: ZMapNegativeOneToUndefinedSchema.pipe( - ZRecipientActionAuthTypesSchema.optional(), - ), - }), - ), - signingOrder: z.nativeEnum(DocumentSigningOrder), - }) - .refine( - (schema) => { - const emails = schema.signers.map((signer) => signer.email.toLowerCase()); - - return new Set(emails).size === emails.length; - }, - // Dirty hack to handle errors when .root is populated for an array type - { message: 'Signers must have unique emails', path: ['signers__root'] }, - ); +export const ZAddTemplatePlacholderRecipientsFormSchema = z.object({ + signers: z.array( + z.object({ + formId: z.string().min(1), + nativeId: z.number().optional(), + email: z.string().min(1).email(), + name: z.string(), + role: z.nativeEnum(RecipientRole), + signingOrder: z.number().optional(), + actionAuth: ZMapNegativeOneToUndefinedSchema.pipe(ZRecipientActionAuthTypesSchema.optional()), + }), + ), + signingOrder: z.nativeEnum(DocumentSigningOrder), +}); export type TAddTemplatePlacholderRecipientsFormSchema = z.infer< typeof ZAddTemplatePlacholderRecipientsFormSchema