1
1
import { Browser } from 'puppeteer' ;
2
2
import { CmsArchiveContentService } from '../cms/CmsArchiveContentService' ;
3
- import { generatePdfFilename , generatePdfFooter , pixelWidthToA4Scale } from './pdf-utils' ;
3
+ import {
4
+ generateErrorFilename ,
5
+ generatePdfFilename ,
6
+ generatePdfFooter ,
7
+ pixelWidthToA4Scale ,
8
+ } from './pdf-utils' ;
4
9
import { CmsContent } from '../../../common/cms-documents/content' ;
5
10
import archiver from 'archiver' ;
6
11
import { Response } from 'express' ;
7
- import mime from 'mime' ;
8
12
import { DOWNLOAD_COOKIE_NAME } from '../../../common/downloadCookie' ;
9
13
10
14
const DEFAULT_WIDTH_PX = 1024 ;
@@ -35,21 +39,27 @@ export class PdfGenerator {
35
39
width : number = DEFAULT_WIDTH_PX
36
40
) {
37
41
if ( versionKeys . length === 0 ) {
38
- return res . status ( 400 ) . send ( ) ;
42
+ return res
43
+ . status ( 400 )
44
+ . cookie ( DOWNLOAD_COOKIE_NAME , false )
45
+ . send ( 'Version keys array must be non-empty' ) ;
39
46
}
40
47
41
48
const contentVersions = await this . contentService . getContentVersions ( versionKeys ) ;
42
49
if ( ! contentVersions || contentVersions . length === 0 ) {
43
- return res . status ( 404 ) . cookie ( DOWNLOAD_COOKIE_NAME , false ) . send ( ) ;
50
+ return res
51
+ . status ( 404 )
52
+ . cookie ( DOWNLOAD_COOKIE_NAME , false )
53
+ . send ( 'No content versions found' ) ;
44
54
}
45
55
46
56
const newestVersion = contentVersions [ 0 ] ;
47
- const oldestVersion = contentVersions . slice ( - 1 ) [ 0 ] ;
57
+ const oldestVersion = contentVersions [ contentVersions . length - 1 ] ;
48
58
49
- const zipFilename = `${ newestVersion . name } _${ newestVersion . meta . timestamp } -${ oldestVersion . meta . timestamp } .zip` ;
59
+ const zipFilename = `${ newestVersion . name } _${ oldestVersion . meta . timestamp } -${ newestVersion . meta . timestamp } .zip` ;
50
60
51
61
res . setHeader ( 'Content-Disposition' , `attachment; filename="${ zipFilename } "` )
52
- . setHeader ( 'Content-Type' , mime . lookup ( zipFilename ) || 'application/octet-stream ' )
62
+ . setHeader ( 'Content-Type' , 'application/zip ' )
53
63
. setHeader ( 'Transfer-Encoding' , 'chunked' )
54
64
. cookie ( DOWNLOAD_COOKIE_NAME , true ) ;
55
65
@@ -68,20 +78,14 @@ export class PdfGenerator {
68
78
continue ;
69
79
}
70
80
71
- await this . generateContentPdf ( content , width ) . then ( ( pdf ) => {
72
- if ( ! pdf ) {
73
- return ;
74
- }
75
-
81
+ await this . generateContentPdf ( content , width ) . then ( ( result ) => {
76
82
if ( ! res . headersSent ) {
77
83
// Set an estimate for content-length, which allows clients to track the download progress
78
84
// This header is not according to spec for chunked responses, but browsers seem to respect it
79
- res . setHeader ( 'Content-Length' , pdf . length * contentVersions . length ) ;
85
+ res . setHeader ( 'Content-Length' , result . data . length * contentVersions . length ) ;
80
86
}
81
87
82
- const fileName = generatePdfFilename ( content ) ;
83
-
84
- archive . append ( pdf , { name : fileName } ) ;
88
+ archive . append ( result . data , { name : result . filename } ) ;
85
89
} ) ;
86
90
}
87
91
@@ -97,21 +101,18 @@ export class PdfGenerator {
97
101
return null ;
98
102
}
99
103
100
- const data = await this . generateContentPdf ( content , width ) ;
101
- if ( ! data ) {
102
- return null ;
103
- }
104
-
105
- return {
106
- data,
107
- filename : generatePdfFilename ( content ) ,
108
- } ;
104
+ return this . generateContentPdf ( content , width ) ;
109
105
}
110
106
111
- private async generateContentPdf ( content : CmsContent , width : number ) : Promise < Buffer | null > {
112
- const { html } = content ;
107
+ private async generateContentPdf ( content : CmsContent , width : number ) : Promise < PdfResult > {
108
+ const { html, versionKey } = content ;
113
109
if ( ! html ) {
114
- return null ;
110
+ return {
111
+ data : Buffer . from (
112
+ `Could not generate PDF from content version ${ versionKey } - HTML field was empty`
113
+ ) ,
114
+ filename : generateErrorFilename ( content ) ,
115
+ } ;
115
116
}
116
117
117
118
const widthActual = width >= MIN_WIDTH_PX ? width : DEFAULT_WIDTH_PX ;
@@ -145,10 +146,17 @@ export class PdfGenerator {
145
146
146
147
await page . close ( ) ;
147
148
148
- return pdf ;
149
+ return {
150
+ data : pdf ,
151
+ filename : generatePdfFilename ( content ) ,
152
+ } ;
149
153
} catch ( e ) {
150
- console . error ( `Error while generating PDF - ${ e } ` ) ;
151
- return null ;
154
+ const msg = `Error while generating PDF for content version ${ versionKey } - ${ e } ` ;
155
+ console . error ( msg ) ;
156
+ return {
157
+ data : Buffer . from ( msg ) ,
158
+ filename : generateErrorFilename ( content ) ,
159
+ } ;
152
160
}
153
161
}
154
162
}
0 commit comments