From 69e0be140e4e35bb2d320e7ae322d0723f00f69b Mon Sep 17 00:00:00 2001 From: mgtennant <100305096+mgtennant@users.noreply.github.com> Date: Fri, 26 Apr 2024 16:08:34 -0700 Subject: [PATCH] trying to bypass blob headers --- backend/src/admin/admin.controller.ts | 19 ++++++---- frontend/src/app/common/api.ts | 6 +-- frontend/src/app/common/manage-templates.ts | 42 ++++++++++++++++----- 3 files changed, 47 insertions(+), 20 deletions(-) diff --git a/backend/src/admin/admin.controller.ts b/backend/src/admin/admin.controller.ts index eeb92351..01751676 100644 --- a/backend/src/admin/admin.controller.ts +++ b/backend/src/admin/admin.controller.ts @@ -81,15 +81,18 @@ export class AdminController { @Get('preview-template/:id') async previewTemplate(@Param('id') id: number, @Res() res) { try { + // const pdfBuffer = await this.adminService.getPreviewPdf(id); + // const streamableFile = new stream.PassThrough(); + // streamableFile.end(pdfBuffer); + // res.set({ + // 'Content-Type': 'application/pdf', + // 'Content-Disposition': 'inline; filename=preview.pdf', + // 'Content-Security-Policy': "default-src 'self' https://*.gov.bc.ca data:; frame-src 'self' blob:;", + // }); + // streamableFile.pipe(res); const pdfBuffer = await this.adminService.getPreviewPdf(id); - const streamableFile = new stream.PassThrough(); - streamableFile.end(pdfBuffer); - res.set({ - 'Content-Type': 'application/pdf', - 'Content-Disposition': 'inline; filename=preview.pdf', - 'Content-Security-Policy': "default-src 'self' https://*.gov.bc.ca data:; frame-src 'self' blob:;", - }); - streamableFile.pipe(res); + const base64Data = pdfBuffer.toString('base64'); + res.json({ data: base64Data }); } catch (error) { console.error('Error:', error); res.status(500).send('Internal Server Error'); diff --git a/frontend/src/app/common/api.ts b/frontend/src/app/common/api.ts index e4d6285e..529769f5 100644 --- a/frontend/src/app/common/api.ts +++ b/frontend/src/app/common/api.ts @@ -130,10 +130,10 @@ export const handleFilePreviewGet = async (url: string, filename: string): Promi const getParameters = generateApiParameters(url); return new Promise((resolve, reject) => { fileDownloadGet(getParameters) - .then(blob => { + .then((blob) => { resolve(blob); }) - .catch(error => { + .catch((error) => { console.error('Preview error:', error); reject(error); }); @@ -153,7 +153,7 @@ export const handleFilePreviewGet = async (url: string, filename: string): Promi export const handleFileDownloadGet = async (url: string, filename: string) => { const getParameters = generateApiParameters(url); - console.log(getParameters) + console.log(getParameters); await fileDownloadGet(getParameters) .then(async (blob) => { diff --git a/frontend/src/app/common/manage-templates.ts b/frontend/src/app/common/manage-templates.ts index 4175d7d7..b3a57d78 100644 --- a/frontend/src/app/common/manage-templates.ts +++ b/frontend/src/app/common/manage-templates.ts @@ -56,17 +56,36 @@ export const disableProvision = async (provisionId: number): Promise => { export const previewTemplate = async (id: number, fileName: string): Promise => { const url = `${config.API_BASE_URL}/admin/preview-template/${id}`; - const response = await api.handleFilePreviewGet(url, fileName); - if (response) { - console.log('Preview response:'); - console.log(response); - return response; - } else { - console.log('Preview response was null or there was an error.'); + try { + const getParameters = api.generateApiParameters(url); + const response = await api.get(getParameters); + const base64Data = response.data; + const blob = base64ToBlob(base64Data, 'application/pdf'); + return blob; + } catch (error) { + console.error('Error retrieving preview:', error); return null; } }; +// util for previewTemplate +function base64ToBlob(base64: string, mime: string): Blob { + const byteCharacters = atob(base64); + const byteArrays = []; + + for (let offset = 0; offset < byteCharacters.length; offset += 512) { + const slice = byteCharacters.slice(offset, offset + 512); + const byteNumbers = new Array(slice.length); + for (let i = 0; i < slice.length; i++) { + byteNumbers[i] = slice.charCodeAt(i); + } + const byteArray = new Uint8Array(byteNumbers); + byteArrays.push(byteArray); + } + + return new Blob(byteArrays, { type: mime }); +} + export const downloadTemplate = async (id: number, fileName: string): Promise => { const url = `${config.API_BASE_URL}/admin/download-template/${id}`; const response = await api.handleFileDownloadGet(url, fileName); @@ -94,8 +113,13 @@ export const uploadTemplate = async (formData: FormData): Promise => { await api.post<{ message: string }>(postParameters); }; -export const editTemplate = async (id: number, documentTypeId: number, documentNo: number, documentName: string): Promise => { +export const editTemplate = async ( + id: number, + documentTypeId: number, + documentNo: number, + documentName: string +): Promise => { const url = `${config.API_BASE_URL}/admin/update-template/${id}/${documentTypeId}/${documentNo}/${documentName}`; const getParameters = api.generateApiParameters(url); await api.get(getParameters); -} +};