Sync super admin permissions with locales list for localized subjects

This commit is contained in:
Convly 2021-03-25 12:18:40 +01:00
parent a66e0269da
commit e1f1c14c13
3 changed files with 71 additions and 3 deletions

View File

@ -13,12 +13,20 @@ const {
differenceWith,
differenceBy,
} = require('lodash/fp');
const { generateTimestampCode, stringIncludes } = require('strapi-utils');
const {
generateTimestampCode,
stringIncludes,
hooks: { createAsyncSeriesWaterfallHook },
} = require('strapi-utils');
const permissionDomain = require('../domain/permission');
const { validatePermissionsExist } = require('../validation/permission');
const { getService } = require('../utils');
const { SUPER_ADMIN_CODE } = require('./constants');
const hooks = {
willResetSuperAdminPermission: createAsyncSeriesWaterfallHook(),
};
const ACTIONS = {
publish: 'plugins::content-manager.explorer.publish',
};
@ -416,10 +424,13 @@ const resetSuperAdminPermissions = async () => {
permissions.push(...otherPermissions);
await assignPermissions(superAdminRole.id, permissions);
const transformedPermissions = await hooks.willResetSuperAdminPermission.call(permissions);
await assignPermissions(superAdminRole.id, transformedPermissions);
};
module.exports = {
hooks,
sanitizeRole,
create,
findOne,

View File

@ -42,4 +42,16 @@ const registerModelsHooks = () => {
},
});
});
strapi.db.lifecycles.register({
model: 'plugins::i18n.locale',
async afterCreate() {
await getService('permissions').actions.syncSuperAdminPermissionsWithLocales();
},
async afterDelete() {
await getService('permissions').actions.syncSuperAdminPermissionsWithLocales();
},
});
};

View File

@ -1,6 +1,6 @@
'use strict';
const { capitalize, isArray } = require('lodash/fp');
const { capitalize, isArray, getOr, prop } = require('lodash/fp');
const { getService } = require('../../utils');
const actions = ['create', 'read', 'update', 'delete'].map(uid => ({
@ -44,6 +44,48 @@ const shouldApplyLocalesPropertyToSubject = ({ property, subject }) => {
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();
const superAdminPermissions = await permissionService.findUserPermissions({
roles: [superAdminRole],
});
const newSuperAdminPermissions = await addAllLocalesToPermissions(superAdminPermissions);
await roleService.assignPermissions(superAdminRole.id, newSuperAdminPermissions);
};
const registerI18nActions = async () => {
const { actionProvider } = strapi.admin.services.permission;
@ -52,8 +94,10 @@ const registerI18nActions = async () => {
const registerI18nActionsHooks = () => {
const { actionProvider } = strapi.admin.services.permission;
const { hooks } = strapi.admin.services.role;
actionProvider.hooks.appliesPropertyToSubject.register(shouldApplyLocalesPropertyToSubject);
hooks.willResetSuperAdminPermission.register(addAllLocalesToPermissions);
};
const updateActionsProperties = () => {
@ -71,4 +115,5 @@ module.exports = {
registerI18nActions,
registerI18nActionsHooks,
updateActionsProperties,
syncSuperAdminPermissionsWithLocales,
};