mirror of
https://github.com/strapi/strapi.git
synced 2025-07-31 21:09:39 +00:00
129 lines
3.6 KiB
JavaScript
129 lines
3.6 KiB
JavaScript
'use strict';
|
|
|
|
const { capitalize, isArray, getOr, prop } = require('lodash/fp');
|
|
const { getService } = require('../../utils');
|
|
|
|
const actions = ['create', 'read', 'update', 'delete'].map((uid) => ({
|
|
section: 'settings',
|
|
category: 'Internationalization',
|
|
subCategory: 'Locales',
|
|
pluginName: 'i18n',
|
|
displayName: capitalize(uid),
|
|
uid: `locale.${uid}`,
|
|
}));
|
|
|
|
const addLocalesPropertyIfNeeded = ({ value: action }) => {
|
|
const {
|
|
section,
|
|
options: { applyToProperties },
|
|
} = action;
|
|
|
|
// Only add the locales property to contentTypes' actions
|
|
if (section !== 'contentTypes') {
|
|
return;
|
|
}
|
|
|
|
// If the 'locales' property is already declared within the applyToProperties array, then ignore the next steps
|
|
if (isArray(applyToProperties) && applyToProperties.includes('locales')) {
|
|
return;
|
|
}
|
|
|
|
// Add the 'locales' property to the applyToProperties array (create it if necessary)
|
|
action.options.applyToProperties = isArray(applyToProperties)
|
|
? applyToProperties.concat('locales')
|
|
: ['locales'];
|
|
};
|
|
|
|
const shouldApplyLocalesPropertyToSubject = ({ property, subject }) => {
|
|
if (property === 'locales') {
|
|
const model = strapi.getModel(subject);
|
|
|
|
return getService('content-types').isLocalizedContentType(model);
|
|
}
|
|
|
|
return true;
|
|
};
|
|
|
|
const addAllLocalesToPermissions = async (permissions) => {
|
|
const { actionProvider } = strapi.admin.services.permission;
|
|
const { find: findAllLocales } = getService('locales');
|
|
|
|
const allLocales = await findAllLocales();
|
|
const allLocalesCode = allLocales.map(prop('code'));
|
|
|
|
return Promise.all(
|
|
permissions.map(async (permission) => {
|
|
const { action, subject } = permission;
|
|
|
|
const appliesToLocalesProperty = await actionProvider.appliesToProperty(
|
|
'locales',
|
|
action,
|
|
subject
|
|
);
|
|
|
|
if (!appliesToLocalesProperty) {
|
|
return permission;
|
|
}
|
|
|
|
const oldPermissionProperties = getOr({}, 'properties', permission);
|
|
|
|
return { ...permission, properties: { ...oldPermissionProperties, locales: allLocalesCode } };
|
|
})
|
|
);
|
|
};
|
|
|
|
const syncSuperAdminPermissionsWithLocales = async () => {
|
|
const roleService = strapi.admin.services.role;
|
|
const permissionService = strapi.admin.services.permission;
|
|
|
|
const superAdminRole = await roleService.getSuperAdmin();
|
|
|
|
if (!superAdminRole) {
|
|
return;
|
|
}
|
|
|
|
const superAdminPermissions = await permissionService.findMany({
|
|
where: {
|
|
role: {
|
|
id: superAdminRole.id,
|
|
},
|
|
},
|
|
});
|
|
|
|
const newSuperAdminPermissions = await addAllLocalesToPermissions(superAdminPermissions);
|
|
|
|
await roleService.assignPermissions(superAdminRole.id, newSuperAdminPermissions);
|
|
};
|
|
|
|
const registerI18nActions = async () => {
|
|
const { actionProvider } = strapi.admin.services.permission;
|
|
|
|
await actionProvider.registerMany(actions);
|
|
};
|
|
|
|
const registerI18nActionsHooks = () => {
|
|
const { actionProvider } = strapi.admin.services.permission;
|
|
const { hooks } = strapi.admin.services.role;
|
|
|
|
actionProvider.hooks.appliesPropertyToSubject.register(shouldApplyLocalesPropertyToSubject);
|
|
hooks.willResetSuperAdminPermissions.register(addAllLocalesToPermissions);
|
|
};
|
|
|
|
const updateActionsProperties = () => {
|
|
const { actionProvider } = strapi.admin.services.permission;
|
|
|
|
// Register the transformation for every new action
|
|
actionProvider.hooks.willRegister.register(addLocalesPropertyIfNeeded);
|
|
|
|
// Handle already registered actions
|
|
actionProvider.values().forEach((action) => addLocalesPropertyIfNeeded({ value: action }));
|
|
};
|
|
|
|
module.exports = {
|
|
actions,
|
|
registerI18nActions,
|
|
registerI18nActionsHooks,
|
|
updateActionsProperties,
|
|
syncSuperAdminPermissionsWithLocales,
|
|
};
|