2022-08-11 10:20:49 +02:00

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,
};