diff --git a/packages/strapi-plugin-settings-manager/config/routes.json b/packages/strapi-plugin-settings-manager/config/routes.json index f4d0135605..ea0dea91ce 100644 --- a/packages/strapi-plugin-settings-manager/config/routes.json +++ b/packages/strapi-plugin-settings-manager/config/routes.json @@ -40,6 +40,22 @@ "policies": [] } }, + { + "method": "GET", + "path": "/configurations/databases/:env", + "handler": "SettingsManager.databases", + "config": { + "policies": [] + } + }, + { + "method": "GET", + "path": "/configurations/databases/:slug/:env", + "handler": "SettingsManager.database", + "config": { + "policies": [] + } + }, { "method": "GET", "path": "/configurations/:slug/:env?", diff --git a/packages/strapi-plugin-settings-manager/controllers/SettingsManager.js b/packages/strapi-plugin-settings-manager/controllers/SettingsManager.js index 4cb5b93f8f..cfd5780d00 100644 --- a/packages/strapi-plugin-settings-manager/controllers/SettingsManager.js +++ b/packages/strapi-plugin-settings-manager/controllers/SettingsManager.js @@ -22,16 +22,38 @@ module.exports = { ctx.send({ languages: Service.getLanguages() }); }, + databases: async ctx => { + const Service = strapi.plugins['settings-manager'].services.settingsmanager; + const { env } = ctx.params; + + if (env && _.isEmpty(_.find(Service.getEnvironments(), { name: env }))) return ctx.badData(null, [{ messages: [{ id: 'request.error.environment.unknow' }] }]); + + ctx.send({ databases: Service.getDatabases(env) }); + }, + + database: async ctx => { + const Service = strapi.plugins['settings-manager'].services.settingsmanager; + const { slug, env } = ctx.params; + + if (env && _.isEmpty(_.find(Service.getEnvironments(), { name: env }))) return ctx.badData(null, [{ messages: [{ id: 'request.error.environment.unknow' }] }]); + + const model = _.has(Service, slug) ? Service.database(slug, env) : undefined; + + if (_.isUndefined(model)) return ctx.badData(null, [{ messages: [{ id: 'request.error.config' }] }]); + if (_.isFunction(model)) return ctx.badData(null, [{ messages: [{ id: 'request.error.environment.required' }] }]); + + ctx.send(model); + }, + get: async ctx => { const Service = strapi.plugins['settings-manager'].services.settingsmanager; const { slug, env } = ctx.params; if (env && _.isEmpty(_.find(Service.getEnvironments(), { name: env }))) return ctx.badData(null, [{ messages: [{ id: 'request.error.environment.unknow' }] }]); - const model = Service[slug](env); + const model = _.has(Service, slug) ? Service[slug](env) : undefined; if (_.isUndefined(model)) return ctx.badData(null, [{ messages: [{ id: 'request.error.config' }] }]); - if (_.isFunction(model)) return ctx.badData(null, [{ messages: [{ id: 'request.error.environment.required' }] }]); ctx.send(model); }, @@ -43,10 +65,18 @@ module.exports = { if (env && _.isEmpty(_.find(Service.getEnvironments(), { name: env }))) return ctx.badData(null, [{ messages: [{ id: 'request.error.environment.unknow' }] }]); - const model = Service[slug](env); + let model; + if (slug === 'database') { + const name = params.database; + + model = Service.database(name, env); + + if (!_.find(Service.getDatabases(env), { name })) model = undefined; + + delete params.database; + } else model = _.has(Service, slug) ? Service[slug](env) : undefined; if (_.isUndefined(model)) return ctx.badData(null, [{ messages: [{ id: 'request.error.config' }] }]); - if (_.isFunction(model)) return ctx.badData(null, [{ messages: [{ id: 'request.error.environment.required' }] }]); const items = Service.getItems(model); diff --git a/packages/strapi-plugin-settings-manager/package.json b/packages/strapi-plugin-settings-manager/package.json index 48cddad655..e0969b3e04 100644 --- a/packages/strapi-plugin-settings-manager/package.json +++ b/packages/strapi-plugin-settings-manager/package.json @@ -37,7 +37,7 @@ "eslint-config-airbnb-base": "^9.0.0", "eslint-config-prettier": "^2.3.0", "eslint-import-resolver-webpack": "^0.6.0", - "eslint-plugin-babel": "^4.1.1", + "eslint-plugin-babel": "^4.1.2", "eslint-plugin-import": "^2.0.1", "eslint-plugin-jsx-a11y": "^2.2.3", "eslint-plugin-react": "^6.4.1", diff --git a/packages/strapi-plugin-settings-manager/services/SettingsManager.js b/packages/strapi-plugin-settings-manager/services/SettingsManager.js index 729e6ef8b1..ba5b0772fd 100644 --- a/packages/strapi-plugin-settings-manager/services/SettingsManager.js +++ b/packages/strapi-plugin-settings-manager/services/SettingsManager.js @@ -170,7 +170,9 @@ module.exports = { name: 'form.security.item.xframe.allow-from', value: 'ALLOW-FROM', items: [{ + name: '', type: 'string', + value: '', validations: { required: true } @@ -253,6 +255,75 @@ module.exports = { ] }), + database: (name, env) => ({ + name: 'form.databases.name', + description: 'form.databases.description', + sections: [ + { + name: '', + items: [ + { + name: 'form.databases.item.provider', + target: `databases.connections.${name}.connector`, + type: 'string', + value: _.get(strapi.config, `environments.${env}.databases.connections.${name}.connector`, null), + validations: { + required: true + } + }, + { + name: 'form.databases.item.host', + target: `databases.connections.${name}.settings.host`, + type: 'string', + value: _.get(strapi.config, `environments.${env}.databases.connections.${name}.settings.host`, null), + validations: { + required: true + } + }, + { + name: 'form.databases.item.username', + target: `databases.connections.${name}.settings.username`, + type: 'string', + value: _.get(strapi.config, `environments.${env}.databases.connections.${name}.settings.username`, null), + validations: { + required: true + } + }, + { + name: 'form.databases.item.password', + target: `databases.connections.${name}.settings.password`, + type: 'string', + value: _.get(strapi.config, `environments.${env}.databases.connections.${name}.settings.password`, null), + validations: {} + }, + { + name: 'form.databases.item.database', + target: `databases.connections.${name}.settings.database`, + type: 'string', + value: _.get(strapi.config, `environments.${env}.databases.connections.${name}.settings.database`, null), + validations: { + required: true + } + } + ] + }, + { + name: '', + items: [ + { + name: 'form.databases.item.default', + target: `databases.defaultConnection`, + type: 'string', + value: _.get(strapi.config, `environments.${env}.databases.defaultConnection`, null), + validations: { + required: true + } + } + ] + } + ] + }), + getEnvironments: () => { return _.map(_.keys(strapi.config.environments), environment => { return { @@ -271,6 +342,22 @@ module.exports = { }); }, + getDatabases: env => { + const databases = []; + + _.forEach(strapi.config.environments[env].databases.connections, (connection, name) => { + databases.push({ + provider: connection.connector, + name, + host: connection.settings.host, + database: connection.settings.database, + active: (strapi.config.environments[env].databases.defaultConnection = name) + }); + }); + + return databases; + }, + getItems: model => _.flatten(_.map(model.sections, section => section.items)), cleanParams: (params, items) => {