From 5a8335e0eb01823b560cb5644bd1db2b105195d7 Mon Sep 17 00:00:00 2001 From: Arun Kumar <147901612+Arunkoo@users.noreply.github.com> Date: Wed, 1 Jul 2026 12:49:21 +0530 Subject: [PATCH] fix: webhook payload contains stale deletedAt on document cancellation (#2980) --- packages/lib/server-only/document/delete-document.ts | 6 ++++-- packages/lib/server-only/envelope/create-envelope.ts | 2 +- packages/lib/server-only/envelope/duplicate-envelope.ts | 2 +- .../server-only/template/create-document-from-template.ts | 2 +- packages/lib/types/subscription.ts | 2 +- 5 files changed, 8 insertions(+), 6 deletions(-) diff --git a/packages/lib/server-only/document/delete-document.ts b/packages/lib/server-only/document/delete-document.ts index 0a4456d5c..8dd0b69de 100644 --- a/packages/lib/server-only/document/delete-document.ts +++ b/packages/lib/server-only/document/delete-document.ts @@ -83,15 +83,17 @@ export const deleteDocument = async ({ id, userId, teamId, requestMetadata }: De // Handle hard or soft deleting the actual document if user has permission. if (hasDeleteAccess) { - await handleDocumentOwnerDelete({ + const updatedEnvelope = await handleDocumentOwnerDelete({ envelope, user, requestMetadata, }); + const envelopeForWebhook = { ...envelope, ...(updatedEnvelope ?? {}) }; + await triggerWebhook({ event: WebhookTriggerEvents.DOCUMENT_CANCELLED, - data: ZWebhookDocumentSchema.parse(mapEnvelopeToWebhookDocumentPayload(envelope)), + data: ZWebhookDocumentSchema.parse(mapEnvelopeToWebhookDocumentPayload(envelopeForWebhook)), userId, teamId, }); diff --git a/packages/lib/server-only/envelope/create-envelope.ts b/packages/lib/server-only/envelope/create-envelope.ts index 4ca73a387..2bbb079fd 100644 --- a/packages/lib/server-only/envelope/create-envelope.ts +++ b/packages/lib/server-only/envelope/create-envelope.ts @@ -37,9 +37,9 @@ import { extractDerivedDocumentMeta } from '../../utils/document'; import { createDocumentAuthOptions, createRecipientAuthOptions } from '../../utils/document-auth'; import { buildTeamWhereQuery } from '../../utils/teams'; import { incrementDocumentId, incrementTemplateId } from '../envelope/increment-id'; +import { assertOrganisationRatesAndLimits } from '../rate-limit/assert-organisation-rates-and-limits'; import { assertCompatibleRecipientRole } from '../signature-level/assert-compatible-recipient-role'; import { resolveSignatureLevel } from '../signature-level/resolve-signature-level'; -import { assertOrganisationRatesAndLimits } from '../rate-limit/assert-organisation-rates-and-limits'; import { getTeamSettings } from '../team/get-team-settings'; import { assertUserNotDisabledById } from '../user/assert-user-not-disabled'; import { triggerWebhook } from '../webhooks/trigger/trigger-webhook'; diff --git a/packages/lib/server-only/envelope/duplicate-envelope.ts b/packages/lib/server-only/envelope/duplicate-envelope.ts index a904bb3f2..4770814f8 100644 --- a/packages/lib/server-only/envelope/duplicate-envelope.ts +++ b/packages/lib/server-only/envelope/duplicate-envelope.ts @@ -10,8 +10,8 @@ import { nanoid, prefixedId } from '../../universal/id'; import type { EnvelopeIdOptions } from '../../utils/envelope'; import { getEnvelopeWhereInput } from '../envelope/get-envelope-by-id'; import { incrementDocumentId, incrementTemplateId } from '../envelope/increment-id'; -import { resolveSignatureLevel } from '../signature-level/resolve-signature-level'; import { assertOrganisationRatesAndLimits } from '../rate-limit/assert-organisation-rates-and-limits'; +import { resolveSignatureLevel } from '../signature-level/resolve-signature-level'; import { triggerWebhook } from '../webhooks/trigger/trigger-webhook'; export interface DuplicateEnvelopeOptions { diff --git a/packages/lib/server-only/template/create-document-from-template.ts b/packages/lib/server-only/template/create-document-from-template.ts index 114a3c2ef..47158c3f0 100644 --- a/packages/lib/server-only/template/create-document-from-template.ts +++ b/packages/lib/server-only/template/create-document-from-template.ts @@ -51,8 +51,8 @@ import { buildTeamWhereQuery } from '../../utils/teams'; import { getEnvelopeWhereInput } from '../envelope/get-envelope-by-id'; import { incrementDocumentId } from '../envelope/increment-id'; import { insertFormValuesInPdf } from '../pdf/insert-form-values-in-pdf'; -import { resolveSignatureLevel } from '../signature-level/resolve-signature-level'; import { assertOrganisationRatesAndLimits } from '../rate-limit/assert-organisation-rates-and-limits'; +import { resolveSignatureLevel } from '../signature-level/resolve-signature-level'; import { getTeamSettings } from '../team/get-team-settings'; import { triggerWebhook } from '../webhooks/trigger/trigger-webhook'; import { getOrganisationTemplateWhereInput } from './get-organisation-template-by-id'; diff --git a/packages/lib/types/subscription.ts b/packages/lib/types/subscription.ts index d25028e10..ba14433fc 100644 --- a/packages/lib/types/subscription.ts +++ b/packages/lib/types/subscription.ts @@ -52,7 +52,7 @@ export const ZClaimFlagsSchema = z.object({ signingReminders: z.boolean().optional(), cscQesSigning: z.boolean().optional(), - + /** * Controls whether an organisation is prevented from sending emails. *