From 88371b665af28ccf396448c7db1a722bd1dafa3c Mon Sep 17 00:00:00 2001 From: David Nguyen Date: Fri, 7 Nov 2025 16:50:58 +1100 Subject: [PATCH] fix: set correct envelope item cache url (#2144) --- apps/remix/server/api/files/files.helpers.ts | 2 +- .../e2e/envelopes/envelope-alignment.spec.ts | 8 +++-- .../include-document-certificate.spec.ts | 20 +++++++---- packages/lib/client-only/download-pdf.ts | 5 +-- .../providers/envelope-render-provider.tsx | 6 ++-- packages/lib/utils/envelope-download.ts | 33 ++++++++++++++----- packages/ui/primitives/pdf-viewer.tsx | 6 ++-- 7 files changed, 52 insertions(+), 28 deletions(-) diff --git a/apps/remix/server/api/files/files.helpers.ts b/apps/remix/server/api/files/files.helpers.ts index abd13a154..7238f6a70 100644 --- a/apps/remix/server/api/files/files.helpers.ts +++ b/apps/remix/server/api/files/files.helpers.ts @@ -59,7 +59,7 @@ export const handleEnvelopeItemFileRequest = async ({ c.header('Cache-Control', 'public, max-age=31536000, immutable'); } else { // Set a tiny 1 minute cache, with must-revalidate to ensure the client always checks for updates. - c.header('Cache-Control', 'public, max-age=60, must-revalidate'); + c.header('Cache-Control', 'public, max-age=0, must-revalidate'); } } diff --git a/packages/app-tests/e2e/envelopes/envelope-alignment.spec.ts b/packages/app-tests/e2e/envelopes/envelope-alignment.spec.ts index 42e54786d..375a3c2ae 100644 --- a/packages/app-tests/e2e/envelopes/envelope-alignment.spec.ts +++ b/packages/app-tests/e2e/envelopes/envelope-alignment.spec.ts @@ -25,7 +25,7 @@ import { DocumentStatus } from '@prisma/client'; import fs from 'node:fs'; import path from 'node:path'; import * as pdfjsLib from 'pdfjs-dist/legacy/build/pdf.js'; -import { getEnvelopeDownloadUrl } from '@documenso/lib/utils/envelope-download'; +import { getEnvelopeItemPdfUrl } from '@documenso/lib/utils/envelope-download'; import { prisma } from '@documenso/prisma'; import { seedAlignmentTestDocument } from '@documenso/prisma/seed/initial-seed'; import { seedUser } from '@documenso/prisma/seed/users'; @@ -94,7 +94,8 @@ test.skip('field placement visual regression', async ({ page }, testInfo) => { await Promise.all( completedDocument.envelopeItems.map(async (item) => { - const documentUrl = getEnvelopeDownloadUrl({ + const documentUrl = getEnvelopeItemPdfUrl({ + type: 'download', envelopeItem: item, token, version: 'signed', @@ -179,7 +180,8 @@ test.skip('download envelope images', async ({ page }) => { await Promise.all( completedDocument.envelopeItems.map(async (item) => { - const documentUrl = getEnvelopeDownloadUrl({ + const documentUrl = getEnvelopeItemPdfUrl({ + type: 'download', envelopeItem: item, token, version: 'signed', diff --git a/packages/app-tests/e2e/features/include-document-certificate.spec.ts b/packages/app-tests/e2e/features/include-document-certificate.spec.ts index ec5ee5fda..3af6fd7ca 100644 --- a/packages/app-tests/e2e/features/include-document-certificate.spec.ts +++ b/packages/app-tests/e2e/features/include-document-certificate.spec.ts @@ -3,7 +3,7 @@ import { expect, test } from '@playwright/test'; import { DocumentStatus, FieldType } from '@prisma/client'; import { getDocumentByToken } from '@documenso/lib/server-only/document/get-document-by-token'; -import { getEnvelopeDownloadUrl } from '@documenso/lib/utils/envelope-download'; +import { getEnvelopeItemPdfUrl } from '@documenso/lib/utils/envelope-download'; import { prisma } from '@documenso/prisma'; import { seedPendingDocumentWithFullFields } from '@documenso/prisma/seed/documents'; import { seedTeam } from '@documenso/prisma/seed/teams'; @@ -34,7 +34,8 @@ test.describe('Signing Certificate Tests', () => { }, }) .then(async (data) => { - const documentUrl = getEnvelopeDownloadUrl({ + const documentUrl = getEnvelopeItemPdfUrl({ + type: 'download', envelopeItem: data, token: recipient.token, version: 'signed', @@ -85,7 +86,8 @@ test.describe('Signing Certificate Tests', () => { const firstDocumentData = completedDocument.envelopeItems[0]; - const documentUrl = getEnvelopeDownloadUrl({ + const documentUrl = getEnvelopeItemPdfUrl({ + type: 'download', envelopeItem: firstDocumentData, token: recipient.token, version: 'signed', @@ -139,7 +141,8 @@ test.describe('Signing Certificate Tests', () => { }, }) .then(async (data) => { - const documentUrl = getEnvelopeDownloadUrl({ + const documentUrl = getEnvelopeItemPdfUrl({ + type: 'download', envelopeItem: data, token: recipient.token, version: 'signed', @@ -188,7 +191,8 @@ test.describe('Signing Certificate Tests', () => { const firstDocumentData = completedDocument.envelopeItems[0]; - const documentUrl = getEnvelopeDownloadUrl({ + const documentUrl = getEnvelopeItemPdfUrl({ + type: 'download', envelopeItem: firstDocumentData, token: recipient.token, version: 'signed', @@ -242,7 +246,8 @@ test.describe('Signing Certificate Tests', () => { }, }) .then(async (data) => { - const documentUrl = getEnvelopeDownloadUrl({ + const documentUrl = getEnvelopeItemPdfUrl({ + type: 'download', envelopeItem: data, token: recipient.token, version: 'signed', @@ -289,7 +294,8 @@ test.describe('Signing Certificate Tests', () => { }, }); - const documentUrl = getEnvelopeDownloadUrl({ + const documentUrl = getEnvelopeItemPdfUrl({ + type: 'download', envelopeItem: completedDocument.envelopeItems[0], token: recipient.token, version: 'signed', diff --git a/packages/lib/client-only/download-pdf.ts b/packages/lib/client-only/download-pdf.ts index ca2d4c289..735d2765c 100644 --- a/packages/lib/client-only/download-pdf.ts +++ b/packages/lib/client-only/download-pdf.ts @@ -1,6 +1,6 @@ import type { EnvelopeItem } from '@prisma/client'; -import { getEnvelopeDownloadUrl } from '../utils/envelope-download'; +import { getEnvelopeItemPdfUrl } from '../utils/envelope-download'; import { downloadFile } from './download-file'; type DocumentVersion = 'original' | 'signed'; @@ -24,7 +24,8 @@ export const downloadPDF = async ({ fileName, version = 'signed', }: DownloadPDFProps) => { - const downloadUrl = getEnvelopeDownloadUrl({ + const downloadUrl = getEnvelopeItemPdfUrl({ + type: 'download', envelopeItem: envelopeItem, token, version, diff --git a/packages/lib/client-only/providers/envelope-render-provider.tsx b/packages/lib/client-only/providers/envelope-render-provider.tsx index 3682f311a..0bde6a978 100644 --- a/packages/lib/client-only/providers/envelope-render-provider.tsx +++ b/packages/lib/client-only/providers/envelope-render-provider.tsx @@ -8,7 +8,7 @@ import { AVAILABLE_RECIPIENT_COLORS } from '@documenso/ui/lib/recipient-colors'; import type { TEnvelope } from '../../types/envelope'; import type { FieldRenderMode } from '../../universal/field-renderer/render-field'; -import { getEnvelopeDownloadUrl } from '../../utils/envelope-download'; +import { getEnvelopeItemPdfUrl } from '../../utils/envelope-download'; type FileData = | { @@ -124,10 +124,10 @@ export const EnvelopeRenderProvider = ({ } try { - const downloadUrl = getEnvelopeDownloadUrl({ + const downloadUrl = getEnvelopeItemPdfUrl({ + type: 'view', envelopeItem: envelopeItem, token, - version: 'signed', }); const blob = await fetch(downloadUrl).then(async (res) => await res.blob()); diff --git a/packages/lib/utils/envelope-download.ts b/packages/lib/utils/envelope-download.ts index 9f896928f..1961c5126 100644 --- a/packages/lib/utils/envelope-download.ts +++ b/packages/lib/utils/envelope-download.ts @@ -2,18 +2,33 @@ import type { EnvelopeItem } from '@prisma/client'; import { NEXT_PUBLIC_WEBAPP_URL } from '../constants/app'; -export type EnvelopeDownloadUrlOptions = { - envelopeItem: Pick; - token: string | undefined; - version: 'original' | 'signed'; -}; +export type EnvelopeItemPdfUrlOptions = + | { + type: 'download'; + envelopeItem: Pick; + token: string | undefined; + version: 'original' | 'signed'; + } + | { + type: 'view'; + envelopeItem: Pick; + token: string | undefined; + }; -export const getEnvelopeDownloadUrl = (options: EnvelopeDownloadUrlOptions) => { - const { envelopeItem, token, version } = options; +export const getEnvelopeItemPdfUrl = (options: EnvelopeItemPdfUrlOptions) => { + const { envelopeItem, token, type } = options; const { id, envelopeId } = envelopeItem; + if (type === 'download') { + const version = options.version; + + return token + ? `${NEXT_PUBLIC_WEBAPP_URL()}/api/files/token/${token}/envelopeItem/${id}/download/${version}` + : `${NEXT_PUBLIC_WEBAPP_URL()}/api/files/envelope/${envelopeId}/envelopeItem/${id}/download/${version}`; + } + return token - ? `${NEXT_PUBLIC_WEBAPP_URL()}/api/files/token/${token}/envelopeItem/${id}/download/${version}` - : `${NEXT_PUBLIC_WEBAPP_URL()}/api/files/envelope/${envelopeId}/envelopeItem/${id}/download/${version}`; + ? `${NEXT_PUBLIC_WEBAPP_URL()}/api/files/token/${token}/envelopeItem/${id}` + : `${NEXT_PUBLIC_WEBAPP_URL()}/api/files/envelope/${envelopeId}/envelopeItem/${id}`; }; diff --git a/packages/ui/primitives/pdf-viewer.tsx b/packages/ui/primitives/pdf-viewer.tsx index 37b920f41..02333ca75 100644 --- a/packages/ui/primitives/pdf-viewer.tsx +++ b/packages/ui/primitives/pdf-viewer.tsx @@ -12,7 +12,7 @@ import 'react-pdf/dist/esm/Page/AnnotationLayer.css'; import 'react-pdf/dist/esm/Page/TextLayer.css'; import { PDF_VIEWER_PAGE_SELECTOR } from '@documenso/lib/constants/pdf-viewer'; -import { getEnvelopeDownloadUrl } from '@documenso/lib/utils/envelope-download'; +import { getEnvelopeItemPdfUrl } from '@documenso/lib/utils/envelope-download'; import { cn } from '../lib/utils'; import { useToast } from './use-toast'; @@ -157,10 +157,10 @@ export const PDFViewer = ({ try { setIsDocumentBytesLoading(true); - const documentUrl = getEnvelopeDownloadUrl({ + const documentUrl = getEnvelopeItemPdfUrl({ + type: 'view', envelopeItem: envelopeItem, token, - version, }); const bytes = await fetch(documentUrl).then(async (res) => await res.arrayBuffer());