From 2d7454553ab250c491c71e6f15a0786e44d16e16 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Pierre=20No=C3=ABl?= Date: Fri, 13 Aug 2021 15:35:19 +0200 Subject: [PATCH] add extension system for content-types --- examples/getstarted/extensions.old/index.js | 11 +++ .../extensions.old/upload/config/settings.js | 8 ++ .../users-permissions/config/jwt.js | 3 + .../config/policies/customPolicy.js | 0 .../users-permissions/config/routes.json | 0 .../config/schema.graphql.js | 0 .../controllers/users-permissions.js | 0 .../models/Role.settings.json | 0 .../users-permissions/models/User.config.js | 0 .../models/User.settings.json | 0 .../users-permissions/config/jwt.js | 2 +- .../content-types/role/schema.json | 44 ++++++++++ .../content-types/user/schema.json | 84 +++++++++++++++++++ .../users-permissions/strapi-server.js | 16 ++++ .../server/content-types/index.js | 3 - .../core/content-manager/strapi-server.js | 3 - .../services/schema-builder/index.js | 5 +- packages/core/strapi/lib/Strapi.js | 2 +- .../lib/core/domain/module/validation.js | 2 +- packages/core/strapi/lib/core/fs.js | 11 ++- .../strapi/lib/core/load-plugins/index.js | 44 +++++++--- .../core/strapi/lib/core/loaders/bootstrap.js | 16 ++-- .../lib/core/registries/content-types.js | 19 ++++- .../core/upload/server/content-types/index.js | 8 +- packages/plugins/graphql/strapi-server.js | 2 +- .../i18n/server/content-types/index.js | 4 +- .../plugins/i18n/server/services/core-api.js | 17 +++- .../config/functions/bootstrap.js | 8 +- .../users-permissions/server/config.js | 11 ++- .../server/content-types/index.js | 16 ++-- .../users-permissions/strapi-server.js | 3 +- test/helpers/generators.js | 2 +- 32 files changed, 281 insertions(+), 63 deletions(-) create mode 100644 examples/getstarted/extensions.old/index.js create mode 100644 examples/getstarted/extensions.old/upload/config/settings.js create mode 100644 examples/getstarted/extensions.old/users-permissions/config/jwt.js rename examples/getstarted/{extensions => extensions.old}/users-permissions/config/policies/customPolicy.js (100%) rename examples/getstarted/{extensions => extensions.old}/users-permissions/config/routes.json (100%) rename examples/getstarted/{extensions => extensions.old}/users-permissions/config/schema.graphql.js (100%) rename examples/getstarted/{extensions => extensions.old}/users-permissions/controllers/users-permissions.js (100%) rename examples/getstarted/{extensions => extensions.old}/users-permissions/models/Role.settings.json (100%) rename examples/getstarted/{extensions => extensions.old}/users-permissions/models/User.config.js (100%) rename examples/getstarted/{extensions => extensions.old}/users-permissions/models/User.settings.json (100%) create mode 100644 examples/getstarted/extensions/users-permissions/content-types/role/schema.json create mode 100644 examples/getstarted/extensions/users-permissions/content-types/user/schema.json create mode 100644 examples/getstarted/extensions/users-permissions/strapi-server.js delete mode 100644 packages/core/content-manager/server/content-types/index.js diff --git a/examples/getstarted/extensions.old/index.js b/examples/getstarted/extensions.old/index.js new file mode 100644 index 0000000000..5252c0cc80 --- /dev/null +++ b/examples/getstarted/extensions.old/index.js @@ -0,0 +1,11 @@ +'use strict'; + +module.exports = ({ env }) => ({ + 'users-permissions': { + contentTypes: { + users: { + schema: 'users-permissions/models/user.json', + }, + }, + }, +}); diff --git a/examples/getstarted/extensions.old/upload/config/settings.js b/examples/getstarted/extensions.old/upload/config/settings.js new file mode 100644 index 0000000000..621dcbf782 --- /dev/null +++ b/examples/getstarted/extensions.old/upload/config/settings.js @@ -0,0 +1,8 @@ +module.exports = { + // provider: 'cloudinary', + // providerOptions: { + // cloud_name: 'cloud-name', + // api_key: 'api-key', + // api_secret: 'api-secret', + // }, +}; diff --git a/examples/getstarted/extensions.old/users-permissions/config/jwt.js b/examples/getstarted/extensions.old/users-permissions/config/jwt.js new file mode 100644 index 0000000000..babeb1230c --- /dev/null +++ b/examples/getstarted/extensions.old/users-permissions/config/jwt.js @@ -0,0 +1,3 @@ +module.exports = { + jwtSecret: process.env.JWT_SECRET || 'c4dc6f71-db45-49c6-82d0-9ca91cb93fa2', +}; diff --git a/examples/getstarted/extensions/users-permissions/config/policies/customPolicy.js b/examples/getstarted/extensions.old/users-permissions/config/policies/customPolicy.js similarity index 100% rename from examples/getstarted/extensions/users-permissions/config/policies/customPolicy.js rename to examples/getstarted/extensions.old/users-permissions/config/policies/customPolicy.js diff --git a/examples/getstarted/extensions/users-permissions/config/routes.json b/examples/getstarted/extensions.old/users-permissions/config/routes.json similarity index 100% rename from examples/getstarted/extensions/users-permissions/config/routes.json rename to examples/getstarted/extensions.old/users-permissions/config/routes.json diff --git a/examples/getstarted/extensions/users-permissions/config/schema.graphql.js b/examples/getstarted/extensions.old/users-permissions/config/schema.graphql.js similarity index 100% rename from examples/getstarted/extensions/users-permissions/config/schema.graphql.js rename to examples/getstarted/extensions.old/users-permissions/config/schema.graphql.js diff --git a/examples/getstarted/extensions/users-permissions/controllers/users-permissions.js b/examples/getstarted/extensions.old/users-permissions/controllers/users-permissions.js similarity index 100% rename from examples/getstarted/extensions/users-permissions/controllers/users-permissions.js rename to examples/getstarted/extensions.old/users-permissions/controllers/users-permissions.js diff --git a/examples/getstarted/extensions/users-permissions/models/Role.settings.json b/examples/getstarted/extensions.old/users-permissions/models/Role.settings.json similarity index 100% rename from examples/getstarted/extensions/users-permissions/models/Role.settings.json rename to examples/getstarted/extensions.old/users-permissions/models/Role.settings.json diff --git a/examples/getstarted/extensions/users-permissions/models/User.config.js b/examples/getstarted/extensions.old/users-permissions/models/User.config.js similarity index 100% rename from examples/getstarted/extensions/users-permissions/models/User.config.js rename to examples/getstarted/extensions.old/users-permissions/models/User.config.js diff --git a/examples/getstarted/extensions/users-permissions/models/User.settings.json b/examples/getstarted/extensions.old/users-permissions/models/User.settings.json similarity index 100% rename from examples/getstarted/extensions/users-permissions/models/User.settings.json rename to examples/getstarted/extensions.old/users-permissions/models/User.settings.json diff --git a/examples/getstarted/extensions/users-permissions/config/jwt.js b/examples/getstarted/extensions/users-permissions/config/jwt.js index babeb1230c..c60d8b24db 100644 --- a/examples/getstarted/extensions/users-permissions/config/jwt.js +++ b/examples/getstarted/extensions/users-permissions/config/jwt.js @@ -1,3 +1,3 @@ module.exports = { - jwtSecret: process.env.JWT_SECRET || 'c4dc6f71-db45-49c6-82d0-9ca91cb93fa2', + jwtSecret: process.env.JWT_SECRET || 'efec74b5-274a-4b6b-8077-d3ac6bfdfd89', }; diff --git a/examples/getstarted/extensions/users-permissions/content-types/role/schema.json b/examples/getstarted/extensions/users-permissions/content-types/role/schema.json new file mode 100644 index 0000000000..dc66f242f6 --- /dev/null +++ b/examples/getstarted/extensions/users-permissions/content-types/role/schema.json @@ -0,0 +1,44 @@ +{ + "collectionName": "up_roles", + "info": { + "name": "role", + "description": "", + "singularName": "role", + "pluralName": "roles", + "displayName": "Role" + }, + "options": { + "draftAndPublish": false + }, + "attributes": { + "name": { + "type": "string", + "minLength": 3, + "required": true, + "configurable": false + }, + "description": { + "type": "string", + "configurable": false + }, + "type": { + "type": "string", + "unique": true, + "configurable": false + }, + "permissions": { + "type": "relation", + "relation": "oneToMany", + "target": "plugin::users-permissions.permission", + "mappedBy": "role", + "configurable": false + }, + "users": { + "type": "relation", + "relation": "oneToMany", + "target": "plugin::users-permissions.user", + "mappedBy": "role", + "configurable": false + } + } +} diff --git a/examples/getstarted/extensions/users-permissions/content-types/user/schema.json b/examples/getstarted/extensions/users-permissions/content-types/user/schema.json new file mode 100644 index 0000000000..5885dcd655 --- /dev/null +++ b/examples/getstarted/extensions/users-permissions/content-types/user/schema.json @@ -0,0 +1,84 @@ +{ + "kind": "collectionType", + "collectionName": "up_users", + "info": { + "name": "User", + "description": "", + "singularName": "user", + "pluralName": "users", + "displayName": "User" + }, + "options": { + "draftAndPublish": false, + "timestamps": true + }, + "attributes": { + "username": { + "type": "string", + "minLength": 3, + "unique": true, + "configurable": false, + "required": true + }, + "email": { + "type": "email", + "minLength": 6, + "configurable": false, + "required": true + }, + "provider": { + "type": "string", + "configurable": false + }, + "password": { + "type": "password", + "minLength": 6, + "configurable": false, + "private": true + }, + "resetPasswordToken": { + "type": "string", + "configurable": false, + "private": true + }, + "confirmationToken": { + "type": "string", + "configurable": false, + "private": true + }, + "confirmed": { + "type": "boolean", + "default": false, + "configurable": false + }, + "blocked": { + "type": "boolean", + "default": false, + "configurable": false + }, + "role": { + "type": "relation", + "relation": "manyToOne", + "target": "plugin::users-permissions.role", + "inversedBy": "users", + "configurable": false + }, + "picture": { + "type": "media", + "multiple": false, + "required": false + }, + "aaa": { + "type": "string" + }, + "bbbb": { + "type": "string" + }, + "ccc": { + "type": "string" + }, + "dddd": { + "type": "string" + } + } +} diff --git a/examples/getstarted/extensions/users-permissions/strapi-server.js b/examples/getstarted/extensions/users-permissions/strapi-server.js new file mode 100644 index 0000000000..b53e788b64 --- /dev/null +++ b/examples/getstarted/extensions/users-permissions/strapi-server.js @@ -0,0 +1,16 @@ +// 1 - load original plugin +// 2 - load content types overwrites +// 3 - execute plugin extensions + +module.exports = plugin => { + // extend article content type + + plugin.contentTypes.article.collectionName === 'foo'; + + plugin.routes.push({ + method: 'GET', + handler: 'myCtrl.actionA', + }); + + return plugin; +}; diff --git a/packages/core/content-manager/server/content-types/index.js b/packages/core/content-manager/server/content-types/index.js deleted file mode 100644 index 104c4ef24d..0000000000 --- a/packages/core/content-manager/server/content-types/index.js +++ /dev/null @@ -1,3 +0,0 @@ -'use strict'; - -module.exports = []; diff --git a/packages/core/content-manager/strapi-server.js b/packages/core/content-manager/strapi-server.js index e42835ad01..da4fe6d5c7 100644 --- a/packages/core/content-manager/strapi-server.js +++ b/packages/core/content-manager/strapi-server.js @@ -1,7 +1,6 @@ 'use strict'; const bootstrap = require('./server/bootstrap'); -const contentTypes = require('./server/content-types'); const policies = require('./server/policies'); const services = require('./server/services'); const routes = require('./server/routes'); @@ -9,11 +8,9 @@ const controllers = require('./server/controllers'); module.exports = () => { return { - register: () => {}, bootstrap, routes, controllers, - contentTypes, policies, services, }; diff --git a/packages/core/content-type-builder/services/schema-builder/index.js b/packages/core/content-type-builder/services/schema-builder/index.js index 608943d165..8418e73962 100644 --- a/packages/core/content-type-builder/services/schema-builder/index.js +++ b/packages/core/content-type-builder/services/schema-builder/index.js @@ -2,7 +2,6 @@ const path = require('path'); const _ = require('lodash'); -const { capitalize } = require('lodash/fp'); const createSchemaHandler = require('./schema-handler'); const createComponentBuilder = require('./component-builder'); @@ -33,7 +32,7 @@ module.exports = function createBuilder() { let dir; if (contentType.plugin) { - dir = `./extensions/${contentType.plugin}/models`; + dir = `./extensions/${contentType.plugin}/content-types/${contentType.info.singularName}`; } else { dir = `./api/${contentType.apiName}/models`; } @@ -42,7 +41,7 @@ module.exports = function createBuilder() { modelName: contentType.modelName, plugin: contentType.plugin, uid: contentType.uid, - filename: capitalize(`${contentType.info.singularName}.settings.json`), + filename: 'schema.json', dir: path.join(strapi.dir, dir), schema: contentType.__schema__, }; diff --git a/packages/core/strapi/lib/Strapi.js b/packages/core/strapi/lib/Strapi.js index 9896cd26a2..6742467914 100644 --- a/packages/core/strapi/lib/Strapi.js +++ b/packages/core/strapi/lib/Strapi.js @@ -321,7 +321,7 @@ class Strapi { return; } - if (this.config.autoReload) { + if (this.config.get('autoReload')) { this.server.destroy(); process.send('reload'); } diff --git a/packages/core/strapi/lib/core/domain/module/validation.js b/packages/core/strapi/lib/core/domain/module/validation.js index 1178bb15f3..86ad199c62 100644 --- a/packages/core/strapi/lib/core/domain/module/validation.js +++ b/packages/core/strapi/lib/core/domain/module/validation.js @@ -23,7 +23,7 @@ const strapiServerSchema = yup services: yup.object().required(), policies: yup.object().required(), middlewares: yup.object().required(), // may be removed later - contentTypes: yup.array().required(), + contentTypes: yup.object().required(), }) .noUnknown(); diff --git a/packages/core/strapi/lib/core/fs.js b/packages/core/strapi/lib/core/fs.js index 575cc92edf..8d3b7aaabb 100644 --- a/packages/core/strapi/lib/core/fs.js +++ b/packages/core/strapi/lib/core/fs.js @@ -1,6 +1,7 @@ 'use strict'; const path = require('path'); +const fs = require('fs'); const fse = require('fs-extra'); /** @@ -10,7 +11,7 @@ module.exports = strapi => { function normalizePath(optPath) { const filePath = Array.isArray(optPath) ? optPath.join('/') : optPath; - const normalizedPath = path.normalize(filePath).replace(/^(\/?\.\.?)+/, ''); + const normalizedPath = path.normalize(filePath).replace(/^\/?(\.\/|\.\.\/)+/, ''); return path.join(strapi.dir, normalizedPath); } @@ -44,6 +45,14 @@ module.exports = strapi => { const removePath = normalizePath(optPath); return fse.remove(removePath); }, + + /** + * Removes a file in strapi app + */ + async appendFile(optPath, data) { + const writePath = normalizePath(optPath); + return fs.appendFileSync(writePath, data); + }, }; return strapiFS; diff --git a/packages/core/strapi/lib/core/load-plugins/index.js b/packages/core/strapi/lib/core/load-plugins/index.js index 058eb85539..5ab9492411 100644 --- a/packages/core/strapi/lib/core/load-plugins/index.js +++ b/packages/core/strapi/lib/core/load-plugins/index.js @@ -1,10 +1,11 @@ 'use strict'; -const { join } = require('path'); +const { join, resolve } = require('path'); const { existsSync } = require('fs'); -const { defaultsDeep, getOr } = require('lodash/fp'); +const { defaultsDeep, getOr, get } = require('lodash/fp'); const { env } = require('@strapi/utils'); const loadConfigFile = require('../app-configuration/load-config-file'); +const loadFiles = require('../../load/load-files'); const getEnabledPlugins = require('./get-enabled-plugins'); const defaultPlugin = { @@ -20,7 +21,25 @@ const defaultPlugin = { services: {}, policies: {}, middlewares: {}, - contentTypes: [], + contentTypes: {}, +}; + +const applyUserExtension = async plugins => { + const extensionsDir = resolve(strapi.dir, 'extensions'); + if (!existsSync(extensionsDir)) { + return; + } + + const files = await loadFiles(extensionsDir, '**/content-types/**/schema.json'); + for (const pluginName in plugins) { + const plugin = plugins[pluginName]; + for (const ctName in plugin.contentTypes) { + const extendedSchema = get([pluginName, 'content-types', ctName, 'schema'], files); + if (extendedSchema) { + plugin.contentTypes[ctName].schema = extendedSchema; + } + } + } }; const formatContentTypes = plugins => { @@ -34,7 +53,7 @@ const formatContentTypes = plugins => { } }; -const formatConfig = plugins => { +const applyUserConfig = plugins => { const userPluginConfigPath = join(strapi.dir, 'config', 'plugins.js'); const userPluginsConfig = existsSync(userPluginConfigPath) ? loadConfigFile(userPluginConfigPath) @@ -43,13 +62,18 @@ const formatConfig = plugins => { for (const pluginName in plugins) { const plugin = plugins[pluginName]; const userPluginConfig = getOr({}, `${pluginName}.config`, userPluginsConfig); - const formattedConfig = defaultsDeep(plugin.config.default, userPluginConfig); + const defaultConfig = + typeof plugin.config.default === 'function' + ? plugin.config.default({ env }) + : plugin.config.default; + + const config = defaultsDeep(defaultConfig, userPluginConfig); try { - plugin.config.validator(formattedConfig); + plugin.config.validator(config); } catch (e) { throw new Error(`Error regarding ${pluginName} config: ${e.message}`); } - plugin.config = formattedConfig; + plugin.config = config; } }; @@ -59,12 +83,12 @@ const loadPlugins = async strapi => { for (const pluginName in enabledPlugins) { const enabledPlugin = enabledPlugins[pluginName]; - const loadPluginServer = require(join(enabledPlugin.pathToPlugin, 'strapi-server.js')); - const pluginServer = await loadPluginServer({ env }); + const pluginServer = loadConfigFile(join(enabledPlugin.pathToPlugin, 'strapi-server.js')); plugins[pluginName] = defaultsDeep(defaultPlugin, pluginServer); } // TODO: validate plugin format - formatConfig(plugins); + applyUserConfig(plugins); + await applyUserExtension(plugins); formatContentTypes(plugins); return plugins; diff --git a/packages/core/strapi/lib/core/loaders/bootstrap.js b/packages/core/strapi/lib/core/loaders/bootstrap.js index 0fd483163e..4f36fa7d35 100644 --- a/packages/core/strapi/lib/core/loaders/bootstrap.js +++ b/packages/core/strapi/lib/core/loaders/bootstrap.js @@ -46,19 +46,21 @@ module.exports = function(strapi) { }, {}); // Set controllers. - strapi.controllers = Object.keys(strapi.api || []).reduce((acc, key) => { - for (let index in strapi.api[key].controllers) { - let controller = strapi.api[key].controllers[index]; - acc[index] = controller; + strapi.controllers = Object.keys(strapi.api || []).reduce((acc, apiName) => { + strapi.container.get('controllers').add(`api::${apiName}`, strapi.api[apiName].controllers); + for (let controllerName in strapi.api[apiName].controllers) { + let controller = strapi.api[apiName].controllers[controllerName]; + acc[controllerName] = controller; } return acc; }, {}); // Set services. - strapi.services = Object.keys(strapi.api || []).reduce((acc, key) => { - for (let index in strapi.api[key].services) { - acc[index] = strapi.api[key].services[index]; + strapi.services = Object.keys(strapi.api || []).reduce((acc, apiName) => { + strapi.container.get('services').add(`api::${apiName}`, strapi.api[apiName].services); + for (let serviceName in strapi.api[apiName].services) { + acc[serviceName] = strapi.api[apiName].services[serviceName]; } return acc; diff --git a/packages/core/strapi/lib/core/registries/content-types.js b/packages/core/strapi/lib/core/registries/content-types.js index 36eefdf26f..3f4b4ca9bf 100644 --- a/packages/core/strapi/lib/core/registries/content-types.js +++ b/packages/core/strapi/lib/core/registries/content-types.js @@ -19,6 +19,17 @@ const { createContentType } = require('../domain/content-type'); // }); // }; +const validateKeySameToSingularName = contentTypes => { + for (const ctName in contentTypes) { + const contentType = contentTypes[ctName]; + if (ctName !== contentType.schema.info.singularName) { + throw new Error( + `The key of the content-type should be the same as its singularName. Found ${ctName} and ${contentType.schema.info.singularName}.` + ); + } + } +}; + const contentTypesRegistry = () => { const contentTypes = {}; @@ -30,13 +41,15 @@ const contentTypesRegistry = () => { return pickBy((ct, ctUID) => ctUID.startsWith(prefix))(contentTypes); }, add(namespace, rawContentTypes) { - rawContentTypes.forEach(rawContentType => { + validateKeySameToSingularName(rawContentTypes); + for (const rawCtName in rawContentTypes) { + const rawContentType = rawContentTypes[rawCtName]; const uid = `${namespace}.${rawContentType.schema.info.singularName}`; if (has(uid, contentTypes)) { - throw new Error(`Content-Type ${uid} has already been registered.`); + throw new Error(`Content-type ${uid} has already been registered.`); } contentTypes[uid] = createContentType(uid, rawContentType); - }); + } }, }; }; diff --git a/packages/core/upload/server/content-types/index.js b/packages/core/upload/server/content-types/index.js index 8962dddd6a..e8fb0db122 100644 --- a/packages/core/upload/server/content-types/index.js +++ b/packages/core/upload/server/content-types/index.js @@ -2,8 +2,6 @@ const fileModel = require('../../models/File'); -module.exports = [ - { - schema: fileModel, - }, -]; +module.exports = { + [fileModel.info.singularName]: { schema: fileModel }, +}; diff --git a/packages/plugins/graphql/strapi-server.js b/packages/plugins/graphql/strapi-server.js index e46e60584c..332afa87ab 100644 --- a/packages/plugins/graphql/strapi-server.js +++ b/packages/plugins/graphql/strapi-server.js @@ -10,6 +10,6 @@ module.exports = (/* strapi, config */) => { services: () => {}, policies: {}, middlewares: {}, - contentTypes: [], + contentTypes: {}, }; }; diff --git a/packages/plugins/i18n/server/content-types/index.js b/packages/plugins/i18n/server/content-types/index.js index 59b68c0b23..7594c7bf7b 100644 --- a/packages/plugins/i18n/server/content-types/index.js +++ b/packages/plugins/i18n/server/content-types/index.js @@ -2,4 +2,6 @@ const localeModel = require('./locale'); -module.exports = [localeModel]; +module.exports = { + [localeModel.schema.info.singularName]: localeModel, +}; diff --git a/packages/plugins/i18n/server/services/core-api.js b/packages/plugins/i18n/server/services/core-api.js index ff4c8be5be..5feead603e 100644 --- a/packages/plugins/i18n/server/services/core-api.js +++ b/packages/plugins/i18n/server/services/core-api.js @@ -199,12 +199,21 @@ const addCreateLocalizationAction = contentType => { const localizationRoute = createLocalizationRoute(contentType); - const coreApiControllerPath = `api.${apiName}.controllers.${modelName}.createLocalization`; - const handler = createLocalizationHandler(contentType); - strapi.config.routes.push(localizationRoute); - _.set(strapi, coreApiControllerPath, handler); + // TODO: to replace with: + // strapi.controllers.extends(`api::${apiName}.${modelName}`, (contr) => ({ + // ...controller, + // createLocalization = createLocalizationHandler(contentType), + // })); + // OR + // strapi.api(apiName).controllers.extends(modelName, (contr) => ({ + // ...controller, + // createLocalization = createLocalizationHandler(contentType), + // })); + + const controller = strapi.container.get('controllers').get(`api::${apiName}.${modelName}`); + controller.createLocalization = createLocalizationHandler(contentType); }; const mergeCustomizer = (dest, src) => { diff --git a/packages/plugins/users-permissions/config/functions/bootstrap.js b/packages/plugins/users-permissions/config/functions/bootstrap.js index 9fa5532cb2..276b25465c 100644 --- a/packages/plugins/users-permissions/config/functions/bootstrap.js +++ b/packages/plugins/users-permissions/config/functions/bootstrap.js @@ -37,11 +37,9 @@ module.exports = async () => { strapi.reload.isWatching = false; - await strapi.fs.writePluginFile( - 'users-permissions', - 'config/jwt.js', - `module.exports = {\n jwtSecret: process.env.JWT_SECRET || '${jwtSecret}'\n};` - ); + if (!process.env.JWT_SECRET) { + await strapi.fs.appendFile('.env', `JWT_SECRET=${jwtSecret}\n`); + } strapi.reload.isWatching = true; } diff --git a/packages/plugins/users-permissions/server/config.js b/packages/plugins/users-permissions/server/config.js index fb2d7ea558..d722b040a9 100644 --- a/packages/plugins/users-permissions/server/config.js +++ b/packages/plugins/users-permissions/server/config.js @@ -1,6 +1,15 @@ 'use strict'; module.exports = { - default: {}, + default: ({ env }) => ({ + jwtSecret: env('JWT_SECRET'), + jwt: { + expiresIn: '30d', + }, + ratelimit: { + interval: 60000, + max: 10, + }, + }), validator: () => {}, }; diff --git a/packages/plugins/users-permissions/server/content-types/index.js b/packages/plugins/users-permissions/server/content-types/index.js index 4dd2375a05..29511d65a3 100644 --- a/packages/plugins/users-permissions/server/content-types/index.js +++ b/packages/plugins/users-permissions/server/content-types/index.js @@ -4,14 +4,8 @@ const permissionModel = require('../../models/Permission.settings'); const roleModel = require('../../models/Role.settings'); const userModel = require('../../models/User.settings'); -module.exports = [ - { - schema: permissionModel, - }, - { - schema: roleModel, - }, - { - schema: userModel, - }, -]; +module.exports = { + [permissionModel.info.singularName]: { schema: permissionModel }, + [roleModel.info.singularName]: { schema: roleModel }, + [userModel.info.singularName]: { schema: userModel }, +}; diff --git a/packages/plugins/users-permissions/strapi-server.js b/packages/plugins/users-permissions/strapi-server.js index fb88a0c22c..407591ed17 100644 --- a/packages/plugins/users-permissions/strapi-server.js +++ b/packages/plugins/users-permissions/strapi-server.js @@ -7,10 +7,11 @@ const services = require('./server/services'); const routes = require('./server/routes'); const controllers = require('./server/controllers'); const middlewares = require('./server/middlewares'); +const config = require('./server/config'); module.exports = () => ({ - register: () => {}, bootstrap, + config, routes, controllers, middlewares, diff --git a/test/helpers/generators.js b/test/helpers/generators.js index a8d6fe1adb..3919115ed6 100644 --- a/test/helpers/generators.js +++ b/test/helpers/generators.js @@ -18,7 +18,7 @@ module.exports = { author: { type: 'relation', relation: 'manyToOne', - target: 'plugins::users-permissions.user', + target: 'plugin::users-permissions.user', targetAttribute: 'articles', }, },