'use strict'; const _ = require('lodash'); module.exports = async ({ strapi }) => { // set plugin store const configurator = strapi.store({ type: 'plugin', name: 'upload', key: 'settings' }); strapi.plugin('upload').provider = createProvider(strapi.config.get('plugin.upload', {})); // if provider config does not exist set one by default const config = await configurator.get(); if (!config) { await configurator.set({ value: { sizeOptimization: true, responsiveDimensions: true, autoOrientation: false, }, }); } await registerPermissionActions(); }; const createProvider = config => { 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) { throw new Error(`Could not load upload provider "${providerName}".`); } const providerInstance = provider.init(providerOptions); return Object.assign(Object.create(baseProvider), { ...providerInstance, upload: (file, options = actionOptions.upload) => providerInstance.upload(file, options), delete: (file, options = actionOptions.delete) => providerInstance.delete(file, options), }); }; const baseProvider = { extend(obj) { Object.assign(this, obj); }, upload() { throw new Error('Provider upload method is not implemented'); }, delete() { throw new Error('Provider delete method is not implemented'); }, }; const registerPermissionActions = async () => { const actions = [ { section: 'plugins', displayName: 'Access the Media Library', uid: 'read', pluginName: 'upload', }, { section: 'plugins', displayName: 'Create (upload)', uid: 'assets.create', subCategory: 'assets', pluginName: 'upload', }, { section: 'plugins', displayName: 'Update (crop, details, replace) + delete', uid: 'assets.update', subCategory: 'assets', pluginName: 'upload', }, { section: 'plugins', displayName: 'Download', uid: 'assets.download', subCategory: 'assets', pluginName: 'upload', }, { section: 'plugins', displayName: 'Copy link', uid: 'assets.copy-link', subCategory: 'assets', pluginName: 'upload', }, { section: 'settings', displayName: 'Access the Media Library settings page', uid: 'settings.read', category: 'media library', pluginName: 'upload', }, ]; await strapi.admin.services.permission.actionProvider.registerMany(actions); };