From aea7e9fccf2d48bc536bf6d0bc275db8d7978ef4 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Pierre=20No=C3=ABl?= Date: Tue, 15 Mar 2022 18:51:52 +0100 Subject: [PATCH] refactor upload bootstrap --- packages/core/upload/server/bootstrap.js | 43 ++++++++++--------- .../core/upload/server/services/provider.js | 2 +- 2 files changed, 23 insertions(+), 22 deletions(-) diff --git a/packages/core/upload/server/bootstrap.js b/packages/core/upload/server/bootstrap.js index faa677b8e1..8e9dfa36fe 100644 --- a/packages/core/upload/server/bootstrap.js +++ b/packages/core/upload/server/bootstrap.js @@ -49,34 +49,35 @@ const createProvider = config => { const providerInstance = provider.init(providerOptions); - return Object.assign(Object.create(baseProvider), { - ...providerInstance, - original: providerInstance, - uploadStream(file, options = actionOptions.upload) { - return providerInstance.uploadStream(file, options); - }, - upload(file, options = actionOptions.upload) { - return providerInstance.upload(file, options); - }, - delete(file, options = actionOptions.delete) { - return providerInstance.delete(file, options); - }, + if (!providerInstance.delete) { + throw new Error(`The upload provider "${providerName}" didn't implement the delete method.`); + } + + if (!providerInstance.upload && !providerInstance.uploadStream) { + throw new Error( + `The upload provider "${providerName}" didn't implement the uploadStream nor the upload method.` + ); + } + + if (!providerInstance.uploadStream) { + process.emitWarning( + `The upload provider "${providerName}" didn't implement the uploadStream function. Strapi will fallback on the upload method. Some performance issues may occur.` + ); + } + + const wrappedProvider = _.mapValues(providerInstance, (method, methodName) => { + return async function(file, options = actionOptions[methodName]) { + return providerInstance[methodName](file, options); + }; }); + + return Object.assign(Object.create(baseProvider), wrappedProvider); }; const baseProvider = { extend(obj) { Object.assign(this, obj); }, - uploadStream() { - throw new Error('Provider uploadStream method is not implemented'); - }, - upload() { - throw new Error('Provider upload method is not implemented'); - }, - delete() { - throw new Error('Provider delete method is not implemented'); - }, }; const registerPermissionActions = async () => { diff --git a/packages/core/upload/server/services/provider.js b/packages/core/upload/server/services/provider.js index 27f13b1449..c286776016 100644 --- a/packages/core/upload/server/services/provider.js +++ b/packages/core/upload/server/services/provider.js @@ -5,7 +5,7 @@ const { streamToBuffer } = require('../utils/file'); module.exports = ({ strapi }) => ({ async upload(file) { - if (isFunction(strapi.plugin('upload').provider.original.uploadStream)) { + if (isFunction(strapi.plugin('upload').provider.uploadStream)) { file.stream = file.getStream(); await strapi.plugin('upload').provider.uploadStream(file); delete file.stream;