Skip to content

Commit

Permalink
add didUpdateRolePermissions event
Browse files Browse the repository at this point in the history
Signed-off-by: Pierre No毛l <petersg83@gmail.com>
  • Loading branch information
petersg83 committed Oct 15, 2020
1 parent 1186d6a commit a1dc225
Show file tree
Hide file tree
Showing 6 changed files with 49 additions and 8 deletions.
12 changes: 11 additions & 1 deletion packages/strapi-admin/controllers/__tests__/role.test.js
Original file line number Diff line number Diff line change
Expand Up @@ -147,7 +147,14 @@ describe('Role controller', () => {
test('Assign permissions if input is valid', async () => {
const roleID = 1;
const findOneRole = jest.fn(() => Promise.resolve({ id: roleID }));
const assignPermissions = jest.fn((roleID, permissions) => Promise.resolve(permissions));
const assignPermissions = jest.fn((roleID, permissions) =>
Promise.resolve({
addedPermissions: permissions,
deletedPermissions: [],
newExistingPermissions: permissions,
})
);
const sendDidUpdateRolePermissions = jest.fn();
const inputPermissions = [
{
action: 'test',
Expand All @@ -167,6 +174,9 @@ describe('Role controller', () => {
global.strapi = {
admin: {
services: {
metrics: {
sendDidUpdateRolePermissions,
},
role: {
findOne: findOneRole,
getSuperAdmin: jest.fn(() => undefined),
Expand Down
11 changes: 9 additions & 2 deletions packages/strapi-admin/controllers/role.js
Original file line number Diff line number Diff line change
Expand Up @@ -129,10 +129,17 @@ module.exports = {
permissionsToAssign = input.permissions;
}

const permissions = await strapi.admin.services.permission.assign(role.id, permissionsToAssign);
const assignResults = await strapi.admin.services.permission.assign(
role.id,
permissionsToAssign
);

if (assignResults.addedPermissions.length || assignResults.deletedPermissions.length) {
await strapi.admin.services.metrics.sendDidUpdateRolePermissions();
}

ctx.body = {
data: permissions,
data: assignResults.newExistingPermissions,
};
},
};
8 changes: 6 additions & 2 deletions packages/strapi-admin/ee/controllers/role.js
Original file line number Diff line number Diff line change
Expand Up @@ -96,10 +96,14 @@ module.exports = {
return ctx.notFound('role.notFound');
}

const permissions = await strapi.admin.services.permission.assign(role.id, input.permissions);
const assignResults = await strapi.admin.services.permission.assign(role.id, input.permissions);

if (assignResults.addedPermissions.length || assignResults.deletedPermissions.length) {
await strapi.admin.services.metrics.sendDidUpdateRolePermissions();
}

ctx.body = {
data: permissions,
data: assignResults.newExistingPermissions,
};
},
};
11 changes: 11 additions & 0 deletions packages/strapi-admin/services/__tests__/metrics.test.js
Original file line number Diff line number Diff line change
Expand Up @@ -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');
});
});
5 changes: 5 additions & 0 deletions packages/strapi-admin/services/metrics.js
Original file line number Diff line number Diff line change
Expand Up @@ -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,
};
10 changes: 7 additions & 3 deletions packages/strapi-admin/services/permission.js
Original file line number Diff line number Diff line change
Expand Up @@ -116,17 +116,21 @@ const assign = async (roleId, permissions = []) => {
permissionsWithRole,
arePermissionsEqual
);
const permissionsToReturn = _.differenceBy(existingPermissions, permissionsToDelete, 'id');
const newExistingPermissions = _.differenceBy(existingPermissions, permissionsToDelete, 'id');

if (permissionsToDelete.length > 0) {
await deleteByIds(permissionsToDelete.map(p => p.id));
}
if (permissionsToAdd.length > 0) {
const createdPermissions = await createMany(permissionsToAdd);
permissionsToReturn.push(...createdPermissions.map(p => ({ ...p, role: p.role.id })));
newExistingPermissions.push(...createdPermissions.map(p => ({ ...p, role: p.role.id })));
}

return permissionsToReturn;
return {
addedPermissions: permissionsToAdd,
deletedPermissions: permissionsToDelete,
newExistingPermissions,
};
};

/**
Expand Down

0 comments on commit a1dc225

Please sign in to comment.