mirror of
https://github.com/documenso/documenso.git
synced 2025-11-13 08:13:56 +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 { updateDocumentSettings } from '@documenso/lib/server-only/document/update-document-settings';
|
||||||
import { deleteField } from '@documenso/lib/server-only/field/delete-field';
|
import { deleteField } from '@documenso/lib/server-only/field/delete-field';
|
||||||
import { getFieldById } from '@documenso/lib/server-only/field/get-field-by-id';
|
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 { updateField } from '@documenso/lib/server-only/field/update-field';
|
||||||
import { insertFormValuesInPdf } from '@documenso/lib/server-only/pdf/insert-form-values-in-pdf';
|
import { insertFormValuesInPdf } from '@documenso/lib/server-only/pdf/insert-form-values-in-pdf';
|
||||||
import { deleteRecipient } from '@documenso/lib/server-only/recipient/delete-recipient';
|
import { deleteRecipient } from '@documenso/lib/server-only/recipient/delete-recipient';
|
||||||
@ -98,6 +99,30 @@ export const ApiContractV1Implementation = createNextRoute(ApiContractV1, {
|
|||||||
userId: user.id,
|
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 {
|
return {
|
||||||
status: 200,
|
status: 200,
|
||||||
body: {
|
body: {
|
||||||
@ -106,6 +131,7 @@ export const ApiContractV1Implementation = createNextRoute(ApiContractV1, {
|
|||||||
...recipient,
|
...recipient,
|
||||||
signingUrl: `${NEXT_PUBLIC_WEBAPP_URL()}/sign/${recipient.token}`,
|
signingUrl: `${NEXT_PUBLIC_WEBAPP_URL()}/sign/${recipient.token}`,
|
||||||
})),
|
})),
|
||||||
|
fields: parsedMetaFields,
|
||||||
},
|
},
|
||||||
};
|
};
|
||||||
} catch (err) {
|
} catch (err) {
|
||||||
|
|||||||
@ -58,6 +58,22 @@ export const ZSuccessfulDocumentResponseSchema = z.object({
|
|||||||
|
|
||||||
export const ZSuccessfulGetDocumentResponseSchema = ZSuccessfulDocumentResponseSchema.extend({
|
export const ZSuccessfulGetDocumentResponseSchema = ZSuccessfulDocumentResponseSchema.extend({
|
||||||
recipients: z.lazy(() => z.array(ZSuccessfulRecipientResponseSchema)),
|
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<
|
export type TSuccessfulGetDocumentResponseSchema = z.infer<
|
||||||
@ -424,7 +440,7 @@ export const ZSuccessfulSigningResponseSchema = z
|
|||||||
.object({
|
.object({
|
||||||
message: z.string(),
|
message: z.string(),
|
||||||
})
|
})
|
||||||
.and(ZSuccessfulGetDocumentResponseSchema);
|
.and(ZSuccessfulGetDocumentResponseSchema.omit({ fields: true }));
|
||||||
|
|
||||||
export type TSuccessfulSigningResponseSchema = z.infer<typeof ZSuccessfulSigningResponseSchema>;
|
export type TSuccessfulSigningResponseSchema = z.infer<typeof ZSuccessfulSigningResponseSchema>;
|
||||||
|
|
||||||
|
|||||||
Reference in New Issue
Block a user