From c5e50665cdc6a464ed8d2687368894b6d40233cb Mon Sep 17 00:00:00 2001 From: Alexandre Bodin Date: Tue, 30 Jul 2019 16:37:15 +0200 Subject: [PATCH] Add upload route in content-manager and remove formdata for data creation --- .../config/policies/routing.js | 51 +------------ .../config/routes.json | 8 +++ .../controllers/ContentManager.js | 11 +++ .../services/ContentManager.js | 72 ------------------- .../test/index.test.e2e.js | 64 ++++++++--------- test/helpers/request.js | 14 +--- 6 files changed, 53 insertions(+), 167 deletions(-) diff --git a/packages/strapi-plugin-content-manager/config/policies/routing.js b/packages/strapi-plugin-content-manager/config/policies/routing.js index 0b03c6cb5b..13279b19c6 100644 --- a/packages/strapi-plugin-content-manager/config/policies/routing.js +++ b/packages/strapi-plugin-content-manager/config/policies/routing.js @@ -24,59 +24,10 @@ module.exports = async (ctx, next) => { 'actions', ctx.request.route.action, ], - [], + [] ).split('.'); if (controller && action) { - // Redirect to specific controller. - if ( - ctx.request.body.hasOwnProperty('fields') && - ctx.request.body.hasOwnProperty('files') - ) { - let { files, fields } = ctx.request.body; - - const parser = value => { - try { - value = JSON.parse(value); - } catch (e) { - // Silent. - } - - return _.isArray(value) ? value.map(obj => parser(obj)) : value; - }; - - fields = Object.keys(fields).reduce((acc, current) => { - acc[current] = parser(fields[current]); - - return acc; - }, {}); - - ctx.request.body = fields; - - await target.controllers[controller.toLowerCase()][action](ctx); - const resBody = ctx.body; - - await Promise.all( - Object.keys(files).map(async field => { - ctx.request.body = { - files: { - files: files[field], - }, - fields: { - refId: resBody.id || resBody._id, - ref: ctx.params.model, - source, - field, - }, - }; - - return strapi.plugins.upload.controllers.upload.upload(ctx); - }), - ); - - return ctx.send(resBody); - } - return await target.controllers[controller.toLowerCase()][action](ctx); } } diff --git a/packages/strapi-plugin-content-manager/config/routes.json b/packages/strapi-plugin-content-manager/config/routes.json index 4c47e943ea..9c01c3971e 100644 --- a/packages/strapi-plugin-content-manager/config/routes.json +++ b/packages/strapi-plugin-content-manager/config/routes.json @@ -64,6 +64,14 @@ "policies": [] } }, + { + "method": "POST", + "path": "/explorer/upload", + "handler": "ContentManager.uploadFile", + "config": { + "policies": [] + } + }, { "method": "GET", "path": "/explorer/:model", diff --git a/packages/strapi-plugin-content-manager/controllers/ContentManager.js b/packages/strapi-plugin-content-manager/controllers/ContentManager.js index a3eec8f0ad..c186577844 100644 --- a/packages/strapi-plugin-content-manager/controllers/ContentManager.js +++ b/packages/strapi-plugin-content-manager/controllers/ContentManager.js @@ -144,4 +144,15 @@ module.exports = { ctx.request.query ); }, + + /** + * Handle uploads in the explorer + */ + async uploadFile(ctx) { + if (!strapi.plugins.upload) { + ctx.send({ error: 'uploadPlugin.notInstalled' }, 400); + } + + return strapi.plugins.upload.controllers.upload.upload(ctx); + }, }; diff --git a/packages/strapi-plugin-content-manager/services/ContentManager.js b/packages/strapi-plugin-content-manager/services/ContentManager.js index 1060360aea..f7c057ceb6 100644 --- a/packages/strapi-plugin-content-manager/services/ContentManager.js +++ b/packages/strapi-plugin-content-manager/services/ContentManager.js @@ -5,27 +5,6 @@ const _ = require('lodash'); /** * A set of functions called "actions" for `ContentManager` */ - -const parseFormInput = value => { - try { - const parsed = JSON.parse(value); - // do not modify initial value if it is string except 'null' - if (typeof parsed !== 'string') { - value = parsed; - } - } catch (e) { - // Silent. - } - - return _.isArray(value) ? value.map(parseFormInput) : value; -}; - -const parseFormData = fields => - Object.keys(fields).reduce((acc, current) => { - acc[current] = parseFormInput(fields[current]); - return acc; - }, {}); - module.exports = { fetch(params, source, populate) { return strapi @@ -53,61 +32,10 @@ module.exports = { }, async add(params, values, source) { - // Multipart/form-data. - if (values.hasOwnProperty('fields') && values.hasOwnProperty('files')) { - const data = parseFormData(values.fields); - const entry = await strapi.query(params.model, source).create(data); - - // Then, request plugin upload. - if (strapi.plugins.upload && Object.keys(values.files).length > 0) { - // Upload new files and attach them to this entity. - await strapi.plugins.upload.services.upload.uploadToEntity( - { - id: entry.id || entry._id, - model: params.model, - }, - values.files, - source - ); - } - - return entry; - } - - // Create an entry using `queries` system return await strapi.query(params.model, source).create(values); }, async edit(params, values, source) { - // Multipart/form-data. - if (values.hasOwnProperty('fields') && values.hasOwnProperty('files')) { - // set empty attributes if old values was cleared - _.difference( - Object.keys(values.files), - Object.keys(values.fields) - ).forEach(attr => { - values.fields[attr] = []; - }); - - const data = parseFormData(values.fields); - const updatedEntity = await strapi - .query(params.model, source) - .update({ id: params.id }, data); - - // Then, request plugin upload. - if (strapi.plugins.upload) { - // Upload new files and attach them to this entity. - await strapi.plugins.upload.services.upload.uploadToEntity( - params, - values.files, - source - ); - } - - return updatedEntity; - } - - // Raw JSON. return strapi.query(params.model, source).update({ id: params.id }, values); }, diff --git a/packages/strapi-plugin-content-manager/test/index.test.e2e.js b/packages/strapi-plugin-content-manager/test/index.test.e2e.js index 1dad282dda..0be7ee5a46 100644 --- a/packages/strapi-plugin-content-manager/test/index.test.e2e.js +++ b/packages/strapi-plugin-content-manager/test/index.test.e2e.js @@ -57,7 +57,7 @@ describe('Content Manager End to End', () => { let { body } = await rq({ url: '/content-manager/explorer/tag/?source=content-manager', method: 'POST', - formData: { + body: { name: 'tag1', }, }); @@ -73,7 +73,7 @@ describe('Content Manager End to End', () => { let { body } = await rq({ url: '/content-manager/explorer/tag/?source=content-manager', method: 'POST', - formData: { + body: { name: 'tag2', }, }); @@ -89,7 +89,7 @@ describe('Content Manager End to End', () => { let { body } = await rq({ url: '/content-manager/explorer/tag/?source=content-manager', method: 'POST', - formData: { + body: { name: 'tag3', }, }); @@ -110,7 +110,7 @@ describe('Content Manager End to End', () => { let { body } = await rq({ url: '/content-manager/explorer/article/?source=content-manager', method: 'POST', - formData: entry, + body: entry, }); data.articles.push(body); @@ -132,7 +132,7 @@ describe('Content Manager End to End', () => { let { body } = await rq({ url: '/content-manager/explorer/article/?source=content-manager', method: 'POST', - formData: entry, + body: entry, }); data.articles.push(body); @@ -155,7 +155,7 @@ describe('Content Manager End to End', () => { let { body } = await rq({ url: `/content-manager/explorer/article/${entry.id}?source=content-manager`, method: 'PUT', - formData: entry, + body: entry, }); data.articles[0] = body; @@ -178,7 +178,7 @@ describe('Content Manager End to End', () => { let { body } = await rq({ url: `/content-manager/explorer/article/${entry.id}?source=content-manager`, method: 'PUT', - formData: entry, + body: entry, }); data.articles[0] = body; @@ -199,7 +199,7 @@ describe('Content Manager End to End', () => { let { body } = await rq({ url: `/content-manager/explorer/article/${entry.id}?source=content-manager`, method: 'PUT', - formData: entry, + body: entry, }); data.articles[0] = body; @@ -221,7 +221,7 @@ describe('Content Manager End to End', () => { let { body } = await rq({ url: `/content-manager/explorer/article/${entry.id}?source=content-manager`, method: 'PUT', - formData: entry, + body: entry, }); data.articles[0] = body; @@ -237,7 +237,7 @@ describe('Content Manager End to End', () => { const { body: createdTag } = await rq({ url: '/content-manager/explorer/tag/?source=content-manager', method: 'POST', - formData: { + body: { name: 'tag11', }, }); @@ -245,7 +245,7 @@ describe('Content Manager End to End', () => { const { body: article12 } = await rq({ url: '/content-manager/explorer/article/?source=content-manager', method: 'POST', - formData: { + body: { title: 'article12', content: 'Content', tags: [createdTag], @@ -260,7 +260,7 @@ describe('Content Manager End to End', () => { const { body: article13 } = await rq({ url: '/content-manager/explorer/article/?source=content-manager', method: 'POST', - formData: { + body: { title: 'article13', content: 'Content', tags: [updatedTag], @@ -308,7 +308,7 @@ describe('Content Manager End to End', () => { let { body } = await rq({ url: '/content-manager/explorer/articlewithtag/?source=content-manager', method: 'POST', - formData: entry, + body: entry, }); expect(body.id); @@ -330,7 +330,7 @@ describe('Content Manager End to End', () => { let { body } = await rq({ url: '/content-manager/explorer/category/?source=content-manager', method: 'POST', - formData: { + body: { name: 'cat1', }, }); @@ -346,7 +346,7 @@ describe('Content Manager End to End', () => { let { body } = await rq({ url: '/content-manager/explorer/category/?source=content-manager', method: 'POST', - formData: { + body: { name: 'cat2', }, }); @@ -368,7 +368,7 @@ describe('Content Manager End to End', () => { let { body } = await rq({ url: '/content-manager/explorer/article/?source=content-manager', method: 'POST', - formData: entry, + body: entry, }); data.articles.push(body); @@ -390,7 +390,7 @@ describe('Content Manager End to End', () => { let { body } = await rq({ url: `/content-manager/explorer/article/${entry.id}?source=content-manager`, method: 'PUT', - formData: entry, + body: entry, }); data.articles[0] = body; @@ -411,7 +411,7 @@ describe('Content Manager End to End', () => { let { body } = await rq({ url: '/content-manager/explorer/article?source=content-manager', method: 'POST', - formData: entry, + body: entry, }); data.articles.push(body); @@ -432,7 +432,7 @@ describe('Content Manager End to End', () => { let { body } = await rq({ url: `/content-manager/explorer/article/${entry.id}?source=content-manager`, method: 'PUT', - formData: entry, + body: entry, }); data.articles[1] = body; @@ -453,7 +453,7 @@ describe('Content Manager End to End', () => { let { body } = await rq({ url: `/content-manager/explorer/category/${entry.id}?source=content-manager`, method: 'PUT', - formData: entry, + body: entry, }); data.categories[0] = body; @@ -473,7 +473,7 @@ describe('Content Manager End to End', () => { let { body } = await rq({ url: '/content-manager/explorer/category/?source=content-manager', method: 'POST', - formData: entry, + body: entry, }); data.categories.push(body); @@ -549,7 +549,7 @@ describe('Content Manager End to End', () => { let { body } = await rq({ url: '/content-manager/explorer/reference/?source=content-manager', method: 'POST', - formData: { + body: { name: 'ref1', }, }); @@ -569,7 +569,7 @@ describe('Content Manager End to End', () => { let { body } = await rq({ url: '/content-manager/explorer/article?source=content-manager', method: 'POST', - formData: entry, + body: entry, }); data.articles.push(body); @@ -589,7 +589,7 @@ describe('Content Manager End to End', () => { let { body } = await rq({ url: `/content-manager/explorer/article/${entry.id}?source=content-manager`, method: 'PUT', - formData: entry, + body: entry, }); data.articles[0] = body; @@ -610,7 +610,7 @@ describe('Content Manager End to End', () => { let { body } = await rq({ url: '/content-manager/explorer/article?source=content-manager', method: 'POST', - formData: entry, + body: entry, }); data.articles.push(body); @@ -627,7 +627,7 @@ describe('Content Manager End to End', () => { const { body: tagToCreate } = await rq({ url: '/content-manager/explorer/tag/?source=content-manager', method: 'POST', - formData: { + body: { name: 'tag111', }, }); @@ -635,7 +635,7 @@ describe('Content Manager End to End', () => { const { body: referenceToCreate } = await rq({ url: '/content-manager/explorer/reference/?source=content-manager', method: 'POST', - formData: { + body: { name: 'cat111', tag: tagToCreate, }, @@ -648,7 +648,7 @@ describe('Content Manager End to End', () => { const { body: tagToCreate } = await rq({ url: '/content-manager/explorer/tag/?source=content-manager', method: 'POST', - formData: { + body: { name: 'tag111', }, }); @@ -656,7 +656,7 @@ describe('Content Manager End to End', () => { const { body: referenceToCreate } = await rq({ url: '/content-manager/explorer/reference/?source=content-manager', method: 'POST', - formData: { + body: { name: 'cat111', tag: tagToCreate, }, @@ -667,7 +667,7 @@ describe('Content Manager End to End', () => { const { body: referenceToUpdate } = await rq({ url: `/content-manager/explorer/reference/${referenceToCreate.id}?source=content-manager`, method: 'PUT', - formData: { + body: { tag: null, }, }); @@ -679,7 +679,7 @@ describe('Content Manager End to End', () => { const { body: tagToCreate } = await rq({ url: '/content-manager/explorer/tag/?source=content-manager', method: 'POST', - formData: { + body: { name: 'tag111', }, }); @@ -687,7 +687,7 @@ describe('Content Manager End to End', () => { const { body: referenceToCreate } = await rq({ url: '/content-manager/explorer/reference/?source=content-manager', method: 'POST', - formData: { + body: { name: 'cat111', tag: tagToCreate, }, diff --git a/test/helpers/request.js b/test/helpers/request.js index 7d88c36a22..961fb79184 100644 --- a/test/helpers/request.js +++ b/test/helpers/request.js @@ -1,25 +1,13 @@ const request = require('request-promise-native'); const createRequest = (defaults = {}) => { - const client = request.defaults({ + return request.defaults({ baseUrl: 'http://localhost:1337', json: true, resolveWithFullResponse: true, simple: false, ...defaults, }); - - return async options => { - const params = JSON.parse(JSON.stringify(options)); - - for (let key in params.formData) { - if (typeof params.formData[key] === 'object') { - params.formData[key] = JSON.stringify(params.formData[key]); - } - } - - return client(params); - }; }; const createAuthRequest = token => {