fix: add logging for errors on sign or complete (#3149)

This commit is contained in:
Lucas Smith
2026-08-05 08:12:55 +10:00
committed by GitHub
parent 9c27ce6d18
commit 8bfcec8ee6
2 changed files with 94 additions and 60 deletions
+47 -24
View File
@@ -1,3 +1,4 @@
import { AppError } from '@documenso/lib/errors/app-error';
import { createEnvelopeFields } from '@documenso/lib/server-only/field/create-envelope-fields';
import { deleteDocumentField } from '@documenso/lib/server-only/field/delete-document-field';
import { deleteTemplateField } from '@documenso/lib/server-only/field/delete-template-field';
@@ -613,23 +614,34 @@ export const fieldRouter = router({
* @private
*/
signFieldWithToken: procedure.input(ZSignFieldWithTokenMutationSchema).mutation(async ({ input, ctx }) => {
const { token, fieldId, value, isBase64, authOptions } = input;
try {
const { token, fieldId, value, isBase64, authOptions } = input;
ctx.logger.info({
input: {
ctx.logger.info({
input: {
fieldId,
},
});
return await signFieldWithToken({
token,
fieldId,
},
});
value: value ?? '',
isBase64,
userId: ctx.user?.id,
authOptions,
requestMetadata: ctx.metadata.requestMetadata,
});
} catch (err) {
// Log the error for debugging purposes.
ctx.logger.error({
message: 'Error signing field with token',
error: err instanceof AppError ? `[${err.code}]: ${err.message}` : err,
});
return await signFieldWithToken({
token,
fieldId,
value: value ?? '',
isBase64,
userId: ctx.user?.id,
authOptions,
requestMetadata: ctx.metadata.requestMetadata,
});
// Rethrow the error so that the client receives the appropriate error response.
throw err;
}
}),
/**
@@ -638,18 +650,29 @@ export const fieldRouter = router({
removeSignedFieldWithToken: procedure
.input(ZRemovedSignedFieldWithTokenMutationSchema)
.mutation(async ({ input, ctx }) => {
const { token, fieldId } = input;
try {
const { token, fieldId } = input;
ctx.logger.info({
input: {
ctx.logger.info({
input: {
fieldId,
},
});
return await removeSignedFieldWithToken({
token,
fieldId,
},
});
requestMetadata: ctx.metadata.requestMetadata,
});
} catch (err) {
// Log the error for debugging purposes.
ctx.logger.error({
message: 'Error removing signed field with token',
error: err instanceof AppError ? `[${err.code}]: ${err.message}` : err,
});
return await removeSignedFieldWithToken({
token,
fieldId,
requestMetadata: ctx.metadata.requestMetadata,
});
// Rethrow the error so that the client receives the appropriate error response.
throw err;
}
}),
});
+47 -36
View File
@@ -1,4 +1,5 @@
import { prepareCscRecipientSigning } from '@documenso/ee/server-only/signing/csc/prepare-recipient-signing';
import { AppError } from '@documenso/lib/errors/app-error';
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 { createEnvelopeRecipients } from '@documenso/lib/server-only/recipient/create-envelope-recipients';
@@ -11,7 +12,6 @@ import { isTspEnvelope } from '@documenso/lib/types/signature-level';
import { unsafeBuildEnvelopeIdQuery } from '@documenso/lib/utils/envelope';
import { prisma } from '@documenso/prisma';
import { EnvelopeType } from '@prisma/client';
import { ZGenericSuccessResponse, ZSuccessResponseSchema } from '../schema';
import { authenticatedProcedure, procedure, router } from '../trpc';
import { findRecipientSuggestionsRoute } from './find-recipient-suggestions';
@@ -590,47 +590,58 @@ export const recipientRouter = router({
.input(ZCompleteDocumentWithTokenMutationSchema)
.output(ZCompleteDocumentWithTokenResponseSchema)
.mutation(async ({ input, ctx }) => {
const { token, documentId, accessAuthOptions, nextSigner, recipientOverride } = input;
try {
const { token, documentId, accessAuthOptions, nextSigner, recipientOverride } = input;
ctx.logger.info({
input: {
documentId,
},
});
ctx.logger.info({
input: {
documentId,
},
});
// Branch on TSP envelopes before any SES side effects: TSP recipients
// can't complete via this route — they go through the CSC sync sign
// flow (`enterprise.csc.signEnvelope`). This route returns the redirect URL
// for the credential-scope OAuth round-trip.
const envelope = await prisma.envelope.findFirstOrThrow({
where: {
...unsafeBuildEnvelopeIdQuery({ type: 'documentId', id: documentId }, EnvelopeType.DOCUMENT),
recipients: { some: { token } },
},
select: { signatureLevel: true, internalVersion: true },
});
// Branch on TSP envelopes before any SES side effects: TSP recipients
// can't complete via this route — they go through the CSC sync sign
// flow (`enterprise.csc.signEnvelope`). This route returns the redirect URL
// for the credential-scope OAuth round-trip.
const envelope = await prisma.envelope.findFirstOrThrow({
where: {
...unsafeBuildEnvelopeIdQuery({ type: 'documentId', id: documentId }, EnvelopeType.DOCUMENT),
recipients: { some: { token } },
},
select: { signatureLevel: true, internalVersion: true },
});
if (isTspEnvelope(envelope)) {
return await prepareCscRecipientSigning({
recipientToken: token,
if (isTspEnvelope(envelope)) {
return await prepareCscRecipientSigning({
recipientToken: token,
requestMetadata: ctx.metadata.requestMetadata,
});
}
await completeDocumentWithToken({
token,
id: {
type: 'documentId',
id: documentId,
},
accessAuthOptions,
nextSigner,
recipientOverride,
userId: ctx.user?.id,
requestMetadata: ctx.metadata.requestMetadata,
});
return { status: 'SIGNED' as const };
} catch (err) {
// Log the error for debugging purposes.
ctx.logger.error({
message: 'Error completing document with token',
error: err instanceof AppError ? `[${err.code}]: ${err.message}` : err,
});
// Rethrow the error so that the client receives the appropriate error response.
throw err;
}
await completeDocumentWithToken({
token,
id: {
type: 'documentId',
id: documentId,
},
accessAuthOptions,
nextSigner,
recipientOverride,
userId: ctx.user?.id,
requestMetadata: ctx.metadata.requestMetadata,
});
return { status: 'SIGNED' as const };
}),
/**