fix: add /api/v1 backwards compat

This commit is contained in:
David Nguyen
2024-04-23 14:42:03 +07:00
parent 193419d169
commit 9a801d6091
2 changed files with 58 additions and 23 deletions

View File

@ -100,13 +100,21 @@ export type TCreateDocumentMutationResponseSchema = z.infer<
export const ZCreateDocumentFromTemplateMutationSchema = z.object({ export const ZCreateDocumentFromTemplateMutationSchema = z.object({
title: z.string().min(1), title: z.string().min(1),
recipients: z.array( recipients: z.union([
z.array(
z.object({
id: z.number(),
name: z.string().min(1),
email: z.string().email().min(1),
}),
),
z.array(
z.object({ z.object({
name: z.string().min(1), name: z.string().min(1),
email: z.string().email().min(1), email: z.string().email().min(1),
role: z.nativeEnum(RecipientRole).optional().default(RecipientRole.SIGNER),
}), }),
), ),
]),
meta: z meta: z
.object({ .object({
subject: z.string(), subject: z.string(),

View File

@ -1,12 +1,20 @@
import { nanoid } from '@documenso/lib/universal/id'; import { nanoid } from '@documenso/lib/universal/id';
import { prisma } from '@documenso/prisma'; import { prisma } from '@documenso/prisma';
import type { Recipient } from '@documenso/prisma/client';
type RecipientWithId = {
id: number;
name?: string;
email: string;
};
export type CreateDocumentFromTemplateOptions = { export type CreateDocumentFromTemplateOptions = {
templateId: number; templateId: number;
userId: number; userId: number;
teamId?: number; teamId?: number;
recipients: { recipients:
id: number; | RecipientWithId[]
| {
name?: string; name?: string;
email: string; email: string;
}[]; }[];
@ -48,19 +56,38 @@ export const createDocumentFromTemplate = async ({
throw new Error('Template not found.'); throw new Error('Template not found.');
} }
const finalRecipients = template.Recipient.map((templateRecipient) => { if (recipients.length === 0 || recipients.length !== template.Recipient.length) {
const foundRecipient = recipients.find((recipient) => recipient.id === templateRecipient.id); throw new Error('Invalid number of recipients.');
}
let finalRecipients: Pick<Recipient, 'name' | 'email' | 'role'>[] = [];
if (Object.prototype.hasOwnProperty.call(recipients[0], 'id')) {
finalRecipients = template.Recipient.map((templateRecipient) => {
// eslint-disable-next-line @typescript-eslint/consistent-type-assertions
const foundRecipient = (recipients as RecipientWithId[]).find(
(recipient) => recipient.id === templateRecipient.id,
);
if (!foundRecipient) { if (!foundRecipient) {
throw new Error('Recipient not found.'); throw new Error('Recipient not found.');
} }
return { return {
name: foundRecipient.name, name: foundRecipient.name ?? '',
email: foundRecipient.email, email: foundRecipient.email,
role: templateRecipient.role, role: templateRecipient.role,
}; };
}); });
} else {
// Backwards compatible logic for /v1/ API where we use the index to associate
// the provided recipient with the template recipient.
finalRecipients = recipients.map((recipient, index) => ({
name: recipient.name ?? '',
email: recipient.email,
role: template.Recipient[index].role,
}));
}
const documentData = await prisma.documentData.create({ const documentData = await prisma.documentData.create({
data: { data: {