diff --git a/packages/strapi-admin/services/__tests__/metrics.test.js b/packages/strapi-admin/services/__tests__/metrics.test.js index 7a4793bae3..699392156b 100644 --- a/packages/strapi-admin/services/__tests__/metrics.test.js +++ b/packages/strapi-admin/services/__tests__/metrics.test.js @@ -23,4 +23,15 @@ describe('Metrics', () => { expect(countUsers).toHaveBeenCalledWith(); expect(countRoles).toHaveBeenCalledWith(); }); + + test('sendDidUpdateRolePermissions', async () => { + const send = jest.fn(() => Promise.resolve()); + global.strapi = { + telemetry: { send }, + }; + + await metricsService.sendDidUpdateRolePermissions(); + + expect(send).toHaveBeenCalledWith('didUpdateRolePermissions'); + }); }); diff --git a/packages/strapi-admin/services/metrics.js b/packages/strapi-admin/services/metrics.js index 266b5b5ded..22d6f7d281 100644 --- a/packages/strapi-admin/services/metrics.js +++ b/packages/strapi-admin/services/metrics.js @@ -6,6 +6,11 @@ const sendDidInviteUser = async () => { return strapi.telemetry.send('didInviteUser', { numberOfRoles, numberOfUsers }); }; +const sendDidUpdateRolePermissions = async () => { + return strapi.telemetry.send('didUpdateRolePermissions'); +}; + module.exports = { sendDidInviteUser, + sendDidUpdateRolePermissions, }; diff --git a/packages/strapi-admin/services/permission.js b/packages/strapi-admin/services/permission.js index 48dc1baaaf..308610cc38 100644 --- a/packages/strapi-admin/services/permission.js +++ b/packages/strapi-admin/services/permission.js @@ -63,6 +63,12 @@ const deleteByIds = ids => { * @returns {Promise<*[]|*>} */ const createMany = async permissions => { + try { + await validatePermissionsExist(permissions); + } catch (err) { + throw strapi.errors.badRequest('ValidationError', err); + } + return strapi.query('permission', 'admin').createMany(permissions); }; @@ -97,6 +103,9 @@ const assign = async (roleId, permissions = []) => { throw strapi.errors.badRequest('ValidationError', err); } + const superAdmin = await strapi.admin.services.role.getSuperAdmin(); + const isSuperAdmin = superAdmin && superAdmin.id === roleId; + const permissionsWithRole = permissions.map(permission => createPermission({ ...permission, @@ -126,6 +135,10 @@ const assign = async (roleId, permissions = []) => { permissionsToReturn.push(...createdPermissions.map(p => ({ ...p, role: p.role.id }))); } + if (!isSuperAdmin && (permissionsToAdd.length || permissionsToDelete.length)) { + await strapi.admin.services.metrics.sendDidUpdateRolePermissions(); + } + return permissionsToReturn; }; @@ -279,6 +292,7 @@ const resetSuperAdminPermissions = async () => { }; module.exports = { + createMany, find, deleteByRolesIds, deleteByIds, diff --git a/packages/strapi-admin/services/role.js b/packages/strapi-admin/services/role.js index db95e7be72..dca5c7db70 100644 --- a/packages/strapi-admin/services/role.js +++ b/packages/strapi-admin/services/role.js @@ -233,8 +233,14 @@ const createRolesIfNoneExist = async ({ createPermissionsForAdmin = false } = {} authorPermissions.push(...getDefaultPluginPermissions({ isAuthor: true })); // assign permissions to roles - await strapi.admin.services.permission.assign(editorRole.id, editorPermissions); - await strapi.admin.services.permission.assign(authorRole.id, authorPermissions); + editorPermissions.forEach(p => { + p.role = editorRole.id; + }); + authorPermissions.forEach(p => { + p.role = authorRole.id; + }); + await strapi.admin.services.permission.createMany(editorPermissions); + await strapi.admin.services.permission.createMany(authorPermissions); if (createPermissionsForAdmin) { await strapi.admin.services.permission.resetSuperAdminPermissions();