feat: add create document beta endpoint (#1584)

This commit is contained in:
David Nguyen
2025-01-16 13:36:00 +11:00
committed by GitHub
parent 5750f2b477
commit 9e03747e43
47 changed files with 2624 additions and 1934 deletions
+52
View File
@@ -1,5 +1,7 @@
import { z } from 'zod';
import { FieldType } from '@documenso/prisma/client';
export const ZBaseFieldMeta = z.object({
label: z.string().optional(),
placeholder: z.string().optional(),
@@ -114,3 +116,53 @@ export type TFieldMetaNotOptionalSchema = z.infer<typeof ZFieldMetaNotOptionalSc
export const ZFieldMetaSchema = ZFieldMetaNotOptionalSchema.optional();
export type TFieldMetaSchema = z.infer<typeof ZFieldMetaSchema>;
export const ZFieldAndMetaSchema = z.discriminatedUnion('type', [
z.object({
type: z.literal(FieldType.SIGNATURE),
// Do not use z.undefined(), or void since this will create an invalid schema for Speakeasy SDK generation.
fieldMeta: z.literal(undefined),
}),
z.object({
type: z.literal(FieldType.FREE_SIGNATURE),
fieldMeta: z.literal(undefined), // Same as above.
}),
z.object({
type: z.literal(FieldType.INITIALS),
fieldMeta: ZInitialsFieldMeta.optional(),
}),
z.object({
type: z.literal(FieldType.NAME),
fieldMeta: ZNameFieldMeta.optional(),
}),
z.object({
type: z.literal(FieldType.EMAIL),
fieldMeta: ZEmailFieldMeta.optional(),
}),
z.object({
type: z.literal(FieldType.DATE),
fieldMeta: ZDateFieldMeta.optional(),
}),
z.object({
type: z.literal(FieldType.TEXT),
fieldMeta: ZTextFieldMeta.optional(),
}),
z.object({
type: z.literal(FieldType.NUMBER),
fieldMeta: ZNumberFieldMeta.optional(),
}),
z.object({
type: z.literal(FieldType.RADIO),
fieldMeta: ZRadioFieldMeta.optional(),
}),
z.object({
type: z.literal(FieldType.CHECKBOX),
fieldMeta: ZCheckboxFieldMeta.optional(),
}),
z.object({
type: z.literal(FieldType.DROPDOWN),
fieldMeta: ZDropdownFieldMeta.optional(),
}),
]);
export type TFieldAndMeta = z.infer<typeof ZFieldAndMetaSchema>;
+21
View File
@@ -1,3 +1,5 @@
import { z } from 'zod';
import { FieldSchema } from '@documenso/prisma/generated/zod';
/**
@@ -28,3 +30,22 @@ export const ZFieldSchema = FieldSchema.pick({
inserted: true,
fieldMeta: true,
});
export const ZFieldPageNumberSchema = z
.number()
.min(1)
.describe('The page number the field will be on.');
export const ZFieldPageXSchema = z
.number()
.min(0)
.describe('The X coordinate of where the field will be placed.');
export const ZFieldPageYSchema = z
.number()
.min(0)
.describe('The Y coordinate of where the field will be placed.');
export const ZFieldWidthSchema = z.number().min(1).describe('The width of the field.');
export const ZFieldHeightSchema = z.number().min(1).describe('The height of the field.');
+119
View File
@@ -0,0 +1,119 @@
import type { z } from 'zod';
import {
DocumentDataSchema,
TeamSchema,
TemplateDirectLinkSchema,
TemplateMetaSchema,
TemplateSchema,
UserSchema,
} from '@documenso/prisma/generated/zod';
import { ZFieldSchema } from './field';
import { ZRecipientLiteSchema } from './recipient';
/**
* The full template response schema.
*
* Mainly used for returning a single template from the API.
*/
export const ZTemplateSchema = TemplateSchema.pick({
type: true,
visibility: true,
id: true,
externalId: true,
title: true,
userId: true,
teamId: true,
authOptions: true,
templateDocumentDataId: true,
createdAt: true,
updatedAt: true,
publicTitle: true,
publicDescription: true,
}).extend({
// Todo: Maybe we want to alter this a bit since this returns a lot of data.
templateDocumentData: DocumentDataSchema.pick({
type: true,
id: true,
data: true,
initialData: true,
}),
templateMeta: TemplateMetaSchema.pick({
id: true,
subject: true,
message: true,
timezone: true,
dateFormat: true,
signingOrder: true,
typedSignatureEnabled: true,
distributionMethod: true,
templateId: true,
redirectUrl: true,
language: true,
emailSettings: true,
}).nullable(),
directLink: TemplateDirectLinkSchema.nullable(),
user: UserSchema.pick({
id: true,
name: true,
email: true,
}),
recipients: ZRecipientLiteSchema.array(),
fields: ZFieldSchema.array(),
});
export type TTemplate = z.infer<typeof ZTemplateSchema>;
/**
* A lite version of the template response schema without relations.
*/
export const ZTemplateLiteSchema = TemplateSchema.pick({
type: true,
visibility: true,
id: true,
externalId: true,
title: true,
userId: true,
teamId: true,
authOptions: true,
templateDocumentDataId: true,
createdAt: true,
updatedAt: true,
publicTitle: true,
publicDescription: true,
});
/**
* A version of the template response schema when returning multiple template at once from a single API endpoint.
*/
export const ZTemplateManySchema = TemplateSchema.pick({
type: true,
visibility: true,
id: true,
externalId: true,
title: true,
userId: true,
teamId: true,
authOptions: true,
templateDocumentDataId: true,
createdAt: true,
updatedAt: true,
publicTitle: true,
publicDescription: true,
}).extend({
team: TeamSchema.pick({
id: true,
url: true,
}).nullable(),
fields: ZFieldSchema.array(),
recipients: ZRecipientLiteSchema.array(),
templateMeta: TemplateMetaSchema.pick({
signingOrder: true,
distributionMethod: true,
}).nullable(),
directLink: TemplateDirectLinkSchema.pick({
token: true,
enabled: true,
}).nullable(),
});