From dee087a9be3f0c58cbef3ea89612932d2d005ed3 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Pierre=20No=C3=ABl?= Date: Mon, 21 Jun 2021 12:02:10 +0200 Subject: [PATCH] use format schema, actions, lifecycles --- packages/core/strapi/lib/Strapi.js | 9 ++- .../lib/core/domain/content-type/index.js | 30 ++++----- .../lib/core/domain/content-type/validator.js | 38 +++++++---- .../lib/core/plugins/content-type-provider.js | 4 +- .../strapi/lib/core/plugins/validation.js | 11 ++-- packages/core/utils/lib/validators.js | 9 +++ .../server/content-types/locale/actions.js | 14 ++++ .../i18n/server/content-types/locale/index.js | 11 ++++ .../server/content-types/locale/lifecycles.js | 5 ++ .../{locale.json => locale/schema.json} | 0 packages/plugins/i18n/server/routes.json | 64 ------------------- packages/plugins/i18n/server/routes/index.js | 64 +++++++++++++++++++ packages/plugins/i18n/strapi-server.js | 45 +++++++++---- 13 files changed, 190 insertions(+), 114 deletions(-) create mode 100644 packages/plugins/i18n/server/content-types/locale/actions.js create mode 100644 packages/plugins/i18n/server/content-types/locale/index.js create mode 100644 packages/plugins/i18n/server/content-types/locale/lifecycles.js rename packages/plugins/i18n/server/content-types/{locale.json => locale/schema.json} (100%) delete mode 100644 packages/plugins/i18n/server/routes.json create mode 100644 packages/plugins/i18n/server/routes/index.js diff --git a/packages/core/strapi/lib/Strapi.js b/packages/core/strapi/lib/Strapi.js index e475036c79..4e864b0b7c 100644 --- a/packages/core/strapi/lib/Strapi.js +++ b/packages/core/strapi/lib/Strapi.js @@ -335,8 +335,13 @@ class Strapi { } }); - const pluginProvider = await createPluginProvider(this); - this.plugin = pluginProvider; + try { + const pluginProvider = await createPluginProvider(this); + this.plugin = pluginProvider; + console.log(this.plugin('i18n').contentType.getAll()); + } catch (e) { + console.log(e); + } // const modules = await loadModules(this); diff --git a/packages/core/strapi/lib/core/domain/content-type/index.js b/packages/core/strapi/lib/core/domain/content-type/index.js index bbf6e5f5ce..6068070626 100644 --- a/packages/core/strapi/lib/core/domain/content-type/index.js +++ b/packages/core/strapi/lib/core/domain/content-type/index.js @@ -4,37 +4,37 @@ const { cloneDeep } = require('lodash/fp'); const { validateContentTypeDefinition } = require('./validator'); const createContentType = (definition, { apiName, pluginName } = {}) => { - const createdContentType = cloneDeep(definition); - validateContentTypeDefinition(definition); + const createdContentType = cloneDeep(definition); + if (apiName) { - Object.assign(createdContentType, { - uid: `application::${apiName}.${definition.info.singularName}`, + Object.assign(createdContentType.schema, { + uid: `application::${apiName}.${definition.schema.info.singularName}`, apiName, - collectionName: definition.collectionName || definition.info.singularName, + collectionName: definition.schema.collectionName || definition.schema.info.singularName, }); } else if (pluginName) { - Object.assign(createdContentType, { - uid: `plugins::${pluginName}.${definition.info.singularName}`, + Object.assign(createdContentType.schema, { + uid: `plugins::${pluginName}.${definition.schema.info.singularName}`, plugin: pluginName, collectionName: - createdContentType.collectionName || - `${pluginName}_${definition.info.singularName}`.toLowerCase(), + createdContentType.schema.collectionName || + `${pluginName}_${definition.schema.info.singularName}`.toLowerCase(), }); } else { - Object.assign(createdContentType, { - uid: `strapi::${definition.info.singularName}`, + Object.assign(createdContentType.schema, { + uid: `strapi::${definition.schema.info.singularName}`, plugin: 'admin', }); } - Object.assign(createdContentType, { - kind: createdContentType.kind || 'collectionType', + Object.assign(createdContentType.schema, { + kind: createdContentType.schema.kind || 'collectionType', }); - Object.defineProperty(createdContentType, 'privateAttributes', { + Object.defineProperty(createdContentType.schema, 'privateAttributes', { get() { - return strapi.getModel(createdContentType.uid).privateAttributes; + return strapi.getModel(createdContentType.schema.uid).privateAttributes; }, }); diff --git a/packages/core/strapi/lib/core/domain/content-type/validator.js b/packages/core/strapi/lib/core/domain/content-type/validator.js index d5bae0aa7b..4ff90afaeb 100644 --- a/packages/core/strapi/lib/core/domain/content-type/validator.js +++ b/packages/core/strapi/lib/core/domain/content-type/validator.js @@ -1,22 +1,34 @@ 'use strict'; +const { keyBy, mapValues } = require('lodash'); const { yup } = require('@strapi/utils'); +// To replace by directly using implemented lifecycles +const lifecycles = ['beforeCreate', 'afterCreate']; +const lifecyclesShape = mapValues(keyBy(lifecycles), () => yup.mixed().isFunction()); + const contentTypeSchemaValidator = yup.object().shape({ - info: yup + schema: yup.object().shape({ + info: yup + .object() + .shape({ + singularName: yup + .string() + .isCamelCase() + .required(), + pluralName: yup + .string() + .isCamelCase() + .required(), + displayName: yup.string().required(), + }) + .required(), + }), + actions: yup.object().onlyContainsFunctions(), + lifecycles: yup .object() - .shape({ - singularName: yup - .string() - .isCamelCase() - .required(), - pluralName: yup - .string() - .isCamelCase() - .required(), - displayName: yup.string().required(), - }) - .required(), + .shape(lifecyclesShape) + .noUnknown(), }); const validateContentTypeDefinition = data => { diff --git a/packages/core/strapi/lib/core/plugins/content-type-provider.js b/packages/core/strapi/lib/core/plugins/content-type-provider.js index 5aeb13d1a7..d8a05448f0 100644 --- a/packages/core/strapi/lib/core/plugins/content-type-provider.js +++ b/packages/core/strapi/lib/core/plugins/content-type-provider.js @@ -5,8 +5,8 @@ const { createContentType } = require('../domain/content-type'); module.exports = (pluginName, contentTypeDefinitions) => { const contentTypes = contentTypeDefinitions.map(ct => createContentType(ct, { pluginName })); const contentTypesMap = contentTypes.reduce((map, ct) => { - map[ct.info.singularName] = ct; - map[ct.info.pluralName] = ct; + map[ct.schema.info.singularName] = ct; + map[ct.schema.info.pluralName] = ct; return map; }, {}); diff --git a/packages/core/strapi/lib/core/plugins/validation.js b/packages/core/strapi/lib/core/plugins/validation.js index 49910d79a2..022bcb6f1f 100644 --- a/packages/core/strapi/lib/core/plugins/validation.js +++ b/packages/core/strapi/lib/core/plugins/validation.js @@ -1,6 +1,7 @@ 'use strict'; -const { yup, kebabCase } = require('@strapi/utils'); +const { kebabCase } = require('lodash/fp'); +const { yup } = require('@strapi/utils'); const strapiServerSchema = yup .object() @@ -38,14 +39,14 @@ const validateStrapiServer = data => { const validateContentTypesUnicity = contentTypes => { const names = []; contentTypes.forEach(ct => { - const singularName = kebabCase(ct.info.singularName); - const pluralName = kebabCase(ct.info.pluralName); + const singularName = kebabCase(ct.schema.info.singularName); + const pluralName = kebabCase(ct.schema.info.pluralName); if (names.includes(singularName)) { - throw new Error(`The singular name "${ct.info.singularName}" should be unique`); + throw new Error(`The singular name "${ct.schema.info.singularName}" should be unique`); } names.push(singularName); if (names.includes(pluralName)) { - throw new Error(`The plural name "${ct.info.pluralName}" should be unique`); + throw new Error(`The plural name "${ct.schema.info.pluralName}" should be unique`); } names.push(pluralName); }); diff --git a/packages/core/utils/lib/validators.js b/packages/core/utils/lib/validators.js index 41962518a4..59042975c4 100644 --- a/packages/core/utils/lib/validators.js +++ b/packages/core/utils/lib/validators.js @@ -28,11 +28,20 @@ function isCamelCase(message = '${path} is not in camel case (anExampleOfCamelCa return this.test('is in camelCase', message, value => value === _.camelCase(value)); } +function onlyContainsFunctions(message = '${path} contains values that are not functions') { + return this.test( + 'only contains functions', + message, + value => value && Object.values(value).every(_.isFunction) + ); +} + yup.addMethod(yup.mixed, 'notNil', isNotNill); yup.addMethod(yup.mixed, 'notNull', isNotNull); yup.addMethod(yup.array, 'requiredAllowEmpty', arrayRequiredAllowEmpty); yup.addMethod(yup.mixed, 'isFunction', isFunction); yup.addMethod(yup.string, 'isCamelCase', isCamelCase); +yup.addMethod(yup.object, 'onlyContainsFunctions', onlyContainsFunctions); class StrapiIDSchema extends MixedSchemaType { constructor() { diff --git a/packages/plugins/i18n/server/content-types/locale/actions.js b/packages/plugins/i18n/server/content-types/locale/actions.js new file mode 100644 index 0000000000..1413ffebd2 --- /dev/null +++ b/packages/plugins/i18n/server/content-types/locale/actions.js @@ -0,0 +1,14 @@ +'use strict'; + +module.exports = { + // find() {}, + // create() {}, + // findPage() {}, + // findWithRelationCounts() {}, + // findOne() {}, + // update() {}, + // delete() {}, + // search() {}, + // searchWithRelationCounts() {}, + // searchPage() {}, +}; diff --git a/packages/plugins/i18n/server/content-types/locale/index.js b/packages/plugins/i18n/server/content-types/locale/index.js new file mode 100644 index 0000000000..22e3209e29 --- /dev/null +++ b/packages/plugins/i18n/server/content-types/locale/index.js @@ -0,0 +1,11 @@ +'use strict'; + +const schema = require('./schema'); +const actions = require('./actions'); +const lifecycles = require('./lifecycles'); + +module.exports = { + schema, + actions, + lifecycles, +}; diff --git a/packages/plugins/i18n/server/content-types/locale/lifecycles.js b/packages/plugins/i18n/server/content-types/locale/lifecycles.js new file mode 100644 index 0000000000..2c15411547 --- /dev/null +++ b/packages/plugins/i18n/server/content-types/locale/lifecycles.js @@ -0,0 +1,5 @@ +'use strict'; +module.exports = { + beforeCreate() {}, + afterCreate() {}, +}; diff --git a/packages/plugins/i18n/server/content-types/locale.json b/packages/plugins/i18n/server/content-types/locale/schema.json similarity index 100% rename from packages/plugins/i18n/server/content-types/locale.json rename to packages/plugins/i18n/server/content-types/locale/schema.json diff --git a/packages/plugins/i18n/server/routes.json b/packages/plugins/i18n/server/routes.json deleted file mode 100644 index fcdc7852d4..0000000000 --- a/packages/plugins/i18n/server/routes.json +++ /dev/null @@ -1,64 +0,0 @@ -{ - "routes": [ - { - "method": "GET", - "path": "/iso-locales", - "handler": "iso-locales.listIsoLocales", - "config": { - "policies": [ - "admin::isAuthenticatedAdmin", - ["plugins::content-manager.hasPermissions", ["plugins::i18n.locale.read"]] - ] - } - }, - { - "method": "GET", - "path": "/locales", - "handler": "locales.listLocales", - "config": { - "policies": ["admin::isAuthenticatedAdmin"] - } - }, - { - "method": "POST", - "path": "/locales", - "handler": "locales.createLocale", - "config": { - "policies": [ - "admin::isAuthenticatedAdmin", - ["plugins::content-manager.hasPermissions", ["plugins::i18n.locale.create"]] - ] - } - }, - { - "method": "PUT", - "path": "/locales/:id", - "handler": "locales.updateLocale", - "config": { - "policies": [ - "admin::isAuthenticatedAdmin", - ["plugins::content-manager.hasPermissions", ["plugins::i18n.locale.update"]] - ] - } - }, - { - "method": "DELETE", - "path": "/locales/:id", - "handler": "locales.deleteLocale", - "config": { - "policies": [ - "admin::isAuthenticatedAdmin", - ["plugins::content-manager.hasPermissions", ["plugins::i18n.locale.delete"]] - ] - } - }, - { - "method": "POST", - "path": "/content-manager/actions/get-non-localized-fields", - "handler": "content-types.getNonLocalizedAttributes", - "config": { - "policies": ["admin::isAuthenticatedAdmin"] - } - } - ] -} diff --git a/packages/plugins/i18n/server/routes/index.js b/packages/plugins/i18n/server/routes/index.js new file mode 100644 index 0000000000..7c10c1f18b --- /dev/null +++ b/packages/plugins/i18n/server/routes/index.js @@ -0,0 +1,64 @@ +'use strict'; + +module.exports = [ + { + method: 'GET', + path: '/iso-locales', + handler: 'iso-locales.listIsoLocales', + config: { + policies: [ + 'admin::isAuthenticatedAdmin', + ['plugins::content-manager.hasPermissions', ['plugins::i18n.locale.read']], + ], + }, + }, + { + method: 'GET', + path: '/locales', + handler: 'locales.listLocales', + config: { + policies: ['admin::isAuthenticatedAdmin'], + }, + }, + { + method: 'POST', + path: '/locales', + handler: 'locales.createLocale', + config: { + policies: [ + 'admin::isAuthenticatedAdmin', + ['plugins::content-manager.hasPermissions', ['plugins::i18n.locale.create']], + ], + }, + }, + { + method: 'PUT', + path: '/locales/:id', + handler: 'locales.updateLocale', + config: { + policies: [ + 'admin::isAuthenticatedAdmin', + ['plugins::content-manager.hasPermissions', ['plugins::i18n.locale.update']], + ], + }, + }, + { + method: 'DELETE', + path: '/locales/:id', + handler: 'locales.deleteLocale', + config: { + policies: [ + 'admin::isAuthenticatedAdmin', + ['plugins::content-manager.hasPermissions', ['plugins::i18n.locale.delete']], + ], + }, + }, + { + method: 'POST', + path: '/content-manager/actions/get-non-localized-fields', + handler: 'content-types.getNonLocalizedAttributes', + config: { + policies: ['admin::isAuthenticatedAdmin'], + }, + }, +]; diff --git a/packages/plugins/i18n/strapi-server.js b/packages/plugins/i18n/strapi-server.js index 7befa56800..0c7053c5f1 100644 --- a/packages/plugins/i18n/strapi-server.js +++ b/packages/plugins/i18n/strapi-server.js @@ -4,27 +4,46 @@ 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'); // object or function. If function then pass strapi. module.exports = () => { return { - bootstrap, - // register, - destroy: () => console.log('i18n DESTROY'), - config: { - default: () => ({ - olala: 'olala', - pouet: 'pouet', - featureA: true, - }), - validator: () => {}, + register: () => { + // extend entityService + // route.add('/giveBestCountries', { action: giveBestCountries }); + // route.add('/giveBestCountries', [policies.get('plugins::users-permissions.permissions')], + // handler: giveBestCountries, + // }); + // route.add('/giveBestCountries', (ctx, { }) => { + // ctx.entityService('countries').giveBestCountries(); + // }); + // + // addQuery('giveBestCountries', { + // args: , + // resolve: , + // type: , + // }); + // + // registerRoute('/countries', { + // method: 'get', + // handler: () => {}, + // }) }, - routes: [], - controllers: {}, + bootstrap, + // routes, + // controllers: {}, middlewares: {}, contentTypes, policies, services, - hooks: {}, + // middlewares, }; }; + +// create, update, delete, read + +// modifier une route existance CRUD +// Ajouter des nouvelles routes / query graphql + +//