From 9c09d315f0ef92183a20e5bfa72105e6268ef568 Mon Sep 17 00:00:00 2001 From: acialini Date: Thu, 7 Mar 2024 10:45:21 +0100 Subject: [PATCH 1/4] [VAS-812] feat: Updated puppeteer version, helper syntax, and introduced title parameter for accessibility reasons --- node/package.json | 8 +++---- node/pdf-generate/__tests__/index.test.js | 1 + node/pdf-generate/handlers.js | 2 ++ node/pdf-generate/helpers/eq.js | 2 +- node/pdf-generate/utils/browserManager.js | 1 - .../pdf/engine/model/AppErrorCodeEnum.java | 4 ++-- .../pdf/engine/model/GeneratePDFInput.java | 1 + .../pdf/engine/model/PdfEngineRequest.java | 7 ++++-- .../service/impl/GeneratePDFServiceImpl.java | 2 ++ .../impl/ParseRequestBodyServiceImpl.java | 14 ++++++++++++ .../impl/GeneratePDFServiceImplTest.java | 1 + .../impl/ParseRequestBodyServiceImplTest.java | 22 ++++++++++++++++++- 12 files changed, 53 insertions(+), 12 deletions(-) diff --git a/node/package.json b/node/package.json index f1e0e18a..11f92f72 100644 --- a/node/package.json +++ b/node/package.json @@ -15,12 +15,10 @@ "axios": "^1.5.0", "express": "^4.18.2", "fs-extra": "^11.1.1", - "handlebars": "^4.7.7", - "handlebars-helpers": "^0.10.0", - "hbs-cli": "^1.4.1", + "handlebars": "^4.7.8", + "puppeteer": "^22.4.0", "multer": "^1.4.5-lts.1", - "nodemon": "^3.0.1", - "puppeteer": "^18.0.2" + "nodemon": "^3.0.1" }, "devDependencies": { "@types/jest": "^24.0.15", diff --git a/node/pdf-generate/__tests__/index.test.js b/node/pdf-generate/__tests__/index.test.js index f4515c46..501e6e1d 100644 --- a/node/pdf-generate/__tests__/index.test.js +++ b/node/pdf-generate/__tests__/index.test.js @@ -14,6 +14,7 @@ describe("generatePdf", () => { it("should return a pdf when passing valid data", async () => { const formData = new FormData(); + formData.append('title', 'Test Title'); formData.append('data', '{\n' + '\t\t"transaction": {\n' + '\t\t\t"id": "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz01234567890123456789",\n' + diff --git a/node/pdf-generate/handlers.js b/node/pdf-generate/handlers.js index 608bee80..5cf3f80d 100644 --- a/node/pdf-generate/handlers.js +++ b/node/pdf-generate/handlers.js @@ -71,6 +71,7 @@ const generatePdf = async function (req, res, next) { page = await browser.newPage(); let data = req.body.data; + let title = req.body.title || "Documento PDF PagoPA"; if (data == undefined) { res.status(400); @@ -99,6 +100,7 @@ const generatePdf = async function (req, res, next) { await waitForRender(page); await page.pdf({ path: path.join(workingDir, "pagopa-receipt.pdf"), + title: title, format: 'A4', landscape: false, printBackground: true, diff --git a/node/pdf-generate/helpers/eq.js b/node/pdf-generate/helpers/eq.js index 78814ed2..126c4f0d 100644 --- a/node/pdf-generate/helpers/eq.js +++ b/node/pdf-generate/helpers/eq.js @@ -1,5 +1,5 @@ var eq = function (a, b, options) { - return a === b ? options.fn(this) : null; + return a === b ? options.fn(this) : options.inverse(this); }; module.exports = eq; \ No newline at end of file diff --git a/node/pdf-generate/utils/browserManager.js b/node/pdf-generate/utils/browserManager.js index bc1b0323..310189ef 100644 --- a/node/pdf-generate/utils/browserManager.js +++ b/node/pdf-generate/utils/browserManager.js @@ -1,5 +1,4 @@ const puppeteer = require('puppeteer'); -const registerHelpers = require("handlebars-helpers"); let handlebars = require("handlebars"); let splitAndSpace = require('../helpers/splitAndSpace'); let not = require('../helpers/not') diff --git a/src/main/java/it/gov/pagopa/pdf/engine/model/AppErrorCodeEnum.java b/src/main/java/it/gov/pagopa/pdf/engine/model/AppErrorCodeEnum.java index 1ea6c80f..e8e23080 100644 --- a/src/main/java/it/gov/pagopa/pdf/engine/model/AppErrorCodeEnum.java +++ b/src/main/java/it/gov/pagopa/pdf/engine/model/AppErrorCodeEnum.java @@ -26,6 +26,8 @@ public enum AppErrorCodeEnum { PDFE_714("PDFE_708", "I/O error when reading generate type from request, and writing it to the output stream"), + PDFE_715("PDFE_715", "I/O error when reading title from request and writing it to the output stream"), + PDFE_896("PDFE_896", "Unexpected field in request body"), PDFE_897("PDFE_897", "Invalid HTML template, template not provided"), PDFE_898("PDFE_898", "Invalid document data"), @@ -41,8 +43,6 @@ public enum AppErrorCodeEnum { PDFE_907("PDFE_907", "I/O error on handling the PDF generation result"), PDFE_908("PDFE_908", "I/O error on creating the working directory"); - - private final String errorCode; private final String errorMessage; diff --git a/src/main/java/it/gov/pagopa/pdf/engine/model/GeneratePDFInput.java b/src/main/java/it/gov/pagopa/pdf/engine/model/GeneratePDFInput.java index 5c5c3239..6f8be86f 100644 --- a/src/main/java/it/gov/pagopa/pdf/engine/model/GeneratePDFInput.java +++ b/src/main/java/it/gov/pagopa/pdf/engine/model/GeneratePDFInput.java @@ -16,6 +16,7 @@ public class GeneratePDFInput { private boolean applySignature; private boolean generateZipped; private ZipFile templateZip; + private String title; private GeneratorType generatorType = GeneratorType.ITEXT; diff --git a/src/main/java/it/gov/pagopa/pdf/engine/model/PdfEngineRequest.java b/src/main/java/it/gov/pagopa/pdf/engine/model/PdfEngineRequest.java index ef4491ad..3f1dfdc8 100644 --- a/src/main/java/it/gov/pagopa/pdf/engine/model/PdfEngineRequest.java +++ b/src/main/java/it/gov/pagopa/pdf/engine/model/PdfEngineRequest.java @@ -16,8 +16,11 @@ public class PdfEngineRequest { String data; - String workingDirPath; - ZipFile template; + String workingDirPath; + + String title; + + ZipFile template; } diff --git a/src/main/java/it/gov/pagopa/pdf/engine/service/impl/GeneratePDFServiceImpl.java b/src/main/java/it/gov/pagopa/pdf/engine/service/impl/GeneratePDFServiceImpl.java index b3a77f63..7e70027f 100644 --- a/src/main/java/it/gov/pagopa/pdf/engine/service/impl/GeneratePDFServiceImpl.java +++ b/src/main/java/it/gov/pagopa/pdf/engine/service/impl/GeneratePDFServiceImpl.java @@ -34,6 +34,8 @@ public BufferedInputStream generatePDF(GeneratePDFInput generatePDFInput, Path w PdfEngineClientImpl pdfEngineClient = PdfEngineClientImpl.getInstance(); PdfEngineRequest pdfEngineRequest = new PdfEngineRequest(); + pdfEngineRequest.setTitle(generatePDFInput.getTitle() != null ? + generatePDFInput.getTitle() : "Documento PDF PagoPA"); pdfEngineRequest.setWorkingDirPath(workingDirPath.toFile().getAbsolutePath()); pdfEngineRequest.setData(ObjectMapperUtils.writeValueAsString(generatePDFInput.getData())); pdfEngineRequest.setTemplate(generatePDFInput.getTemplateZip()); diff --git a/src/main/java/it/gov/pagopa/pdf/engine/service/impl/ParseRequestBodyServiceImpl.java b/src/main/java/it/gov/pagopa/pdf/engine/service/impl/ParseRequestBodyServiceImpl.java index 0fc287ab..bd4efb2c 100644 --- a/src/main/java/it/gov/pagopa/pdf/engine/service/impl/ParseRequestBodyServiceImpl.java +++ b/src/main/java/it/gov/pagopa/pdf/engine/service/impl/ParseRequestBodyServiceImpl.java @@ -51,6 +51,9 @@ public GeneratePDFInput retrieveInputData(byte[] requestBody, Map getDocumentInputData(MultipartStream multipartStream) throws RequestBodyParseException { ByteArrayOutputStream os = new ByteArrayOutputStream(); diff --git a/src/test/java/it/gov/pagopa/pdf/engine/service/impl/GeneratePDFServiceImplTest.java b/src/test/java/it/gov/pagopa/pdf/engine/service/impl/GeneratePDFServiceImplTest.java index ba3329c0..a26a2d52 100644 --- a/src/test/java/it/gov/pagopa/pdf/engine/service/impl/GeneratePDFServiceImplTest.java +++ b/src/test/java/it/gov/pagopa/pdf/engine/service/impl/GeneratePDFServiceImplTest.java @@ -79,6 +79,7 @@ void generatePDFZippedWithSuccess() { pdfInput.setData(Collections.singletonMap("a", "b")); pdfInput.setApplySignature(false); pdfInput.setGenerateZipped(true); + pdfInput.setTitle("title"); PdfEngineResponse pdfEngineResponse = new PdfEngineResponse(); pdfEngineResponse.setStatusCode(200); diff --git a/src/test/java/it/gov/pagopa/pdf/engine/service/impl/ParseRequestBodyServiceImplTest.java b/src/test/java/it/gov/pagopa/pdf/engine/service/impl/ParseRequestBodyServiceImplTest.java index 36edbb16..23a90f9d 100644 --- a/src/test/java/it/gov/pagopa/pdf/engine/service/impl/ParseRequestBodyServiceImplTest.java +++ b/src/test/java/it/gov/pagopa/pdf/engine/service/impl/ParseRequestBodyServiceImplTest.java @@ -59,10 +59,11 @@ void retrieveInputDataSuccess() { doReturn( String.format(HEADER_TEMPLATE, "applySignature"), String.format(HEADER_TEMPLATE, "generateZipped"), + String.format(HEADER_TEMPLATE, "title"), String.format(HEADER_TEMPLATE, "data") ).when(multipartStreamMock).readHeaders(); doReturn(Collections.singletonMap("ke1", "value1")).when(objectMapperMock).readValue(anyString(), any(TypeReference.class)); - doReturn(true, true, false).when(multipartStreamMock).readBoundary(); + doReturn(true, true, true, false).when(multipartStreamMock).readBoundary(); GeneratePDFInput result = sut.retrieveInputData(new byte[2], Collections.singletonMap(CONTENT_TYPE_HEADER, CONTENT_TYPE_HEADER_VALUE), workingPath); @@ -306,4 +307,23 @@ void retrieveInputDataFailReadBoundaryThrowsMalformedStreamException() { Assertions.assertEquals(AppErrorCodeEnum.PDFE_710, e.getErrorCode()); } + + @Test + @SneakyThrows + void retrieveInputDataFailReadTitleThrowsIOException() { + MultipartStream multipartStreamMock = mock(MultipartStream.class); + + doReturn(multipartStreamMock).when(sut).getMultipartStream(any(), anyString()); + doReturn(true).when(multipartStreamMock).skipPreamble(); + doReturn(String.format(HEADER_TEMPLATE, "title")).when(multipartStreamMock).readHeaders(); + doThrow(IOException.class).when(multipartStreamMock).readBodyData(any()); + + RequestBodyParseException e = assertThrows( + RequestBodyParseException.class, + () -> sut.retrieveInputData(new byte[2], Collections.singletonMap(CONTENT_TYPE_HEADER, CONTENT_TYPE_HEADER_VALUE), workingPath) + ); + + Assertions.assertEquals(AppErrorCodeEnum.PDFE_715, e.getErrorCode()); + } + } \ No newline at end of file From 82ddf93cdd79afba78426c4253a812b569c3f5f6 Mon Sep 17 00:00:00 2001 From: acialini Date: Thu, 7 Mar 2024 10:52:08 +0100 Subject: [PATCH 2/4] [VAS-812] feat: Updated index.test.js --- node/pdf-generate/__tests__/index.test.js | 1 - 1 file changed, 1 deletion(-) diff --git a/node/pdf-generate/__tests__/index.test.js b/node/pdf-generate/__tests__/index.test.js index 501e6e1d..f4515c46 100644 --- a/node/pdf-generate/__tests__/index.test.js +++ b/node/pdf-generate/__tests__/index.test.js @@ -14,7 +14,6 @@ describe("generatePdf", () => { it("should return a pdf when passing valid data", async () => { const formData = new FormData(); - formData.append('title', 'Test Title'); formData.append('data', '{\n' + '\t\t"transaction": {\n' + '\t\t\t"id": "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz01234567890123456789",\n' + From 64bd145d203295bc00f4319c68c6d5dd32afd516 Mon Sep 17 00:00:00 2001 From: acialini Date: Thu, 7 Mar 2024 10:56:47 +0100 Subject: [PATCH 3/4] [VAS-812] feat: Updated index.test.js and handlers.js --- node/pdf-generate/__tests__/index.test.js | 1 + node/pdf-generate/handlers.js | 6 +++++- 2 files changed, 6 insertions(+), 1 deletion(-) diff --git a/node/pdf-generate/__tests__/index.test.js b/node/pdf-generate/__tests__/index.test.js index f4515c46..501e6e1d 100644 --- a/node/pdf-generate/__tests__/index.test.js +++ b/node/pdf-generate/__tests__/index.test.js @@ -14,6 +14,7 @@ describe("generatePdf", () => { it("should return a pdf when passing valid data", async () => { const formData = new FormData(); + formData.append('title', 'Test Title'); formData.append('data', '{\n' + '\t\t"transaction": {\n' + '\t\t\t"id": "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz01234567890123456789",\n' + diff --git a/node/pdf-generate/handlers.js b/node/pdf-generate/handlers.js index 5cf3f80d..4dd8db3c 100644 --- a/node/pdf-generate/handlers.js +++ b/node/pdf-generate/handlers.js @@ -71,7 +71,11 @@ const generatePdf = async function (req, res, next) { page = await browser.newPage(); let data = req.body.data; - let title = req.body.title || "Documento PDF PagoPA"; + let title = req.body.title; + + if (title == undefined) { + title = "Documento PDF PagoPA"; + } if (data == undefined) { res.status(400); From 69f53abbbac6f9a7886a4e641f4b7aa3c1a320a0 Mon Sep 17 00:00:00 2001 From: acialini Date: Thu, 7 Mar 2024 11:05:22 +0100 Subject: [PATCH 4/4] [VAS-812] feat: Updated handlers.js --- node/pdf-generate/handlers.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/node/pdf-generate/handlers.js b/node/pdf-generate/handlers.js index 4dd8db3c..c7fd258e 100644 --- a/node/pdf-generate/handlers.js +++ b/node/pdf-generate/handlers.js @@ -159,7 +159,7 @@ const waitForRender = async (page, timeout = 30000) => { } lastSize = currentSize; - await page.waitForTimeout(checkInterval); + await new Promise(r => setTimeout(r, checkInterval)) } };