mirror of
https://github.com/documenso/documenso.git
synced 2025-11-13 08:13:56 +10:00
feat: add get recipient route (#1553)
This commit is contained in:
@ -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);
|
||||||
|
|||||||
@ -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;
|
||||||
|
};
|
||||||
@ -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;
|
||||||
|
|||||||
@ -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)
|
||||||
|
|||||||
@ -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)
|
||||||
|
|||||||
@ -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(),
|
||||||
|
|||||||
@ -445,7 +445,7 @@ export const templateRouter = router({
|
|||||||
}),
|
}),
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* @internal
|
* @private
|
||||||
*/
|
*/
|
||||||
updateTemplateTypedSignatureSettings: authenticatedProcedure
|
updateTemplateTypedSignatureSettings: authenticatedProcedure
|
||||||
.input(ZUpdateTemplateTypedSignatureSettingsMutationSchema)
|
.input(ZUpdateTemplateTypedSignatureSettingsMutationSchema)
|
||||||
|
|||||||
Reference in New Issue
Block a user