feat: add consistent response schemas (#1582)
This commit is contained in:
@@ -2,48 +2,37 @@ import { z } from 'zod';
|
||||
|
||||
import { completeDocumentWithToken } from '@documenso/lib/server-only/document/complete-document-with-token';
|
||||
import { rejectDocumentWithToken } from '@documenso/lib/server-only/document/reject-document-with-token';
|
||||
import {
|
||||
ZCreateDocumentRecipientsResponseSchema,
|
||||
createDocumentRecipients,
|
||||
} from '@documenso/lib/server-only/recipient/create-document-recipients';
|
||||
import {
|
||||
ZCreateTemplateRecipientsResponseSchema,
|
||||
createTemplateRecipients,
|
||||
} from '@documenso/lib/server-only/recipient/create-template-recipients';
|
||||
import { createDocumentRecipients } from '@documenso/lib/server-only/recipient/create-document-recipients';
|
||||
import { createTemplateRecipients } from '@documenso/lib/server-only/recipient/create-template-recipients';
|
||||
import { deleteDocumentRecipient } from '@documenso/lib/server-only/recipient/delete-document-recipient';
|
||||
import { deleteTemplateRecipient } from '@documenso/lib/server-only/recipient/delete-template-recipient';
|
||||
import {
|
||||
ZGetRecipientByIdResponseSchema,
|
||||
getRecipientById,
|
||||
} from '@documenso/lib/server-only/recipient/get-recipient-by-id';
|
||||
import {
|
||||
ZSetDocumentRecipientsResponseSchema,
|
||||
setDocumentRecipients,
|
||||
} from '@documenso/lib/server-only/recipient/set-document-recipients';
|
||||
import {
|
||||
ZSetTemplateRecipientsResponseSchema,
|
||||
setTemplateRecipients,
|
||||
} from '@documenso/lib/server-only/recipient/set-template-recipients';
|
||||
import { getRecipientById } from '@documenso/lib/server-only/recipient/get-recipient-by-id';
|
||||
import { setDocumentRecipients } from '@documenso/lib/server-only/recipient/set-document-recipients';
|
||||
import { setTemplateRecipients } from '@documenso/lib/server-only/recipient/set-template-recipients';
|
||||
import { updateDocumentRecipients } from '@documenso/lib/server-only/recipient/update-document-recipients';
|
||||
import { updateTemplateRecipients } from '@documenso/lib/server-only/recipient/update-template-recipients';
|
||||
import { extractNextApiRequestMetadata } from '@documenso/lib/universal/extract-request-metadata';
|
||||
|
||||
import { authenticatedProcedure, procedure, router } from '../trpc';
|
||||
import {
|
||||
ZAddSignersMutationSchema,
|
||||
ZCompleteDocumentWithTokenMutationSchema,
|
||||
ZCreateDocumentRecipientRequestSchema,
|
||||
ZCreateDocumentRecipientResponseSchema,
|
||||
ZCreateDocumentRecipientsRequestSchema,
|
||||
ZCreateDocumentRecipientsResponseSchema,
|
||||
ZCreateTemplateRecipientRequestSchema,
|
||||
ZCreateTemplateRecipientResponseSchema,
|
||||
ZCreateTemplateRecipientsRequestSchema,
|
||||
ZCreateTemplateRecipientsResponseSchema,
|
||||
ZDeleteDocumentRecipientRequestSchema,
|
||||
ZDeleteTemplateRecipientRequestSchema,
|
||||
ZGetRecipientQuerySchema,
|
||||
ZGetRecipientRequestSchema,
|
||||
ZGetRecipientResponseSchema,
|
||||
ZRejectDocumentWithTokenMutationSchema,
|
||||
ZSetDocumentRecipientsRequestSchema,
|
||||
ZSetDocumentRecipientsResponseSchema,
|
||||
ZSetTemplateRecipientsRequestSchema,
|
||||
ZSetTemplateRecipientsResponseSchema,
|
||||
ZUpdateDocumentRecipientRequestSchema,
|
||||
ZUpdateDocumentRecipientResponseSchema,
|
||||
ZUpdateDocumentRecipientsRequestSchema,
|
||||
@@ -69,8 +58,8 @@ export const recipientRouter = router({
|
||||
tags: ['Document Recipients', 'Template Recipients'],
|
||||
},
|
||||
})
|
||||
.input(ZGetRecipientQuerySchema)
|
||||
.output(ZGetRecipientByIdResponseSchema)
|
||||
.input(ZGetRecipientRequestSchema)
|
||||
.output(ZGetRecipientResponseSchema)
|
||||
.query(async ({ input, ctx }) => {
|
||||
const { teamId } = ctx;
|
||||
const { recipientId } = input;
|
||||
@@ -464,32 +453,4 @@ export const recipientRouter = router({
|
||||
requestMetadata: extractNextApiRequestMetadata(ctx.req),
|
||||
});
|
||||
}),
|
||||
|
||||
/**
|
||||
* Leaving this here and will remove after deployment.
|
||||
*
|
||||
* @deprecated Remove after deployment.
|
||||
*/
|
||||
addSigners: authenticatedProcedure
|
||||
.input(ZAddSignersMutationSchema)
|
||||
.output(ZSetDocumentRecipientsResponseSchema)
|
||||
.mutation(async ({ input, ctx }) => {
|
||||
const { teamId } = ctx;
|
||||
const { documentId, signers } = input;
|
||||
|
||||
return await setDocumentRecipients({
|
||||
userId: ctx.user.id,
|
||||
documentId,
|
||||
teamId,
|
||||
recipients: signers.map((signer) => ({
|
||||
id: signer.nativeId,
|
||||
email: signer.email,
|
||||
name: signer.name,
|
||||
role: signer.role,
|
||||
signingOrder: signer.signingOrder,
|
||||
actionAuth: signer.actionAuth,
|
||||
})),
|
||||
requestMetadata: ctx.metadata,
|
||||
});
|
||||
}),
|
||||
});
|
||||
|
||||
@@ -5,13 +5,15 @@ import {
|
||||
ZRecipientActionAuthSchema,
|
||||
ZRecipientActionAuthTypesSchema,
|
||||
} from '@documenso/lib/types/document-auth';
|
||||
import { ZRecipientLiteSchema, ZRecipientSchema } from '@documenso/lib/types/recipient';
|
||||
import { RecipientRole } from '@documenso/prisma/client';
|
||||
import { FieldSchema, RecipientSchema } from '@documenso/prisma/generated/zod';
|
||||
|
||||
export const ZGetRecipientQuerySchema = z.object({
|
||||
export const ZGetRecipientRequestSchema = z.object({
|
||||
recipientId: z.number(),
|
||||
});
|
||||
|
||||
export const ZGetRecipientResponseSchema = ZRecipientSchema;
|
||||
|
||||
const ZCreateRecipientSchema = z.object({
|
||||
email: z.string().toLowerCase().email().min(1),
|
||||
name: z.string(),
|
||||
@@ -31,41 +33,12 @@ const ZUpdateRecipientSchema = z.object({
|
||||
actionAuth: ZRecipientActionAuthTypesSchema.optional().nullable(),
|
||||
});
|
||||
|
||||
/**
|
||||
* Use this when returning base recipients from the API.
|
||||
*/
|
||||
export const ZRecipientBaseResponseSchema = RecipientSchema.pick({
|
||||
id: true,
|
||||
documentId: true,
|
||||
templateId: true,
|
||||
email: true,
|
||||
name: true,
|
||||
token: true,
|
||||
documentDeletedAt: true,
|
||||
expired: true,
|
||||
signedAt: true,
|
||||
authOptions: true,
|
||||
signingOrder: true,
|
||||
rejectionReason: true,
|
||||
role: true,
|
||||
readStatus: true,
|
||||
signingStatus: true,
|
||||
sendStatus: true,
|
||||
});
|
||||
|
||||
/**
|
||||
* Use this when returning a full recipient from the API.
|
||||
*/
|
||||
export const ZRecipientResponseSchema = ZRecipientBaseResponseSchema.extend({
|
||||
fields: FieldSchema.array(),
|
||||
});
|
||||
|
||||
export const ZCreateDocumentRecipientRequestSchema = z.object({
|
||||
documentId: z.number(),
|
||||
recipient: ZCreateRecipientSchema,
|
||||
});
|
||||
|
||||
export const ZCreateDocumentRecipientResponseSchema = ZRecipientBaseResponseSchema;
|
||||
export const ZCreateDocumentRecipientResponseSchema = ZRecipientLiteSchema;
|
||||
|
||||
export const ZCreateDocumentRecipientsRequestSchema = z.object({
|
||||
documentId: z.number(),
|
||||
@@ -76,12 +49,16 @@ export const ZCreateDocumentRecipientsRequestSchema = z.object({
|
||||
}),
|
||||
});
|
||||
|
||||
export const ZCreateDocumentRecipientsResponseSchema = z.object({
|
||||
recipients: ZRecipientLiteSchema.array(),
|
||||
});
|
||||
|
||||
export const ZUpdateDocumentRecipientRequestSchema = z.object({
|
||||
documentId: z.number(),
|
||||
recipient: ZUpdateRecipientSchema,
|
||||
});
|
||||
|
||||
export const ZUpdateDocumentRecipientResponseSchema = ZRecipientResponseSchema;
|
||||
export const ZUpdateDocumentRecipientResponseSchema = ZRecipientSchema;
|
||||
|
||||
export const ZUpdateDocumentRecipientsRequestSchema = z.object({
|
||||
documentId: z.number(),
|
||||
@@ -95,7 +72,7 @@ export const ZUpdateDocumentRecipientsRequestSchema = z.object({
|
||||
});
|
||||
|
||||
export const ZUpdateDocumentRecipientsResponseSchema = z.object({
|
||||
recipients: z.array(ZRecipientResponseSchema),
|
||||
recipients: z.array(ZRecipientSchema),
|
||||
});
|
||||
|
||||
export const ZDeleteDocumentRecipientRequestSchema = z.object({
|
||||
@@ -126,12 +103,16 @@ export const ZSetDocumentRecipientsRequestSchema = z
|
||||
{ message: 'Signers must have unique emails', path: ['signers__root'] },
|
||||
);
|
||||
|
||||
export const ZSetDocumentRecipientsResponseSchema = z.object({
|
||||
recipients: ZRecipientLiteSchema.array(),
|
||||
});
|
||||
|
||||
export const ZCreateTemplateRecipientRequestSchema = z.object({
|
||||
templateId: z.number(),
|
||||
recipient: ZCreateRecipientSchema,
|
||||
});
|
||||
|
||||
export const ZCreateTemplateRecipientResponseSchema = ZRecipientBaseResponseSchema;
|
||||
export const ZCreateTemplateRecipientResponseSchema = ZRecipientLiteSchema;
|
||||
|
||||
export const ZCreateTemplateRecipientsRequestSchema = z.object({
|
||||
templateId: z.number(),
|
||||
@@ -142,12 +123,16 @@ export const ZCreateTemplateRecipientsRequestSchema = z.object({
|
||||
}),
|
||||
});
|
||||
|
||||
export const ZCreateTemplateRecipientsResponseSchema = z.object({
|
||||
recipients: ZRecipientLiteSchema.array(),
|
||||
});
|
||||
|
||||
export const ZUpdateTemplateRecipientRequestSchema = z.object({
|
||||
templateId: z.number(),
|
||||
recipient: ZUpdateRecipientSchema,
|
||||
});
|
||||
|
||||
export const ZUpdateTemplateRecipientResponseSchema = ZRecipientResponseSchema;
|
||||
export const ZUpdateTemplateRecipientResponseSchema = ZRecipientSchema;
|
||||
|
||||
export const ZUpdateTemplateRecipientsRequestSchema = z.object({
|
||||
templateId: z.number(),
|
||||
@@ -161,11 +146,7 @@ export const ZUpdateTemplateRecipientsRequestSchema = z.object({
|
||||
});
|
||||
|
||||
export const ZUpdateTemplateRecipientsResponseSchema = z.object({
|
||||
recipients: z.array(ZRecipientResponseSchema).refine((recipients) => {
|
||||
const emails = recipients.map((recipient) => recipient.email);
|
||||
|
||||
return new Set(emails).size === emails.length;
|
||||
}),
|
||||
recipients: z.array(ZRecipientSchema),
|
||||
});
|
||||
|
||||
export const ZDeleteTemplateRecipientRequestSchema = z.object({
|
||||
@@ -196,6 +177,10 @@ export const ZSetTemplateRecipientsRequestSchema = z
|
||||
{ message: 'Recipients must have unique emails', path: ['recipients__root'] },
|
||||
);
|
||||
|
||||
export const ZSetTemplateRecipientsResponseSchema = z.object({
|
||||
recipients: ZRecipientLiteSchema.array(),
|
||||
});
|
||||
|
||||
export const ZCompleteDocumentWithTokenMutationSchema = z.object({
|
||||
token: z.string(),
|
||||
documentId: z.number(),
|
||||
@@ -216,32 +201,3 @@ export const ZRejectDocumentWithTokenMutationSchema = z.object({
|
||||
export type TRejectDocumentWithTokenMutationSchema = z.infer<
|
||||
typeof ZRejectDocumentWithTokenMutationSchema
|
||||
>;
|
||||
|
||||
/**
|
||||
* Legacy schema. Remove after deployment (when addSigners trpc is removed).
|
||||
*
|
||||
* @deprecated
|
||||
*/
|
||||
export const ZAddSignersMutationSchema = z
|
||||
.object({
|
||||
documentId: z.number(),
|
||||
signers: 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.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'] },
|
||||
);
|
||||
|
||||
Reference in New Issue
Block a user