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:
Etrenak
2024-12-05 23:03:32 +01:00
committed by GitHub
parent 9f45fe62e4
commit 67e49c82a3
2 changed files with 43 additions and 1 deletions

View File

@ -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) {

View File

@ -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>;