2017-11-29 15:00:50 +01:00
|
|
|
const _ = require('lodash');
|
|
|
|
|
2019-08-05 10:31:18 +02:00
|
|
|
const parseMultipartBody = require('../../utils/parse-multipart');
|
|
|
|
const uploadFiles = require('../../utils/upload-files');
|
|
|
|
|
2017-11-29 15:00:50 +01:00
|
|
|
module.exports = async (ctx, next) => {
|
|
|
|
const { source } = ctx.request.query;
|
2019-08-21 11:05:33 +02:00
|
|
|
const { model } = ctx.params;
|
2017-11-29 15:00:50 +01:00
|
|
|
|
2019-04-09 12:09:03 +02:00
|
|
|
const target = source === 'admin' ? strapi.admin : strapi.plugins[source];
|
|
|
|
|
|
|
|
if (
|
|
|
|
source &&
|
|
|
|
_.get(target, [
|
|
|
|
'config',
|
|
|
|
'layout',
|
2019-08-05 10:31:18 +02:00
|
|
|
model,
|
2019-04-09 12:09:03 +02:00
|
|
|
'actions',
|
|
|
|
ctx.request.route.action,
|
|
|
|
])
|
|
|
|
) {
|
|
|
|
const [controller, action] = _.get(
|
|
|
|
target,
|
|
|
|
[
|
|
|
|
'config',
|
|
|
|
'layout',
|
|
|
|
ctx.params.model,
|
|
|
|
'actions',
|
|
|
|
ctx.request.route.action,
|
|
|
|
],
|
2019-07-30 16:37:15 +02:00
|
|
|
[]
|
2019-04-09 12:09:03 +02:00
|
|
|
).split('.');
|
2017-11-29 15:00:50 +01:00
|
|
|
|
2017-11-29 16:10:13 +01:00
|
|
|
if (controller && action) {
|
2019-08-05 10:31:18 +02:00
|
|
|
// TODO: handle in the targeted controller directly
|
|
|
|
if (ctx.is('multipart')) {
|
|
|
|
const { data, files } = parseMultipartBody(ctx);
|
|
|
|
ctx.request.body = data;
|
|
|
|
ctx.request.files = {};
|
|
|
|
|
|
|
|
await target.controllers[controller.toLowerCase()][action](ctx);
|
|
|
|
const resBody = ctx.body;
|
|
|
|
|
|
|
|
if (ctx.status >= 300) return;
|
|
|
|
|
|
|
|
await uploadFiles(resBody, files, { model, source });
|
|
|
|
|
|
|
|
return ctx.send(resBody);
|
|
|
|
}
|
|
|
|
|
2019-04-09 12:09:03 +02:00
|
|
|
return await target.controllers[controller.toLowerCase()][action](ctx);
|
2017-11-29 16:10:13 +01:00
|
|
|
}
|
2017-11-29 15:00:50 +01:00
|
|
|
}
|
|
|
|
|
|
|
|
await next();
|
|
|
|
};
|