From 78b275f0a7251efbf0f7da687a31a7086fc07eed Mon Sep 17 00:00:00 2001 From: David Nguyen Date: Thu, 27 Aug 2026 10:22:07 +1000 Subject: [PATCH] fix: reviewed --- .../field/remove-signed-field-with-token.ts | 21 +++--------- .../field/sign-field-with-token.ts | 32 +++++++++---------- .../envelope-router/sign-envelope-field.ts | 20 +++--------- 3 files changed, 26 insertions(+), 47 deletions(-) diff --git a/packages/lib/server-only/field/remove-signed-field-with-token.ts b/packages/lib/server-only/field/remove-signed-field-with-token.ts index 5e2c41861..f75a89d5b 100644 --- a/packages/lib/server-only/field/remove-signed-field-with-token.ts +++ b/packages/lib/server-only/field/remove-signed-field-with-token.ts @@ -1,7 +1,7 @@ import { DOCUMENT_AUDIT_LOG_TYPE } from '@documenso/lib/types/document-audit-logs'; import type { RequestMetadata } from '@documenso/lib/universal/extract-request-metadata'; import { createDocumentAuditLogData } from '@documenso/lib/utils/document-audit-logs'; -import { assertRecipientNotExpired } from '@documenso/lib/utils/recipients'; +import { assertRecipientNotExpired, getRecipientFieldsWhereInput } from '@documenso/lib/utils/recipients'; import { prisma } from '@documenso/prisma'; import { DocumentStatus, RecipientRole, SigningStatus } from '@prisma/client'; @@ -25,21 +25,10 @@ export const removeSignedFieldWithToken = async ({ const field = await prisma.field.findFirstOrThrow({ where: { id: fieldId, - recipient: { - ...(recipient.role !== RecipientRole.ASSISTANT - ? { - id: recipient.id, - } - : { - signingOrder: { - gte: recipient.signingOrder ?? 0, - }, - signingStatus: { - not: SigningStatus.SIGNED, - }, - envelopeId: recipient.envelopeId, - }), - }, + recipient: getRecipientFieldsWhereInput({ + recipient, + allowAssistantAccessToOtherRecipients: true, + }), }, include: { envelope: true, diff --git a/packages/lib/server-only/field/sign-field-with-token.ts b/packages/lib/server-only/field/sign-field-with-token.ts index 84412d903..e41858940 100644 --- a/packages/lib/server-only/field/sign-field-with-token.ts +++ b/packages/lib/server-only/field/sign-field-with-token.ts @@ -13,6 +13,7 @@ import { match } from 'ts-pattern'; import { AUTO_SIGNABLE_FIELD_TYPES } from '../../constants/autosign'; import { DEFAULT_DOCUMENT_DATE_FORMAT } from '../../constants/date-formats'; import { DEFAULT_DOCUMENT_TIME_ZONE } from '../../constants/time-zones'; +import { AppError, AppErrorCode } from '../../errors/app-error'; import { DOCUMENT_AUDIT_LOG_TYPE } from '../../types/document-audit-logs'; import type { TRecipientActionAuth } from '../../types/document-auth'; import { @@ -24,7 +25,7 @@ import { } from '../../types/field-meta'; import type { RequestMetadata } from '../../universal/extract-request-metadata'; import { createDocumentAuditLogData } from '../../utils/document-audit-logs'; -import { assertRecipientNotExpired } from '../../utils/recipients'; +import { assertRecipientNotExpired, getRecipientFieldsWhereInput } from '../../utils/recipients'; import { validateFieldAuth } from '../document/validate-field-auth'; export type SignFieldWithTokenOptions = { @@ -65,21 +66,10 @@ export const signFieldWithToken = async ({ const field = await prisma.field.findFirstOrThrow({ where: { id: fieldId, - recipient: { - ...(recipient.role !== RecipientRole.ASSISTANT - ? { - id: recipient.id, - } - : { - signingStatus: { - not: SigningStatus.SIGNED, - }, - signingOrder: { - gte: recipient.signingOrder ?? 0, - }, - envelopeId: recipient.envelopeId, - }), - }, + recipient: getRecipientFieldsWhereInput({ + recipient, + allowAssistantAccessToOtherRecipients: true, + }), }, include: { envelope: { @@ -124,6 +114,16 @@ export const signFieldWithToken = async ({ throw new Error(`Field ${fieldId} has no recipientId`); } + if ( + field.type === FieldType.SIGNATURE && + recipient.role === RecipientRole.ASSISTANT && + field.recipientId !== recipient.id + ) { + throw new AppError(AppErrorCode.INVALID_REQUEST, { + message: 'Assistant recipients cannot sign signature fields', + }); + } + if (field.type === FieldType.NUMBER && field.fieldMeta) { const numberFieldParsedMeta = ZNumberFieldMeta.parse(field.fieldMeta); const errors = validateNumberField(value, numberFieldParsedMeta, true); diff --git a/packages/trpc/server/envelope-router/sign-envelope-field.ts b/packages/trpc/server/envelope-router/sign-envelope-field.ts index 54f4129a5..40150bd8e 100644 --- a/packages/trpc/server/envelope-router/sign-envelope-field.ts +++ b/packages/trpc/server/envelope-router/sign-envelope-field.ts @@ -4,7 +4,7 @@ import { validateFieldAuth } from '@documenso/lib/server-only/document/validate- import { DOCUMENT_AUDIT_LOG_TYPE } from '@documenso/lib/types/document-audit-logs'; import { createDocumentAuditLogData } from '@documenso/lib/utils/document-audit-logs'; import { extractFieldInsertionValues } from '@documenso/lib/utils/envelope-signing'; -import { assertRecipientNotExpired } from '@documenso/lib/utils/recipients'; +import { assertRecipientNotExpired, getRecipientFieldsWhereInput } from '@documenso/lib/utils/recipients'; import { prisma } from '@documenso/prisma'; import { DocumentStatus, FieldType, RecipientRole, SigningStatus } from '@prisma/client'; import { match } from 'ts-pattern'; @@ -39,20 +39,10 @@ export const signEnvelopeFieldRoute = procedure const field = await prisma.field.findFirst({ where: { id: fieldId, - recipient: - recipient.role === RecipientRole.ASSISTANT - ? { - signingStatus: { - not: SigningStatus.SIGNED, - }, - signingOrder: { - gte: recipient.signingOrder ?? 0, - }, - envelopeId: recipient.envelopeId, - } - : { - id: recipient.id, - }, + recipient: getRecipientFieldsWhereInput({ + recipient, + allowAssistantAccessToOtherRecipients: true, + }), }, include: { envelope: {