feat: add consistent response schemas (#1582)
This commit is contained in:
118
packages/lib/types/document.ts
Normal file
118
packages/lib/types/document.ts
Normal file
@@ -0,0 +1,118 @@
|
||||
import type { z } from 'zod';
|
||||
|
||||
import {
|
||||
DocumentDataSchema,
|
||||
DocumentMetaSchema,
|
||||
DocumentSchema,
|
||||
TeamSchema,
|
||||
UserSchema,
|
||||
} from '@documenso/prisma/generated/zod';
|
||||
|
||||
import { ZFieldSchema } from './field';
|
||||
import { ZRecipientLiteSchema } from './recipient';
|
||||
|
||||
/**
|
||||
* The full document response schema.
|
||||
*
|
||||
* Mainly used for returning a single document from the API.
|
||||
*/
|
||||
export const ZDocumentSchema = DocumentSchema.pick({
|
||||
visibility: true,
|
||||
status: true,
|
||||
source: true,
|
||||
id: true,
|
||||
externalId: true,
|
||||
userId: true,
|
||||
authOptions: true,
|
||||
formValues: true,
|
||||
title: true,
|
||||
documentDataId: true,
|
||||
createdAt: true,
|
||||
updatedAt: true,
|
||||
completedAt: true,
|
||||
deletedAt: true,
|
||||
teamId: true,
|
||||
templateId: true,
|
||||
}).extend({
|
||||
// Todo: Maybe we want to alter this a bit since this returns a lot of data.
|
||||
documentData: DocumentDataSchema.pick({
|
||||
type: true,
|
||||
id: true,
|
||||
data: true,
|
||||
initialData: true,
|
||||
}),
|
||||
documentMeta: DocumentMetaSchema.pick({
|
||||
signingOrder: true,
|
||||
distributionMethod: true,
|
||||
id: true,
|
||||
subject: true,
|
||||
message: true,
|
||||
timezone: true,
|
||||
password: true,
|
||||
dateFormat: true,
|
||||
documentId: true,
|
||||
redirectUrl: true,
|
||||
typedSignatureEnabled: true,
|
||||
language: true,
|
||||
emailSettings: true,
|
||||
}).nullable(),
|
||||
recipients: ZRecipientLiteSchema.array(),
|
||||
fields: ZFieldSchema.array(),
|
||||
});
|
||||
|
||||
export type TDocument = z.infer<typeof ZDocumentSchema>;
|
||||
|
||||
/**
|
||||
* A lite version of the document response schema without relations.
|
||||
*/
|
||||
export const ZDocumentLiteSchema = DocumentSchema.pick({
|
||||
visibility: true,
|
||||
status: true,
|
||||
source: true,
|
||||
id: true,
|
||||
externalId: true,
|
||||
userId: true,
|
||||
authOptions: true,
|
||||
formValues: true,
|
||||
title: true,
|
||||
documentDataId: true,
|
||||
createdAt: true,
|
||||
updatedAt: true,
|
||||
completedAt: true,
|
||||
deletedAt: true,
|
||||
teamId: true,
|
||||
templateId: true,
|
||||
});
|
||||
|
||||
/**
|
||||
* A version of the document response schema when returning multiple documents at once from a single API endpoint.
|
||||
*/
|
||||
export const ZDocumentManySchema = DocumentSchema.pick({
|
||||
visibility: true,
|
||||
status: true,
|
||||
source: true,
|
||||
id: true,
|
||||
externalId: true,
|
||||
userId: true,
|
||||
authOptions: true,
|
||||
formValues: true,
|
||||
title: true,
|
||||
documentDataId: true,
|
||||
createdAt: true,
|
||||
updatedAt: true,
|
||||
completedAt: true,
|
||||
deletedAt: true,
|
||||
teamId: true,
|
||||
templateId: true,
|
||||
}).extend({
|
||||
user: UserSchema.pick({
|
||||
id: true,
|
||||
name: true,
|
||||
email: true,
|
||||
}),
|
||||
recipients: ZRecipientLiteSchema.array(),
|
||||
team: TeamSchema.pick({
|
||||
id: true,
|
||||
url: true,
|
||||
}).nullable(),
|
||||
});
|
||||
30
packages/lib/types/field.ts
Normal file
30
packages/lib/types/field.ts
Normal file
@@ -0,0 +1,30 @@
|
||||
import { FieldSchema } from '@documenso/prisma/generated/zod';
|
||||
|
||||
/**
|
||||
* The full field response schema.
|
||||
*
|
||||
* If you need to return something different, adjust this file to utilise the:
|
||||
* - ZFieldSchema
|
||||
* - ZFieldLiteSchema
|
||||
* - ZFieldManySchema
|
||||
*
|
||||
* Setup similar to:
|
||||
* - ./documents.ts
|
||||
* - ./templates.ts
|
||||
*/
|
||||
export const ZFieldSchema = FieldSchema.pick({
|
||||
type: true,
|
||||
id: true,
|
||||
secondaryId: true,
|
||||
documentId: true,
|
||||
templateId: true,
|
||||
recipientId: true,
|
||||
page: true,
|
||||
positionX: true,
|
||||
positionY: true,
|
||||
width: true,
|
||||
height: true,
|
||||
customText: true,
|
||||
inserted: true,
|
||||
fieldMeta: true,
|
||||
});
|
||||
85
packages/lib/types/recipient.ts
Normal file
85
packages/lib/types/recipient.ts
Normal file
@@ -0,0 +1,85 @@
|
||||
import { TeamSchema, UserSchema } from '@documenso/prisma/generated/zod';
|
||||
import RecipientSchema from '@documenso/prisma/generated/zod/modelSchema/RecipientSchema';
|
||||
|
||||
import { ZFieldSchema } from './field';
|
||||
|
||||
/**
|
||||
* The full recipient response schema.
|
||||
*
|
||||
* Mainly used for returning a single recipient from the API.
|
||||
*/
|
||||
export const ZRecipientSchema = RecipientSchema.pick({
|
||||
role: true,
|
||||
readStatus: true,
|
||||
signingStatus: true,
|
||||
sendStatus: true,
|
||||
id: true,
|
||||
documentId: true,
|
||||
templateId: true,
|
||||
email: true,
|
||||
name: true,
|
||||
token: true,
|
||||
documentDeletedAt: true,
|
||||
expired: true,
|
||||
signedAt: true,
|
||||
authOptions: true,
|
||||
signingOrder: true,
|
||||
rejectionReason: true,
|
||||
}).extend({
|
||||
fields: ZFieldSchema.array(),
|
||||
});
|
||||
|
||||
/**
|
||||
* A lite version of the recipient response schema without relations.
|
||||
*/
|
||||
export const ZRecipientLiteSchema = RecipientSchema.pick({
|
||||
role: true,
|
||||
readStatus: true,
|
||||
signingStatus: true,
|
||||
sendStatus: true,
|
||||
id: true,
|
||||
documentId: true,
|
||||
templateId: true,
|
||||
email: true,
|
||||
name: true,
|
||||
token: true,
|
||||
documentDeletedAt: true,
|
||||
expired: true,
|
||||
signedAt: true,
|
||||
authOptions: true,
|
||||
signingOrder: true,
|
||||
rejectionReason: true,
|
||||
});
|
||||
|
||||
/**
|
||||
* A version of the recipient response schema when returning multiple recipients at once from a single API endpoint.
|
||||
*/
|
||||
export const ZRecipientManySchema = RecipientSchema.pick({
|
||||
role: true,
|
||||
readStatus: true,
|
||||
signingStatus: true,
|
||||
sendStatus: true,
|
||||
id: true,
|
||||
documentId: true,
|
||||
templateId: true,
|
||||
email: true,
|
||||
name: true,
|
||||
token: true,
|
||||
documentDeletedAt: true,
|
||||
expired: true,
|
||||
signedAt: true,
|
||||
authOptions: true,
|
||||
signingOrder: true,
|
||||
rejectionReason: true,
|
||||
}).extend({
|
||||
user: UserSchema.pick({
|
||||
id: true,
|
||||
name: true,
|
||||
email: true,
|
||||
}),
|
||||
recipients: RecipientSchema.array(),
|
||||
team: TeamSchema.pick({
|
||||
id: true,
|
||||
url: true,
|
||||
}).nullable(),
|
||||
});
|
||||
Reference in New Issue
Block a user