Skip to content

Commit

Permalink
Merge pull request #165 from bcgov/rewrite-preview
Browse files Browse the repository at this point in the history
trying to bypass blob headers
  • Loading branch information
mgtennant authored Apr 26, 2024
2 parents e2ed9d9 + 69e0be1 commit c8bb44c
Show file tree
Hide file tree
Showing 3 changed files with 47 additions and 20 deletions.
19 changes: 11 additions & 8 deletions backend/src/admin/admin.controller.ts
Original file line number Diff line number Diff line change
Expand Up @@ -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');
Expand Down
6 changes: 3 additions & 3 deletions frontend/src/app/common/api.ts
Original file line number Diff line number Diff line change
Expand Up @@ -130,10 +130,10 @@ export const handleFilePreviewGet = async (url: string, filename: string): Promi
const getParameters = generateApiParameters(url);
return new Promise<Blob>((resolve, reject) => {
fileDownloadGet<Blob>(getParameters)
.then(blob => {
.then((blob) => {
resolve(blob);
})
.catch(error => {
.catch((error) => {
console.error('Preview error:', error);
reject(error);
});
Expand All @@ -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<Blob>(getParameters)
.then(async (blob) => {
Expand Down
42 changes: 33 additions & 9 deletions frontend/src/app/common/manage-templates.ts
Original file line number Diff line number Diff line change
Expand Up @@ -56,17 +56,36 @@ export const disableProvision = async (provisionId: number): Promise<void> => {

export const previewTemplate = async (id: number, fileName: string): Promise<Blob | null> => {
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<any>(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<void> => {
const url = `${config.API_BASE_URL}/admin/download-template/${id}`;
const response = await api.handleFileDownloadGet(url, fileName);
Expand Down Expand Up @@ -94,8 +113,13 @@ export const uploadTemplate = async (formData: FormData): Promise<void> => {
await api.post<{ message: string }>(postParameters);
};

export const editTemplate = async (id: number, documentTypeId: number, documentNo: number, documentName: string): Promise<void> => {
export const editTemplate = async (
id: number,
documentTypeId: number,
documentNo: number,
documentName: string
): Promise<void> => {
const url = `${config.API_BASE_URL}/admin/update-template/${id}/${documentTypeId}/${documentNo}/${documentName}`;
const getParameters = api.generateApiParameters(url);
await api.get<void>(getParameters);
}
};

0 comments on commit c8bb44c

Please sign in to comment.