mirror of
https://github.com/documenso/documenso.git
synced 2025-11-12 15:53:02 +10:00
feat: return fields in GET /documents/:id endpoint (#1317)
To be able to use the PATCH `/api/v1/documents/{id}/fields/{fieldId}`
endpoint, we need to know the fields ID of a particular document. The
issue #1178 suggested to create a new endpoint for this. To be
consistent with the `/templates` endpoint, I propose in this PR to
directly add the `fields` field to the `/documents/:id` endpoint.
This commit is contained in:
@ -19,6 +19,7 @@ import { updateDocument } from '@documenso/lib/server-only/document/update-docum
|
||||
import { updateDocumentSettings } from '@documenso/lib/server-only/document/update-document-settings';
|
||||
import { deleteField } from '@documenso/lib/server-only/field/delete-field';
|
||||
import { getFieldById } from '@documenso/lib/server-only/field/get-field-by-id';
|
||||
import { getFieldsForDocument } from '@documenso/lib/server-only/field/get-fields-for-document';
|
||||
import { updateField } from '@documenso/lib/server-only/field/update-field';
|
||||
import { insertFormValuesInPdf } from '@documenso/lib/server-only/pdf/insert-form-values-in-pdf';
|
||||
import { deleteRecipient } from '@documenso/lib/server-only/recipient/delete-recipient';
|
||||
@ -98,6 +99,30 @@ export const ApiContractV1Implementation = createNextRoute(ApiContractV1, {
|
||||
userId: user.id,
|
||||
});
|
||||
|
||||
const fields = await getFieldsForDocument({
|
||||
documentId: Number(documentId),
|
||||
userId: user.id,
|
||||
});
|
||||
|
||||
const parsedMetaFields = fields.map((field) => {
|
||||
let parsedMetaOrNull = null;
|
||||
|
||||
if (field.fieldMeta) {
|
||||
const result = ZFieldMetaSchema.safeParse(field.fieldMeta);
|
||||
|
||||
if (!result.success) {
|
||||
throw new Error('Field meta parsing failed for field ' + field.id);
|
||||
}
|
||||
|
||||
parsedMetaOrNull = result.data;
|
||||
}
|
||||
|
||||
return {
|
||||
...field,
|
||||
fieldMeta: parsedMetaOrNull,
|
||||
};
|
||||
});
|
||||
|
||||
return {
|
||||
status: 200,
|
||||
body: {
|
||||
@ -106,6 +131,7 @@ export const ApiContractV1Implementation = createNextRoute(ApiContractV1, {
|
||||
...recipient,
|
||||
signingUrl: `${NEXT_PUBLIC_WEBAPP_URL()}/sign/${recipient.token}`,
|
||||
})),
|
||||
fields: parsedMetaFields,
|
||||
},
|
||||
};
|
||||
} catch (err) {
|
||||
|
||||
@ -58,6 +58,22 @@ export const ZSuccessfulDocumentResponseSchema = z.object({
|
||||
|
||||
export const ZSuccessfulGetDocumentResponseSchema = ZSuccessfulDocumentResponseSchema.extend({
|
||||
recipients: z.lazy(() => z.array(ZSuccessfulRecipientResponseSchema)),
|
||||
fields: z.lazy(() =>
|
||||
ZFieldSchema.pick({
|
||||
id: true,
|
||||
recipientId: true,
|
||||
type: true,
|
||||
page: true,
|
||||
positionX: true,
|
||||
positionY: true,
|
||||
width: true,
|
||||
height: true,
|
||||
})
|
||||
.extend({
|
||||
fieldMeta: ZFieldMetaSchema.nullish(),
|
||||
})
|
||||
.array(),
|
||||
),
|
||||
});
|
||||
|
||||
export type TSuccessfulGetDocumentResponseSchema = z.infer<
|
||||
@ -424,7 +440,7 @@ export const ZSuccessfulSigningResponseSchema = z
|
||||
.object({
|
||||
message: z.string(),
|
||||
})
|
||||
.and(ZSuccessfulGetDocumentResponseSchema);
|
||||
.and(ZSuccessfulGetDocumentResponseSchema.omit({ fields: true }));
|
||||
|
||||
export type TSuccessfulSigningResponseSchema = z.infer<typeof ZSuccessfulSigningResponseSchema>;
|
||||
|
||||
|
||||
Reference in New Issue
Block a user