diff --git a/packages/lib/jobs/definitions/internal/seal-document.handler.ts b/packages/lib/jobs/definitions/internal/seal-document.handler.ts index a53174a82..7c7203e35 100644 --- a/packages/lib/jobs/definitions/internal/seal-document.handler.ts +++ b/packages/lib/jobs/definitions/internal/seal-document.handler.ts @@ -13,6 +13,7 @@ import { signPdf } from '@documenso/signing'; import { sendCompletedEmail } from '../../../server-only/document/send-completed-email'; import PostHogServerClient from '../../../server-only/feature-flags/get-post-hog-server-client'; +import { getAuditLogsPdf } from '../../../server-only/htmltopdf/get-audit-logs-pdf'; import { getCertificatePdf } from '../../../server-only/htmltopdf/get-certificate-pdf'; import { flattenAnnotations } from '../../../server-only/pdf/flatten-annotations'; import { flattenForm } from '../../../server-only/pdf/flatten-form'; @@ -129,6 +130,11 @@ export const run = async ({ }).catch(() => null) : null; + const auditLogData = await getAuditLogsPdf({ + documentId, + language: document.documentMeta?.language, + }).catch(() => null); + const newDataId = await io.runTask('decorate-and-sign-pdf', async () => { const pdfDoc = await PDFDocument.load(pdfData); @@ -150,6 +156,16 @@ export const run = async ({ }); } + if (auditLogData) { + const auditLog = await PDFDocument.load(auditLogData); + + const auditLogPages = await pdfDoc.copyPages(auditLog, auditLog.getPageIndices()); + + auditLogPages.forEach((page) => { + pdfDoc.addPage(page); + }); + } + for (const field of fields) { if (field.inserted) { await insertFieldInPDF(pdfDoc, field); diff --git a/packages/lib/server-only/document/seal-document.ts b/packages/lib/server-only/document/seal-document.ts index 603361c5e..89fffff5e 100644 --- a/packages/lib/server-only/document/seal-document.ts +++ b/packages/lib/server-only/document/seal-document.ts @@ -118,9 +118,10 @@ export const sealDocument = async ({ }).catch(() => null) : null; - const auditLogData = await getAuditLogsPdf({ documentId }).catch(() => null); - - console.log({ auditLogData }); + const auditLogData = await getAuditLogsPdf({ + documentId, + language: document.documentMeta?.language, + }).catch(() => null); const doc = await PDFDocument.load(pdfData); diff --git a/packages/lib/server-only/htmltopdf/get-audit-logs-pdf.ts b/packages/lib/server-only/htmltopdf/get-audit-logs-pdf.ts index 4af5e4107..dae1ec719 100644 --- a/packages/lib/server-only/htmltopdf/get-audit-logs-pdf.ts +++ b/packages/lib/server-only/htmltopdf/get-audit-logs-pdf.ts @@ -2,13 +2,16 @@ import { DateTime } from 'luxon'; import type { Browser } from 'playwright'; import { NEXT_PUBLIC_WEBAPP_URL } from '../../constants/app'; +import { type SupportedLanguageCodes, isValidLanguageCode } from '../../constants/i18n'; import { encryptSecondaryData } from '../crypto/encrypt'; export type GetAuditLogsPdfParams = { documentId: number; + // eslint-disable-next-line @typescript-eslint/ban-types + language?: SupportedLanguageCodes | (string & {}); }; -export const getAuditLogsPdf = async ({ documentId }: GetAuditLogsPdfParams) => { +export const getAuditLogsPdf = async ({ documentId, language }: GetAuditLogsPdfParams) => { const { chromium } = await import('playwright'); const encryptedId = encryptSecondaryData({ @@ -36,18 +39,36 @@ export const getAuditLogsPdf = async ({ documentId }: GetAuditLogsPdfParams) => const page = await browserContext.newPage(); - await page.goto(`${NEXT_PUBLIC_WEBAPP_URL()}/__htmltopdf/audit-log?d=${encryptedId}`, { - waitUntil: 'networkidle', - timeout: 10_000, - }); + const lang = isValidLanguageCode(language) ? language : 'en'; - const result = await page.pdf({ - format: 'A4', - }); + await page.context().addCookies([ + { + name: 'language', + value: lang, + url: NEXT_PUBLIC_WEBAPP_URL(), + }, + ]); - await browserContext.close(); + try { + await page.goto(`${NEXT_PUBLIC_WEBAPP_URL()}/__htmltopdf/audit-log?d=${encryptedId}`, { + waitUntil: 'networkidle', + timeout: 10_000, + }); - void browser.close(); + const result = await page.pdf({ + format: 'A4', + }); - return result; + await browserContext.close(); + + void browser.close(); + + return result; + } catch (error) { + await browserContext.close(); + + void browser.close(); + + throw error; + } };