mirror of
https://github.com/strapi/strapi.git
synced 2025-07-04 23:52:10 +00:00
163 lines
4.1 KiB
JavaScript
163 lines
4.1 KiB
JavaScript
'use strict';
|
|
|
|
/**
|
|
* Upload.js controller
|
|
*
|
|
* @description: A set of functions called "actions" of the `upload` plugin.
|
|
*/
|
|
|
|
const _ = require('lodash');
|
|
|
|
module.exports = {
|
|
upload: async (ctx) => {
|
|
// Retrieve provider configuration.
|
|
const config = await strapi.store({
|
|
environment: strapi.config.environment,
|
|
type: 'plugin',
|
|
name: 'upload'
|
|
}).get({ key: 'provider' });
|
|
|
|
// Verify if the file upload is enable.
|
|
if (config.enabled === false) {
|
|
strapi.log.error('File upload is disabled');
|
|
return ctx.badRequest(null, ctx.request.admin ? [{ messages: [{ id: 'Upload.status.disabled' }] }] : 'File upload is disabled');
|
|
}
|
|
|
|
// Extract optional relational data.
|
|
const { refId, ref, source, field } = ctx.request.body.fields;
|
|
const { files = {} } = ctx.request.body.files;
|
|
|
|
if (_.isEmpty(files)) {
|
|
return ctx.send(true);
|
|
}
|
|
|
|
// Transform stream files to buffer
|
|
const buffers = await strapi.plugins.upload.services.upload.bufferize(ctx.request.body.files.files);
|
|
const enhancedFiles = buffers.map(file => {
|
|
if (file.size > config.sizeLimit) {
|
|
return ctx.badRequest(null, ctx.request.admin ? [{ messages: [{ id: 'Upload.status.sizeLimit', values: {file: file.name} }] }] : `${file.name} file is bigger than limit size!`);
|
|
}
|
|
|
|
// Add details to the file to be able to create the relationships.
|
|
if (refId && ref && field) {
|
|
Object.assign(file, {
|
|
related: [{
|
|
refId,
|
|
ref,
|
|
source,
|
|
field
|
|
}]
|
|
});
|
|
}
|
|
|
|
return file;
|
|
});
|
|
|
|
// Something is wrong (size limit)...
|
|
if (ctx.status === 400) {
|
|
return;
|
|
}
|
|
|
|
const uploadedFiles = await strapi.plugins.upload.services.upload.upload(enhancedFiles, config);
|
|
|
|
// Send 200 `ok`
|
|
ctx.send(uploadedFiles.map((file) => {
|
|
// If is local server upload, add backend host as prefix
|
|
if (file.url && file.url[0] === '/') {
|
|
file.url = strapi.config.url + file.url;
|
|
}
|
|
|
|
if (_.isArray(file.related)) {
|
|
file.related = file.related.map(obj => obj.ref || obj);
|
|
}
|
|
|
|
return file;
|
|
}));
|
|
},
|
|
|
|
getEnvironments: async (ctx) => {
|
|
const environments = _.map(_.keys(strapi.config.environments), environment => {
|
|
return {
|
|
name: environment,
|
|
active: (strapi.config.environment === environment)
|
|
};
|
|
});
|
|
|
|
ctx.send({ environments });
|
|
},
|
|
|
|
getSettings: async (ctx) => {
|
|
const config = await strapi.store({
|
|
environment: ctx.params.environment,
|
|
type: 'plugin',
|
|
name: 'upload'
|
|
}).get({key: 'provider'});
|
|
|
|
ctx.send({
|
|
providers: strapi.plugins.upload.config.providers,
|
|
config
|
|
});
|
|
},
|
|
|
|
updateSettings: async (ctx) => {
|
|
await strapi.store({
|
|
environment: ctx.params.environment,
|
|
type: 'plugin',
|
|
name: 'upload'
|
|
}).set({key: 'provider', value: ctx.request.body});
|
|
|
|
ctx.send({ok: true});
|
|
},
|
|
|
|
find: async (ctx) => {
|
|
const data = await strapi.plugins['upload'].services.upload.fetchAll(ctx.query);
|
|
|
|
// Send 200 `ok`
|
|
ctx.send(data.map((file) => {
|
|
// if is local server upload, add backend host as prefix
|
|
if (file.url[0] === '/') {
|
|
file.url = strapi.config.url + file.url;
|
|
}
|
|
|
|
return file;
|
|
}));
|
|
},
|
|
|
|
findOne: async (ctx) => {
|
|
const data = await strapi.plugins['upload'].services.upload.fetch(ctx.params);
|
|
|
|
data.url = strapi.config.url + data.url;
|
|
|
|
// Send 200 `ok`
|
|
ctx.send(data);
|
|
},
|
|
|
|
count: async (ctx) => {
|
|
const data = await strapi.plugins['upload'].services.upload.count(ctx.query);
|
|
|
|
// Send 200 `ok`
|
|
ctx.send({
|
|
count: data
|
|
});
|
|
},
|
|
|
|
destroy: async (ctx) => {
|
|
const config = await strapi.store({
|
|
environment: strapi.config.environment,
|
|
type: 'plugin',
|
|
name: 'upload'
|
|
}).get({key: 'provider'});
|
|
|
|
const data = await strapi.plugins['upload'].services.upload.remove(ctx.params, config);
|
|
|
|
// Send 200 `ok`
|
|
ctx.send(data);
|
|
},
|
|
|
|
search: async (ctx) => {
|
|
const data = await strapi.query('file', 'upload').search(ctx.params);
|
|
|
|
ctx.send(data);
|
|
},
|
|
};
|