From 8a9e1fc2c132139ac52596662b6dddff947bdc4c Mon Sep 17 00:00:00 2001 From: rijkvanzanten Date: Thu, 30 Jul 2020 17:56:42 -0400 Subject: [PATCH] Pass through non image assets in assets endpoint --- api/src/services/assets.ts | 36 ++++++++++++++++++++++-------------- 1 file changed, 22 insertions(+), 14 deletions(-) diff --git a/api/src/services/assets.ts b/api/src/services/assets.ts index 77def9ad65..d82ed06c52 100644 --- a/api/src/services/assets.ts +++ b/api/src/services/assets.ts @@ -18,24 +18,32 @@ export default class AssetsService { async getAsset(id: string, transformation: Transformation) { const file = await database.select('*').from('directus_files').where({ id }).first(); - const resizeOptions = this.parseTransformation(transformation); - const assetFilename = - path.basename(file.filename_disk, path.extname(file.filename_disk)) + - this.getAssetSuffix(resizeOptions) + - path.extname(file.filename_disk); + const type = file.type; - const { exists } = await storage.disk(file.storage).exists(assetFilename); + // We can only transform JPEG, PNG, and WebP + if (['image/jpeg', 'image/png', 'image/webp'].includes(type)) { + const resizeOptions = this.parseTransformation(transformation); + const assetFilename = + path.basename(file.filename_disk, path.extname(file.filename_disk)) + + this.getAssetSuffix(resizeOptions) + + path.extname(file.filename_disk); + + const { exists } = await storage.disk(file.storage).exists(assetFilename); + + if (exists) { + return { stream: storage.disk(file.storage).getStream(assetFilename), file }; + } + + const readStream = storage.disk(file.storage).getStream(file.filename_disk); + const transformer = sharp().resize(resizeOptions); + + await storage.disk(file.storage).put(assetFilename, readStream.pipe(transformer)); - if (exists) { return { stream: storage.disk(file.storage).getStream(assetFilename), file }; + } else { + const readStream = storage.disk(file.storage).getStream(file.filename_disk); + return { stream: readStream, file }; } - - const readStream = storage.disk(file.storage).getStream(file.filename_disk); - const transformer = sharp().resize(resizeOptions); - - await storage.disk(file.storage).put(assetFilename, readStream.pipe(transformer)); - - return { stream: storage.disk(file.storage).getStream(assetFilename), file }; } private parseTransformation(transformation: Transformation): ResizeOptions {