2021-09-28 15:17:13 +02:00
'use strict' ;
2022-09-13 10:21:30 +02:00
const { PayloadTooLargeError } = require ( '@strapi/utils/lib/errors' ) ;
2022-05-09 10:06:47 +02:00
const _ = require ( 'lodash' ) ;
2021-09-29 16:34:37 +02:00
const registerUploadMiddleware = require ( './middlewares/upload' ) ;
2022-09-13 10:21:30 +02:00
const { kbytesToBytes } = require ( './utils/file' ) ;
2021-09-28 15:17:13 +02:00
2021-09-29 10:47:10 +02:00
/ * *
* Register upload plugin
* @ param { { strapi : import ( '@strapi/strapi' ) . Strapi } }
* /
2021-09-29 09:52:15 +02:00
module . exports = async ( { strapi } ) => {
2022-05-09 10:06:47 +02:00
strapi . plugin ( 'upload' ) . provider = createProvider ( strapi . config . get ( 'plugin.upload' , { } ) ) ;
2021-09-29 16:34:37 +02:00
await registerUploadMiddleware ( { strapi } ) ;
2021-09-29 09:52:15 +02:00
2021-09-10 15:54:19 +02:00
if ( strapi . plugin ( 'graphql' ) ) {
require ( './graphql' ) ( { strapi } ) ;
}
2021-09-28 15:17:13 +02:00
} ;
2022-05-09 10:06:47 +02:00
2022-08-08 23:33:39 +02:00
const createProvider = ( config ) => {
2022-05-09 10:06:47 +02:00
const { providerOptions , actionOptions = { } } = config ;
const providerName = _ . toLower ( config . provider ) ;
let provider ;
let modulePath ;
try {
modulePath = require . resolve ( ` @strapi/provider-upload- ${ providerName } ` ) ;
} catch ( error ) {
if ( error . code === 'MODULE_NOT_FOUND' ) {
modulePath = providerName ;
} else {
throw error ;
}
}
try {
provider = require ( modulePath ) ;
} catch ( err ) {
2022-05-09 15:02:39 +02:00
const newError = new Error ( ` Could not load upload provider " ${ providerName } ". ` ) ;
newError . stack = err . stack ;
throw newError ;
2022-05-09 10:06:47 +02:00
}
const providerInstance = provider . init ( providerOptions ) ;
if ( ! providerInstance . delete ) {
throw new Error ( ` The upload provider " ${ providerName } " doesn't implement the delete method. ` ) ;
}
if ( ! providerInstance . upload && ! providerInstance . uploadStream ) {
throw new Error (
` The upload provider " ${ providerName } " doesn't implement the uploadStream nor the upload method. `
) ;
}
if ( ! providerInstance . uploadStream ) {
process . emitWarning (
` The upload provider " ${ providerName } " doesn't implement the uploadStream function. Strapi will fallback on the upload method. Some performance issues may occur. `
) ;
}
2022-09-13 16:14:34 +02:00
const wrappedProvider = _ . mapValues ( providerInstance , ( method , methodName ) => {
return async ( file , options = actionOptions [ methodName ] ) =>
providerInstance [ methodName ] ( file , options ) ;
} ) ;
2022-09-13 10:21:30 +02:00
2022-09-13 16:14:34 +02:00
const baseProvider = {
extend ( obj ) {
Object . assign ( this , obj ) ;
} ,
checkFileSize ( file ) {
2022-09-13 10:21:30 +02:00
const fileSize = kbytesToBytes ( file . size ) ;
2022-09-13 16:14:34 +02:00
if ( config . sizeLimit && fileSize > config . sizeLimit ) {
2022-09-13 10:21:30 +02:00
throw new PayloadTooLargeError ( ) ;
}
2022-09-13 16:14:34 +02:00
} ,
} ;
2022-05-09 10:06:47 +02:00
return Object . assign ( Object . create ( baseProvider ) , wrappedProvider ) ;
} ;