Init core api extension for i18n

This commit is contained in:
Alexandre Bodin 2021-02-17 18:30:06 +01:00
parent 09990678ad
commit 17b2296d11
3 changed files with 79 additions and 34 deletions

View File

@ -1,22 +1,27 @@
'use strict';
const _ = require('lodash');
const pluralize = require('pluralize');
const { getService } = require('../../utils');
module.exports = () => {
Object.values(strapi.contentTypes).forEach(model => {
if (getService('content-types').isLocalized(model)) {
_.set(model.attributes, 'localizations', {
const contentTypeService = getService('content-types');
const coreApiService = getService('core-api');
Object.values(strapi.contentTypes).forEach(contentType => {
if (contentTypeService.isLocalized(contentType)) {
const { attributes, modelName } = contentType;
_.set(attributes, 'localizations', {
writable: true,
private: false,
configurable: false,
visible: false,
collection: model.modelName,
collection: modelName,
populate: ['id', 'locale', 'published_at'],
});
_.set(model.attributes, 'locale', {
_.set(attributes, 'locale', {
writable: true,
private: false,
configurable: false,
@ -24,34 +29,7 @@ module.exports = () => {
type: 'string',
});
// add new route
const route =
model.kind === 'singleType'
? _.kebabCase(model.modelName)
: _.kebabCase(pluralize(model.modelName));
const localizationRoutes = [
{
method: 'POST',
path: `/${route}/:id/localizations`,
handler: `${model.modelName}.createLocalization`,
config: {
policies: [],
},
},
];
const handler = function(ctx) {
ctx.body = 'works';
};
strapi.config.routes.push(...localizationRoutes);
_.set(
strapi,
`api.${model.apiName}.controllers.${model.modelName}.createLocalization`,
handler
);
coreApiService.addCreateLocalizationAction(contentType);
}
});

View File

@ -0,0 +1,54 @@
'use strict';
const { set } = require('lodash');
const { getContentTypeRoutePrefix } = require('strapi-utils').contentTypes;
/**
* Returns a handler to handle localizations creation in the core api
* @param {object} contentType
* @returns ((oject) => {})
*/
const createLocalizationHandler = contentType => {
return function(ctx) {
ctx.body = 'works';
};
};
/**
* Returns a route config to handle localizations creation in the core api
* @param {object} contentType
* @returns {{ method: string, path: string, handler: string, config: { policies: string[] }}}
*/
const createLocalizationRoute = contentType => {
const { modelName } = contentType;
return {
method: 'POST',
path: `/${getContentTypeRoutePrefix(contentType)}/:id/localizations`,
handler: `${modelName}.createLocalization`,
config: {
policies: [],
},
};
};
/**
* Adds a route & an action to the core api controller of a content type to allow creating new localizations
* @param {object} contentType
*/
const addCreateLocalizationAction = contentType => {
const { modelName, apiName } = 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);
};
module.exports = {
addCreateLocalizationAction,
};

View File

@ -1,6 +1,7 @@
'use strict';
const _ = require('lodash');
const pluralize = require('pluralize');
const SINGLE_TYPE = 'singleType';
const COLLECTION_TYPE = 'collectionType';
@ -190,6 +191,17 @@ const getGlobalId = (model, modelName, prefix) => {
const isRelationalAttribute = attribute =>
_.has(attribute, 'model') || _.has(attribute, 'collection');
/**
* Returns a route prefix for a contentType
* @param {object} contentType
* @returns {string}
*/
const getContentTypeRoutePrefix = contentType => {
return isSingleType(contentType)
? _.kebabCase(contentType.modelName)
: _.kebabCase(pluralize(contentType.modelName));
};
module.exports = {
isScalarAttribute,
isMediaAttribute,
@ -211,4 +223,5 @@ module.exports = {
isKind,
createContentType,
getGlobalId,
getContentTypeRoutePrefix,
};