feat: download options for document

This commit is contained in:
Catalin Pit
2025-02-14 16:25:15 +02:00
parent 080bb405f0
commit f6a24224fe
4 changed files with 155 additions and 10 deletions

View File

@ -6,9 +6,16 @@ import { downloadFile } from './download-file';
type DownloadPDFProps = {
documentData: DocumentData;
fileName?: string;
includeCertificate?: boolean;
includeAuditLog?: boolean;
};
export const downloadPDF = async ({ documentData, fileName }: DownloadPDFProps) => {
export const downloadPDF = async ({
documentData,
fileName,
includeCertificate,
includeAuditLog,
}: DownloadPDFProps) => {
const bytes = await getFile(documentData);
const blob = new Blob([bytes], {
@ -17,8 +24,18 @@ export const downloadPDF = async ({ documentData, fileName }: DownloadPDFProps)
const baseTitle = (fileName ?? 'document').replace(/\.pdf$/, '');
let suffix = '_signed';
if (includeCertificate && includeAuditLog) {
suffix = suffix + '_with_certificate_and_audit';
} else if (includeCertificate) {
suffix = suffix + '_with_certificate';
} else if (includeAuditLog) {
suffix = suffix + '_with_audit';
}
downloadFile({
filename: `${baseTitle}_signed.pdf`,
filename: `${baseTitle}${suffix}.pdf`,
data: blob,
});
};

View File

@ -1,5 +1,6 @@
import { TRPCError } from '@trpc/server';
import { DateTime } from 'luxon';
import { PDFDocument } from 'pdf-lib';
import { getServerLimits } from '@documenso/ee/server-only/limits/server';
import { NEXT_PUBLIC_WEBAPP_URL } from '@documenso/lib/constants/app';
@ -23,6 +24,7 @@ import { searchDocumentsWithKeyword } from '@documenso/lib/server-only/document/
import { sendDocument } from '@documenso/lib/server-only/document/send-document';
import { updateDocument } from '@documenso/lib/server-only/document/update-document';
import { symmetricEncrypt } from '@documenso/lib/universal/crypto';
import { getFile } from '@documenso/lib/universal/upload/get-file';
import { getPresignPostUrl } from '@documenso/lib/universal/upload/server-actions';
import { DocumentDataType, DocumentStatus } from '@documenso/prisma/client';
@ -65,13 +67,84 @@ export const documentRouter = router({
.input(ZGetDocumentByIdQuerySchema)
.query(async ({ input, ctx }) => {
const { teamId } = ctx;
const { documentId } = input;
const { documentId, includeCertificate, includeAuditLog } = input;
return await getDocumentById({
const documentWithData = await getDocumentById({
userId: ctx.user.id,
teamId,
documentId,
});
if (includeCertificate && includeAuditLog) {
return documentWithData;
} else if (includeCertificate) {
const pdfData = await getFile(documentWithData.documentData);
const pdfDoc = await PDFDocument.load(pdfData);
const totalPages = pdfDoc.getPageCount();
if (!includeAuditLog) {
pdfDoc.removePage(totalPages - 1);
}
const pdfBytes = await pdfDoc.save();
const pdfBuffer = Buffer.from(pdfBytes).toString('base64');
return {
...documentWithData,
documentData: {
...documentWithData.documentData,
data: pdfBuffer,
initialData: documentWithData.documentData.data,
type: DocumentDataType.BYTES_64,
},
};
} else if (includeAuditLog) {
const pdfData = await getFile(documentWithData.documentData);
const pdfDoc = await PDFDocument.load(pdfData);
const totalPages = pdfDoc.getPageCount();
if (!includeCertificate) {
pdfDoc.removePage(totalPages - 2);
}
const pdfBytes = await pdfDoc.save();
const pdfBuffer = Buffer.from(pdfBytes).toString('base64');
return {
...documentWithData,
documentData: {
...documentWithData.documentData,
data: pdfBuffer,
initialData: documentWithData.documentData.data,
type: DocumentDataType.BYTES_64,
},
};
} else if (!includeCertificate && !includeAuditLog) {
const pdfData = await getFile(documentWithData.documentData);
const pdfDoc = await PDFDocument.load(pdfData);
const totalPages = pdfDoc.getPageCount();
pdfDoc.removePage(totalPages - 1);
pdfDoc.removePage(totalPages - 2);
const pdfBytes = await pdfDoc.save();
const pdfBuffer = Buffer.from(pdfBytes).toString('base64');
return {
...documentWithData,
documentData: {
...documentWithData.documentData,
data: pdfBuffer,
initialData: documentWithData.documentData.data,
type: DocumentDataType.BYTES_64,
},
};
} else {
return documentWithData;
}
}),
/**

View File

@ -141,6 +141,8 @@ export const ZFindDocumentAuditLogsQuerySchema = ZFindSearchParamsSchema.extend(
export const ZGetDocumentByIdQuerySchema = z.object({
documentId: z.number(),
includeCertificate: z.boolean().default(true).optional(),
includeAuditLog: z.boolean().default(true).optional(),
});
export const ZDuplicateDocumentRequestSchema = z.object({