1
1
import { CmsArchiveOpenSearchClient } from '../opensearch/CmsArchiveOpenSearchClient' ;
2
2
import express , { Express , Response , Router } from 'express' ;
3
3
import { CmsArchiveContentService } from './CmsArchiveContentService' ;
4
- import { parseQueryParamsList } from '../utils/queryParams' ;
4
+ import { parseNumberParam , parseQueryParamsList } from '../utils/queryParams' ;
5
5
import mime from 'mime' ;
6
- import { HtmlRenderer } from '../site/ ssr/htmlRenderer' ;
6
+ import { HtmlRenderer } from '../ssr/htmlRenderer' ;
7
7
import { transformQueryToContentSearchParams } from '../opensearch/queries/contentSearch' ;
8
8
import { CmsArchiveCategoriesService } from './CmsArchiveCategoriesService' ;
9
9
import { cspMiddleware } from '../routing/csp' ;
10
10
import { CmsArchiveBinariesService } from './CmsArchiveBinariesService' ;
11
- import { PdfGenerator } from '../site/ pdf/PdfGenerator' ;
11
+ import { PdfGenerator } from '../pdf/PdfGenerator' ;
12
12
import { Browser } from 'puppeteer' ;
13
13
14
14
export type CmsArchiveSiteConfig = {
@@ -151,12 +151,53 @@ export class CmsArchiveSite {
151
151
}
152
152
153
153
private setupFileRoutes ( router : Router ) {
154
- router . get ( '/pdf/:versionKeys' , async ( req , res , next ) => {
155
- const versionKeys = req . params . versionKeys . split ( ',' ) ;
154
+ router . get ( '/pdf/single/:versionKey' , async ( req , res , next ) => {
155
+ const result = await this . pdfGenerator . generatePdfFromVersion (
156
+ req . params . versionKey ,
157
+ parseNumberParam ( req . query . width )
158
+ ) ;
159
+
160
+ if ( ! result ) {
161
+ return next ( ) ;
162
+ }
163
+
164
+ const { filename, data } = result ;
165
+
166
+ const contentType = mime . lookup ( filename ) || 'application/octet-stream' ;
167
+
168
+ return res
169
+ . setHeader ( 'Content-Disposition' , `attachment; filename="${ filename } "` )
170
+ . setHeader ( 'Content-Type' , contentType )
171
+ . send ( data ) ;
172
+ } ) ;
173
+
174
+ router . get ( '/pdf/multi/:versionKeys' , async ( req , res , next ) => {
175
+ const result = await this . pdfGenerator . generatePdfFromVersions (
176
+ req . params . versionKeys . split ( ',' ) ,
177
+ parseNumberParam ( req . query . width )
178
+ ) ;
179
+
180
+ if ( ! result ) {
181
+ return next ( ) ;
182
+ }
183
+
184
+ const { filename, dataStream } = result ;
185
+
186
+ const contentType = mime . lookup ( filename ) || 'application/octet-stream' ;
187
+
188
+ res . setHeader ( 'Content-Disposition' , `attachment; filename="${ filename } "` ) . setHeader (
189
+ 'Content-Type' ,
190
+ contentType
191
+ ) ;
156
192
157
- const pdfs = this . pdfGenerator . generatePdfFromVersions ( versionKeys ) ;
193
+ dataStream . on ( 'data' , ( chunk ) => {
194
+ res . write ( chunk ) ;
195
+ } ) ;
158
196
159
- // return this.fileResponse(`${contentVersion.displayName}-${con}`);
197
+ dataStream . on ( 'end' , ( ) => {
198
+ console . log ( `Finished streaming file ${ filename } ` ) ;
199
+ res . end ( ) ;
200
+ } ) ;
160
201
} ) ;
161
202
162
203
router . get ( '/binary/file/:binaryKey' , async ( req , res , next ) => {
@@ -167,7 +208,7 @@ export class CmsArchiveSite {
167
208
return next ( ) ;
168
209
}
169
210
170
- return this . fileResponse (
211
+ return this . cmsBinaryResponse (
171
212
binary . filename ,
172
213
binary . data ,
173
214
`attachment; filename="${ binary . filename } "` ,
@@ -181,7 +222,7 @@ export class CmsArchiveSite {
181
222
return next ( ) ;
182
223
}
183
224
184
- return this . fileResponse ( file . filename , file . data , 'inline' , res ) ;
225
+ return this . cmsBinaryResponse ( file . filename , file . data , 'inline' , res ) ;
185
226
} ) ;
186
227
187
228
router . use ( '/*/_image/:contentKey.:extension' , async ( req , res , next ) => {
@@ -190,6 +231,7 @@ export class CmsArchiveSite {
190
231
return next ( ) ;
191
232
}
192
233
234
+ // The last item in the binaries array of an image content is the source file
193
235
const binaryKey = content . binaries ?. slice ( - 1 ) ?. [ 0 ] . key ;
194
236
if ( ! binaryKey ) {
195
237
return next ( ) ;
@@ -200,7 +242,7 @@ export class CmsArchiveSite {
200
242
return next ( ) ;
201
243
}
202
244
203
- return this . fileResponse ( binary . filename , binary . data , 'inline' , res ) ;
245
+ return this . cmsBinaryResponse ( binary . filename , binary . data , 'inline' , res ) ;
204
246
} ) ;
205
247
206
248
router . use ( '/*/_image/:contentKey/label/:label.:extension' , async ( req , res , next ) => {
@@ -221,21 +263,21 @@ export class CmsArchiveSite {
221
263
return next ( ) ;
222
264
}
223
265
224
- return this . fileResponse ( binary . filename , binary . data , 'inline' , res ) ;
266
+ return this . cmsBinaryResponse ( binary . filename , binary . data , 'inline' , res ) ;
225
267
} ) ;
226
268
}
227
269
228
- private fileResponse (
270
+ private cmsBinaryResponse (
229
271
filename : string ,
230
- data : string ,
272
+ base64Data : string ,
231
273
contentDisposition : string ,
232
274
res : Response
233
275
) {
234
276
const contentType = mime . lookup ( filename ) || 'application/octet-stream' ;
235
277
236
278
return res
237
- . setHeader ( 'Content-Dispositon ' , contentDisposition )
279
+ . setHeader ( 'Content-Disposition ' , contentDisposition )
238
280
. setHeader ( 'Content-Type' , contentType )
239
- . send ( Buffer . from ( data , 'base64' ) ) ;
281
+ . send ( Buffer . from ( base64Data , 'base64' ) ) ;
240
282
}
241
283
}
0 commit comments