feat: enhance document schema and update attachment handling

- Added attachments support to ZCreateDocumentMutationSchema and ZUpdateDocumentRequestSchema.
- Updated ZDocumentSchema to validate attachments with specific fields.
- Modified updateDocument function to handle attachment creation and deletion.
- Enhanced AddSettingsFormSchema to include attachments with proper validation.
This commit is contained in:
Catalin Documenso
2025-04-29 15:14:58 +03:00
parent 396a7db587
commit e3f8e76e6a
6 changed files with 47 additions and 7 deletions

View File

@ -24,6 +24,7 @@ import {
} from '@documenso/lib/types/document-auth'; } from '@documenso/lib/types/document-auth';
import { ZDocumentEmailSettingsSchema } from '@documenso/lib/types/document-email'; import { ZDocumentEmailSettingsSchema } from '@documenso/lib/types/document-email';
import { ZFieldMetaPrefillFieldsSchema, ZFieldMetaSchema } from '@documenso/lib/types/field-meta'; import { ZFieldMetaPrefillFieldsSchema, ZFieldMetaSchema } from '@documenso/lib/types/field-meta';
import { AttachmentSchema } from '@documenso/prisma/generated/zod/modelSchema/AttachmentSchema';
extendZodWithOpenApi(z); extendZodWithOpenApi(z);
@ -176,6 +177,13 @@ export const ZCreateDocumentMutationSchema = z.object({
description: 'The globalActionAuth property is only available for Enterprise accounts.', description: 'The globalActionAuth property is only available for Enterprise accounts.',
}), }),
formValues: z.record(z.string(), z.union([z.string(), z.boolean(), z.number()])).optional(), formValues: z.record(z.string(), z.union([z.string(), z.boolean(), z.number()])).optional(),
attachments: AttachmentSchema.pick({
id: true,
label: true,
url: true,
})
.array()
.optional(),
}); });
export type TCreateDocumentMutationSchema = z.infer<typeof ZCreateDocumentMutationSchema>; export type TCreateDocumentMutationSchema = z.infer<typeof ZCreateDocumentMutationSchema>;

View File

@ -8,6 +8,7 @@ import type { ApiRequestMetadata } from '@documenso/lib/universal/extract-reques
import type { CreateDocumentAuditLogDataResponse } from '@documenso/lib/utils/document-audit-logs'; import type { CreateDocumentAuditLogDataResponse } from '@documenso/lib/utils/document-audit-logs';
import { createDocumentAuditLogData } from '@documenso/lib/utils/document-audit-logs'; import { createDocumentAuditLogData } from '@documenso/lib/utils/document-audit-logs';
import { prisma } from '@documenso/prisma'; import { prisma } from '@documenso/prisma';
import type { Attachment } from '@documenso/prisma/generated/zod/modelSchema/AttachmentSchema';
import { AppError, AppErrorCode } from '../../errors/app-error'; import { AppError, AppErrorCode } from '../../errors/app-error';
import type { TDocumentAccessAuthTypes, TDocumentActionAuthTypes } from '../../types/document-auth'; import type { TDocumentAccessAuthTypes, TDocumentActionAuthTypes } from '../../types/document-auth';
@ -24,6 +25,7 @@ export type UpdateDocumentOptions = {
globalAccessAuth?: TDocumentAccessAuthTypes | null; globalAccessAuth?: TDocumentAccessAuthTypes | null;
globalActionAuth?: TDocumentActionAuthTypes | null; globalActionAuth?: TDocumentActionAuthTypes | null;
useLegacyFieldInsertion?: boolean; useLegacyFieldInsertion?: boolean;
attachments?: Pick<Attachment, 'id' | 'label' | 'url'>[];
}; };
requestMetadata: ApiRequestMetadata; requestMetadata: ApiRequestMetadata;
}; };
@ -258,6 +260,15 @@ export const updateDocument = async ({
visibility: data.visibility as DocumentVisibility, visibility: data.visibility as DocumentVisibility,
useLegacyFieldInsertion: data.useLegacyFieldInsertion, useLegacyFieldInsertion: data.useLegacyFieldInsertion,
authOptions, authOptions,
attachments: {
deleteMany: {},
create:
data.attachments?.map((attachment) => ({
type: 'LINK',
label: attachment.label,
url: attachment.url,
})) || [],
},
}, },
}); });

View File

@ -60,7 +60,14 @@ export const ZDocumentSchema = DocumentSchema.pick({
}).nullable(), }).nullable(),
recipients: ZRecipientLiteSchema.array(), recipients: ZRecipientLiteSchema.array(),
fields: ZFieldSchema.array(), fields: ZFieldSchema.array(),
attachments: AttachmentSchema.array(), attachments: AttachmentSchema.pick({
id: true,
type: true,
label: true,
url: true,
})
.array()
.optional(),
}); });
export type TDocument = z.infer<typeof ZDocumentSchema>; export type TDocument = z.infer<typeof ZDocumentSchema>;

View File

@ -8,6 +8,7 @@ import {
ZDocumentActionAuthTypesSchema, ZDocumentActionAuthTypesSchema,
} from '@documenso/lib/types/document-auth'; } from '@documenso/lib/types/document-auth';
import { ZDocumentEmailSettingsSchema } from '@documenso/lib/types/document-email'; import { ZDocumentEmailSettingsSchema } from '@documenso/lib/types/document-email';
import AttachmentSchema from '@documenso/prisma/generated/zod/modelSchema/AttachmentSchema';
import type { TrpcRouteMeta } from '../trpc'; import type { TrpcRouteMeta } from '../trpc';
import { import {
@ -45,6 +46,13 @@ export const ZUpdateDocumentRequestSchema = z.object({
globalAccessAuth: ZDocumentAccessAuthTypesSchema.nullish(), globalAccessAuth: ZDocumentAccessAuthTypesSchema.nullish(),
globalActionAuth: ZDocumentActionAuthTypesSchema.nullish(), globalActionAuth: ZDocumentActionAuthTypesSchema.nullish(),
useLegacyFieldInsertion: z.boolean().optional(), useLegacyFieldInsertion: z.boolean().optional(),
attachments: AttachmentSchema.pick({
id: true,
label: true,
url: true,
})
.array()
.optional(),
}) })
.optional(), .optional(),
meta: z meta: z

View File

@ -147,6 +147,8 @@ export const AddSettingsFormPartial = ({
formId: nanoid(12), formId: nanoid(12),
label: '', label: '',
url: '', url: '',
// fix this
id: '',
}); });
}; };

View File

@ -11,6 +11,7 @@ import {
ZDocumentActionAuthTypesSchema, ZDocumentActionAuthTypesSchema,
} from '@documenso/lib/types/document-auth'; } from '@documenso/lib/types/document-auth';
import { isValidRedirectUrl } from '@documenso/lib/utils/is-valid-redirect-url'; import { isValidRedirectUrl } from '@documenso/lib/utils/is-valid-redirect-url';
import { AttachmentSchema } from '@documenso/prisma/generated/zod/modelSchema/AttachmentSchema';
import { import {
ZDocumentMetaDateFormatSchema, ZDocumentMetaDateFormatSchema,
ZDocumentMetaTimezoneSchema, ZDocumentMetaTimezoneSchema,
@ -58,13 +59,16 @@ export const ZAddSettingsFormSchema = z.object({
message: msg`At least one signature type must be enabled`.id, message: msg`At least one signature type must be enabled`.id,
}), }),
}), }),
attachments: z.array( attachments: AttachmentSchema.pick({
z.object({ id: true,
label: true,
url: true,
})
.extend({
formId: z.string().min(1), formId: z.string().min(1),
label: z.string(), })
link: z.string(), .array()
}), .optional(),
),
}); });
export type TAddSettingsFormSchema = z.infer<typeof ZAddSettingsFormSchema>; export type TAddSettingsFormSchema = z.infer<typeof ZAddSettingsFormSchema>;