feat: add get recipient route (#1553)

This commit is contained in:
David Nguyen
2024-12-26 17:25:14 +11:00
committed by GitHub
parent 8a7ec7e982
commit 74382e21e7
7 changed files with 119 additions and 18 deletions

View File

@ -23,7 +23,7 @@ import { getFieldsForDocument } from '@documenso/lib/server-only/field/get-field
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';
import { getRecipientById } from '@documenso/lib/server-only/recipient/get-recipient-by-id'; import { getRecipientByIdV1Api } from '@documenso/lib/server-only/recipient/get-recipient-by-id-v1-api';
import { getRecipientsForDocument } from '@documenso/lib/server-only/recipient/get-recipients-for-document'; import { getRecipientsForDocument } from '@documenso/lib/server-only/recipient/get-recipients-for-document';
import { setRecipientsForDocument } from '@documenso/lib/server-only/recipient/set-recipients-for-document'; import { setRecipientsForDocument } from '@documenso/lib/server-only/recipient/set-recipients-for-document';
import { updateRecipient } from '@documenso/lib/server-only/recipient/update-recipient'; import { updateRecipient } from '@documenso/lib/server-only/recipient/update-recipient';
@ -999,7 +999,7 @@ export const ApiContractV1Implementation = createNextRoute(ApiContractV1, {
throw new Error('Invalid page number'); throw new Error('Invalid page number');
} }
const recipient = await getRecipientById({ const recipient = await getRecipientByIdV1Api({
id: Number(recipientId), id: Number(recipientId),
documentId: Number(documentId), documentId: Number(documentId),
}).catch(() => null); }).catch(() => null);
@ -1144,7 +1144,7 @@ export const ApiContractV1Implementation = createNextRoute(ApiContractV1, {
}; };
} }
const recipient = await getRecipientById({ const recipient = await getRecipientByIdV1Api({
id: Number(recipientId), id: Number(recipientId),
documentId: Number(documentId), documentId: Number(documentId),
}).catch(() => null); }).catch(() => null);
@ -1248,7 +1248,7 @@ export const ApiContractV1Implementation = createNextRoute(ApiContractV1, {
}; };
} }
const recipient = await getRecipientById({ const recipient = await getRecipientByIdV1Api({
id: Number(field.recipientId), id: Number(field.recipientId),
documentId: Number(documentId), documentId: Number(documentId),
}).catch(() => null); }).catch(() => null);

View File

@ -0,0 +1,21 @@
import { prisma } from '@documenso/prisma';
export type GetRecipientByIdOptions = {
id: number;
documentId: number;
};
export const getRecipientByIdV1Api = async ({ documentId, id }: GetRecipientByIdOptions) => {
const recipient = await prisma.recipient.findFirst({
where: {
documentId,
id,
},
});
if (!recipient) {
throw new Error('Recipient not found');
}
return recipient;
};

View File

@ -1,20 +1,63 @@
import type { z } from 'zod';
import { prisma } from '@documenso/prisma'; import { prisma } from '@documenso/prisma';
import { FieldSchema, RecipientSchema } from '@documenso/prisma/generated/zod';
import { AppError, AppErrorCode } from '../../errors/app-error';
export type GetRecipientByIdOptions = { export type GetRecipientByIdOptions = {
id: number; recipientId: number;
documentId: number; userId: number;
teamId?: number;
}; };
export const getRecipientById = async ({ documentId, id }: GetRecipientByIdOptions) => { export const ZGetRecipientByIdResponseSchema = RecipientSchema.extend({
Field: FieldSchema.array(),
});
export type TGetRecipientByIdResponse = z.infer<typeof ZGetRecipientByIdResponseSchema>;
/**
* Get a recipient by ID. This will also return the recipient signing token so
* be careful when using this.
*/
export const getRecipientById = async ({
recipientId,
userId,
teamId,
}: GetRecipientByIdOptions): Promise<TGetRecipientByIdResponse> => {
const recipient = await prisma.recipient.findFirst({ const recipient = await prisma.recipient.findFirst({
where: { where: {
documentId, id: recipientId,
id, Document: {
OR: [
teamId === undefined
? {
userId,
teamId: null,
}
: {
teamId,
team: {
members: {
some: {
userId,
},
},
},
},
],
},
},
include: {
Field: true,
}, },
}); });
if (!recipient) { if (!recipient) {
throw new Error('Recipient not found'); throw new AppError(AppErrorCode.NOT_FOUND, {
message: 'Recipient not found',
});
} }
return recipient; return recipient;

View File

@ -33,7 +33,8 @@ export const fieldRouter = router({
method: 'GET', method: 'GET',
path: '/field/{fieldId}', path: '/field/{fieldId}',
summary: 'Get field', summary: 'Get field',
description: 'Returns a document or template field', description:
'Returns a single field. If you want to retrieve all the fields for a document or template, use the "Get Document" or "Get Template" request.',
tags: ['Fields'], tags: ['Fields'],
}, },
}) })
@ -119,7 +120,7 @@ export const fieldRouter = router({
}), }),
/** /**
* @internal * @private
*/ */
signFieldWithToken: procedure signFieldWithToken: procedure
.input(ZSignFieldWithTokenMutationSchema) .input(ZSignFieldWithTokenMutationSchema)
@ -138,7 +139,7 @@ export const fieldRouter = router({
}), }),
/** /**
* @internal * @private
*/ */
removeSignedFieldWithToken: procedure removeSignedFieldWithToken: procedure
.input(ZRemovedSignedFieldWithTokenMutationSchema) .input(ZRemovedSignedFieldWithTokenMutationSchema)

View File

@ -1,5 +1,9 @@
import { completeDocumentWithToken } from '@documenso/lib/server-only/document/complete-document-with-token'; import { completeDocumentWithToken } from '@documenso/lib/server-only/document/complete-document-with-token';
import { rejectDocumentWithToken } from '@documenso/lib/server-only/document/reject-document-with-token'; import { rejectDocumentWithToken } from '@documenso/lib/server-only/document/reject-document-with-token';
import {
ZGetRecipientByIdResponseSchema,
getRecipientById,
} from '@documenso/lib/server-only/recipient/get-recipient-by-id';
import { import {
ZSetRecipientsForDocumentResponseSchema, ZSetRecipientsForDocumentResponseSchema,
setRecipientsForDocument, setRecipientsForDocument,
@ -15,12 +19,39 @@ import {
ZAddSignersMutationSchema, ZAddSignersMutationSchema,
ZAddTemplateSignersMutationSchema, ZAddTemplateSignersMutationSchema,
ZCompleteDocumentWithTokenMutationSchema, ZCompleteDocumentWithTokenMutationSchema,
ZGetRecipientQuerySchema,
ZRejectDocumentWithTokenMutationSchema, ZRejectDocumentWithTokenMutationSchema,
} from './schema'; } from './schema';
export const recipientRouter = router({ export const recipientRouter = router({
/** /**
* @internal * @public
*/
getRecipient: authenticatedProcedure
.meta({
openapi: {
method: 'GET',
path: '/recipient/{recipientId}',
summary: 'Get recipient',
description:
'Returns a single recipient. If you want to retrieve all the recipients for a document or template, use the "Get Document" or "Get Template" request.',
tags: ['Recipients'],
},
})
.input(ZGetRecipientQuerySchema)
.output(ZGetRecipientByIdResponseSchema)
.query(async ({ input, ctx }) => {
const { recipientId, teamId } = input;
return await getRecipientById({
userId: ctx.user.id,
teamId,
recipientId,
});
}),
/**
* @public
*/ */
addSigners: authenticatedProcedure addSigners: authenticatedProcedure
.meta({ .meta({
@ -53,7 +84,7 @@ export const recipientRouter = router({
}), }),
/** /**
* @internal * @public
*/ */
addTemplateSigners: authenticatedProcedure addTemplateSigners: authenticatedProcedure
.meta({ .meta({
@ -85,7 +116,7 @@ export const recipientRouter = router({
}), }),
/** /**
* @internal * @private
*/ */
completeDocumentWithToken: procedure completeDocumentWithToken: procedure
.input(ZCompleteDocumentWithTokenMutationSchema) .input(ZCompleteDocumentWithTokenMutationSchema)
@ -102,7 +133,7 @@ export const recipientRouter = router({
}), }),
/** /**
* @internal * @private
*/ */
rejectDocumentWithToken: procedure rejectDocumentWithToken: procedure
.input(ZRejectDocumentWithTokenMutationSchema) .input(ZRejectDocumentWithTokenMutationSchema)

View File

@ -6,6 +6,11 @@ import {
} from '@documenso/lib/types/document-auth'; } from '@documenso/lib/types/document-auth';
import { RecipientRole } from '@documenso/prisma/client'; import { RecipientRole } from '@documenso/prisma/client';
export const ZGetRecipientQuerySchema = z.object({
recipientId: z.number(),
teamId: z.number().optional(),
});
export const ZAddSignersMutationSchema = z export const ZAddSignersMutationSchema = z
.object({ .object({
documentId: z.number(), documentId: z.number(),

View File

@ -445,7 +445,7 @@ export const templateRouter = router({
}), }),
/** /**
* @internal * @private
*/ */
updateTemplateTypedSignatureSettings: authenticatedProcedure updateTemplateTypedSignatureSettings: authenticatedProcedure
.input(ZUpdateTemplateTypedSignatureSettingsMutationSchema) .input(ZUpdateTemplateTypedSignatureSettingsMutationSchema)