Skip to content

Commit 1ee5b7f

Browse files
petersg83alexandrebodin
authored andcommitted
fifth refacto
Signed-off-by: Pierre Noël <petersg83@gmail.com>
1 parent 3084b85 commit 1ee5b7f

27 files changed

+492
-180
lines changed

packages/strapi-admin/config/functions/bootstrap.js

Lines changed: 8 additions & 40 deletions
Original file line numberDiff line numberDiff line change
@@ -19,43 +19,6 @@ const registerAdminConditions = () => {
1919
});
2020
};
2121

22-
const cleanPermissionInDatabase = async () => {
23-
const { actionProvider } = strapi.admin.services.permission;
24-
const dbPermissions = await strapi.admin.services.permission.find();
25-
const allActionsMap = actionProvider.getAllByMap();
26-
const permissionsToRemoveIds = [];
27-
28-
dbPermissions.forEach(perm => {
29-
if (
30-
!allActionsMap.has(perm.action) ||
31-
(allActionsMap.get(perm.action).section === 'contentTypes' &&
32-
!allActionsMap.get(perm.action).subjects.includes(perm.subject))
33-
) {
34-
permissionsToRemoveIds.push(perm.id);
35-
}
36-
});
37-
38-
await strapi.admin.services.permission.deleteByIds(permissionsToRemoveIds);
39-
};
40-
41-
const getPermissionsWithNestedFields = (actions, nestingLevel = 3) =>
42-
actions.reduce((perms, action) => {
43-
const newPerms = [];
44-
action.subjects.forEach(contentTypeUid => {
45-
const fields = strapi.admin.services['content-type'].getNestedFields(contentTypeUid, {
46-
components: { ...strapi.components, ...strapi.contentTypes },
47-
nestingLevel,
48-
});
49-
newPerms.push({
50-
action: action.actionId,
51-
subject: contentTypeUid,
52-
fields,
53-
conditions: [],
54-
});
55-
});
56-
return perms.concat(newPerms);
57-
}, []);
58-
5922
const createRolesIfNeeded = async () => {
6023
const someRolesExist = await strapi.admin.services.role.exists();
6124
if (someRolesExist) {
@@ -104,7 +67,9 @@ const createRolesIfNeeded = async () => {
10467
description: 'Authors can manage and publish the content they created.',
10568
});
10669

107-
const editorPermissions = getPermissionsWithNestedFields(contentTypesActions);
70+
const editorPermissions = strapi.admin.services['content-type'].getPermissionsWithNestedFields(
71+
contentTypesActions
72+
);
10873

10974
const authorPermissions = editorPermissions.map(p => ({
11075
...p,
@@ -145,7 +110,10 @@ const resetSuperAdminPermissions = async () => {
145110
const allActions = strapi.admin.services.permission.actionProvider.getAll();
146111
const contentTypesActions = allActions.filter(a => a.section === 'contentTypes');
147112

148-
const permissions = getPermissionsWithNestedFields(contentTypesActions, 1);
113+
const permissions = strapi.admin.services['content-type'].getPermissionsWithNestedFields(
114+
contentTypesActions,
115+
1
116+
);
149117

150118
const otherActions = allActions.filter(a => a.section !== 'contentTypes');
151119
otherActions.forEach(action => {
@@ -165,7 +133,7 @@ const resetSuperAdminPermissions = async () => {
165133
module.exports = async () => {
166134
registerAdminConditions();
167135
registerPermissionActions();
168-
await cleanPermissionInDatabase();
136+
await strapi.admin.services.permission.cleanPermissionInDatabase();
169137
await createRolesIfNeeded();
170138
await resetSuperAdminPermissions();
171139
await displayWarningIfNoSuperAdmin();

packages/strapi-admin/controllers/__tests__/role.test.js

Lines changed: 4 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -86,6 +86,7 @@ describe('Role controller', () => {
8686
describe('updatePermissions', () => {
8787
test('Fails on missing permissions input', async () => {
8888
const badRequest = jest.fn();
89+
const findOne = jest.fn(() => Promise.resolve({ id: 1 }));
8990

9091
const ctx = createContext(
9192
{
@@ -99,7 +100,7 @@ describe('Role controller', () => {
99100
admin: {
100101
services: {
101102
role: {
102-
getSuperAdmin: jest.fn(() => undefined),
103+
findOne,
103104
},
104105
},
105106
},
@@ -117,6 +118,7 @@ describe('Role controller', () => {
117118

118119
test('Fails on missing action permission', async () => {
119120
const badRequest = jest.fn();
121+
const findOne = jest.fn(() => Promise.resolve({ id: 1 }));
120122

121123
const ctx = createContext(
122124
{
@@ -130,7 +132,7 @@ describe('Role controller', () => {
130132
global.strapi = {
131133
admin: {
132134
services: {
133-
role: { getSuperAdmin: jest.fn(() => undefined) },
135+
role: { findOne },
134136
permission: { conditionProvider: { getAll: jest.fn(() => []) } },
135137
},
136138
},

packages/strapi-admin/controllers/role.js

Lines changed: 21 additions & 16 deletions
Original file line numberDiff line numberDiff line change
@@ -1,10 +1,9 @@
11
'use strict';
22

3-
const _ = require('lodash');
43
const { yup, formatYupErrors } = require('strapi-utils');
54
const { validateRoleUpdateInput } = require('../validation/role');
65
const { validatedUpdatePermissionsInput } = require('../validation/permission');
7-
const { EDITOR_CODE, AUTHOR_CODE } = require('../services/constants');
6+
const { EDITOR_CODE, AUTHOR_CODE, SUPER_ADMIN_CODE } = require('../services/constants');
87

98
module.exports = {
109
/**
@@ -88,11 +87,15 @@ module.exports = {
8887
*/
8988
async updatePermissions(ctx) {
9089
const { id } = ctx.params;
91-
const input = _.cloneDeep(ctx.request.body);
90+
const input = ctx.request.body;
91+
92+
const role = await strapi.admin.services.role.findOne({ id });
93+
if (!role) {
94+
return ctx.notFound('role.notFound');
95+
}
9296

9397
try {
94-
const superAdminRole = await strapi.admin.services.role.getSuperAdmin();
95-
if (superAdminRole && String(superAdminRole.id) === String(id)) {
98+
if (role.code === SUPER_ADMIN_CODE) {
9699
const err = new yup.ValidationError("Super admin permissions can't be edited.");
97100
throw formatYupErrors(err);
98101
}
@@ -101,22 +104,24 @@ module.exports = {
101104
return ctx.badRequest('ValidationError', err);
102105
}
103106

104-
const role = await strapi.admin.services.role.findOne({ id });
105-
106-
if (!role) {
107-
return ctx.notFound('role.notFound');
108-
}
109-
110107
let existingPermissions = strapi.admin.services.permission.actionProvider.getAllByMap();
108+
let permissionsToAssign;
111109
if ([EDITOR_CODE, AUTHOR_CODE].includes(role.code)) {
112-
input.permissions
110+
permissionsToAssign = input.permissions.filter(
111+
p => existingPermissions.get(p.action).section !== 'contentTypes'
112+
);
113+
const modifiedPermissions = input.permissions
113114
.filter(p => existingPermissions.get(p.action).section === 'contentTypes')
114-
.forEach(p => {
115-
p.conditions = role.code === AUTHOR_CODE ? ['admin::is-creator'] : [];
116-
});
115+
.map(p => ({
116+
...p,
117+
conditions: role.code === AUTHOR_CODE ? ['admin::is-creator'] : [],
118+
}));
119+
permissionsToAssign.push(...modifiedPermissions);
120+
} else {
121+
permissionsToAssign = input.permissions;
117122
}
118123

119-
const permissions = await strapi.admin.services.permission.assign(role.id, input.permissions);
124+
const permissions = await strapi.admin.services.permission.assign(role.id, permissionsToAssign);
120125

121126
ctx.body = {
122127
data: permissions,

packages/strapi-admin/ee/controllers/role.js

Lines changed: 7 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -8,6 +8,7 @@ const {
88
validateRoleDeleteInput,
99
} = require('../validation/role');
1010
const { validatedUpdatePermissionsInput } = require('../validation/permission');
11+
const { SUPER_ADMIN_CODE } = require('../../services/constants');
1112

1213
module.exports = {
1314
/**
@@ -102,9 +103,13 @@ module.exports = {
102103
const { id } = ctx.params;
103104
const input = ctx.request.body;
104105

106+
const role = await strapi.admin.services.role.findOne({ id });
107+
if (!role) {
108+
return ctx.notFound('role.notFound');
109+
}
110+
105111
try {
106-
const superAdminRole = await strapi.admin.services.role.getSuperAdmin();
107-
if (superAdminRole && String(superAdminRole.id) === String(id)) {
112+
if (role.code === SUPER_ADMIN_CODE) {
108113
const err = new yup.ValidationError("Super admin permissions can't be edited.");
109114
throw formatYupErrors(err);
110115
}
@@ -113,8 +118,6 @@ module.exports = {
113118
return ctx.badRequest('ValidationError', err);
114119
}
115120

116-
const role = await strapi.admin.services.role.findOne({ id });
117-
118121
if (!role) {
119122
return ctx.notFound('role.notFound');
120123
}

packages/strapi-admin/ee/validation/permission.js

Lines changed: 2 additions & 31 deletions
Original file line numberDiff line numberDiff line change
@@ -1,41 +1,12 @@
11
'use strict';
22

3-
const { yup, formatYupErrors } = require('strapi-utils');
3+
const { formatYupErrors } = require('strapi-utils');
44
const validators = require('../../validation/common-validators');
5-
const { checkFieldsAreCorrectlyNested } = require('../../validation/common-functions');
65

76
const handleReject = error => Promise.reject(formatYupErrors(error));
87

9-
const updatePermissionsSchema = yup
10-
.object()
11-
.shape({
12-
permissions: yup
13-
.array()
14-
.of(
15-
yup
16-
.object()
17-
.shape({
18-
action: yup.string().required(),
19-
subject: yup.string().nullable(),
20-
fields: yup
21-
.array()
22-
.of(yup.string())
23-
.test(
24-
'field-nested',
25-
'Fields format are incorrect (duplicates or bad nesting).',
26-
checkFieldsAreCorrectlyNested
27-
),
28-
conditions: validators.arrayOfConditionNames,
29-
})
30-
.noUnknown()
31-
)
32-
.requiredAllowEmpty(),
33-
})
34-
.required()
35-
.noUnknown();
36-
378
const validatedUpdatePermissionsInput = data => {
38-
return updatePermissionsSchema
9+
return validators.updatePermissions
3910
.validate(data, { strict: true, abortEarly: false })
4011
.catch(handleReject);
4112
};

packages/strapi-admin/ee/validation/role.js

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
'use strict';
22

3-
const { yup, formatYupErrors } = require('strapi-utils');
3+
const { yup, formatYupErrors, stringIncludes, stringEquals } = require('strapi-utils');
44

55
const handleReject = error => Promise.reject(formatYupErrors(error));
66

@@ -33,7 +33,7 @@ const rolesDeleteSchema = yup
3333
.required()
3434
.test('no-admin-many-delete', 'You cannot delete the super admin role', async ids => {
3535
const superAdminRole = await strapi.admin.services.role.getSuperAdmin();
36-
return !superAdminRole || !ids.map(String).includes(String(superAdminRole.id));
36+
return !superAdminRole || !stringIncludes(ids, superAdminRole.id);
3737
}),
3838
})
3939
.noUnknown();
@@ -43,7 +43,7 @@ const roleDeleteSchema = yup
4343
.required()
4444
.test('no-admin-single-delete', 'You cannot delete the super admin role', async function(id) {
4545
const superAdminRole = await strapi.admin.services.role.getSuperAdmin();
46-
return !superAdminRole || String(id) !== String(superAdminRole.id)
46+
return !superAdminRole || !stringEquals(id, superAdminRole.id)
4747
? true
4848
: this.createError({ path: 'id', message: `You cannot delete the super admin role` });
4949
});

0 commit comments

Comments
 (0)