mirror of
https://github.com/strapi/strapi.git
synced 2025-09-18 13:02:18 +00:00
Merge pull request #17793 from strapi/rw-stage-rbac/support-partial-updates
Support partial updates of review workflow stage permissions
This commit is contained in:
commit
a4981eb020
@ -648,8 +648,14 @@ describeOnCondition(edition === 'EE')('Review workflows', () => {
|
|||||||
let utils;
|
let utils;
|
||||||
let entry;
|
let entry;
|
||||||
let restrictedRequest;
|
let restrictedRequest;
|
||||||
|
let restrictedUser;
|
||||||
let restrictedRole;
|
let restrictedRole;
|
||||||
|
|
||||||
|
const deleteFixtures = async () => {
|
||||||
|
await utils.deleteUserById(restrictedUser.id);
|
||||||
|
await utils.deleteRolesById([restrictedRole.id]);
|
||||||
|
};
|
||||||
|
|
||||||
beforeAll(async () => {
|
beforeAll(async () => {
|
||||||
// Update workflow to assign content type
|
// Update workflow to assign content type
|
||||||
await requests.admin.put(`/admin/review-workflows/workflows/${testWorkflow.id}?populate=*`, {
|
await requests.admin.put(`/admin/review-workflows/workflows/${testWorkflow.id}?populate=*`, {
|
||||||
@ -658,24 +664,28 @@ describeOnCondition(edition === 'EE')('Review workflows', () => {
|
|||||||
|
|
||||||
entry = await createEntry(productUID, { name: 'Product' });
|
entry = await createEntry(productUID, { name: 'Product' });
|
||||||
|
|
||||||
const restrictedUser = {
|
|
||||||
email: 'restricted@user.io',
|
|
||||||
password: 'Restricted123',
|
|
||||||
};
|
|
||||||
|
|
||||||
utils = createUtils(strapi);
|
utils = createUtils(strapi);
|
||||||
const role = await utils.createRole({
|
const role = await utils.createRole({
|
||||||
name: 'restricted-role',
|
name: 'restricted-role',
|
||||||
description: '',
|
description: '',
|
||||||
});
|
});
|
||||||
|
restrictedRole = role;
|
||||||
|
|
||||||
await utils.createUserIfNotExists({
|
const restrictedUserInfo = {
|
||||||
...restrictedUser,
|
email: 'restricted@user.io',
|
||||||
|
password: 'Restricted123',
|
||||||
|
};
|
||||||
|
|
||||||
|
restrictedUser = await utils.createUserIfNotExists({
|
||||||
|
...restrictedUserInfo,
|
||||||
roles: [role.id],
|
roles: [role.id],
|
||||||
});
|
});
|
||||||
|
|
||||||
restrictedRole = role;
|
restrictedRequest = await createAuthRequest({ strapi, userInfo: restrictedUserInfo });
|
||||||
restrictedRequest = await createAuthRequest({ strapi, userInfo: restrictedUser });
|
});
|
||||||
|
|
||||||
|
afterAll(async () => {
|
||||||
|
await deleteFixtures();
|
||||||
});
|
});
|
||||||
|
|
||||||
test("It shouldn't be available for public", async () => {
|
test("It shouldn't be available for public", async () => {
|
||||||
|
@ -247,5 +247,29 @@ describe('Review workflows - Stages service', () => {
|
|||||||
expect(entityServiceMock.update).toBeCalled();
|
expect(entityServiceMock.update).toBeCalled();
|
||||||
expect(entityServiceMock.delete).toBeCalled();
|
expect(entityServiceMock.delete).toBeCalled();
|
||||||
});
|
});
|
||||||
|
|
||||||
|
test('Undefined destination stage permissions should apply a partial permission update', async () => {
|
||||||
|
const srcStages = workflowMock.stages.map((stage) => ({
|
||||||
|
...stage,
|
||||||
|
permissions: [{ id: 1, role: 'role', action: 'action' }],
|
||||||
|
}));
|
||||||
|
|
||||||
|
const destStages = workflowMock.stages.map((stage, index) => ({
|
||||||
|
...stage,
|
||||||
|
name: `Updated Name ${index}`,
|
||||||
|
}));
|
||||||
|
|
||||||
|
await stagesService.replaceStages(srcStages, destStages);
|
||||||
|
|
||||||
|
expect(entityServiceMock.create).not.toBeCalled();
|
||||||
|
expect(entityServiceMock.delete).not.toBeCalled();
|
||||||
|
expect(entityServiceMock.update).toBeCalledTimes(4);
|
||||||
|
|
||||||
|
destStages.forEach((stage, index) => {
|
||||||
|
expect(entityServiceMock.update).toBeCalledWith('admin::workflow-stage', stage.id, {
|
||||||
|
data: { ...stage, permissions: srcStages[index].permissions },
|
||||||
|
});
|
||||||
|
});
|
||||||
|
});
|
||||||
});
|
});
|
||||||
});
|
});
|
||||||
|
@ -78,12 +78,12 @@ module.exports = ({ strapi }) => {
|
|||||||
},
|
},
|
||||||
|
|
||||||
async update(srcStage, destStage) {
|
async update(srcStage, destStage) {
|
||||||
let stagePermissions = [];
|
let stagePermissions = srcStage?.permissions ?? [];
|
||||||
const stageId = destStage.id;
|
const stageId = destStage.id;
|
||||||
|
|
||||||
await this.deleteStagePermissions([srcStage]);
|
|
||||||
|
|
||||||
if (destStage.permissions) {
|
if (destStage.permissions) {
|
||||||
|
await this.deleteStagePermissions([srcStage]);
|
||||||
|
|
||||||
const permissions = await mapAsync(destStage.permissions, (permission) =>
|
const permissions = await mapAsync(destStage.permissions, (permission) =>
|
||||||
stagePermissionsService.register(permission.role, permission.action, stageId)
|
stagePermissionsService.register(permission.role, permission.action, stageId)
|
||||||
);
|
);
|
||||||
@ -153,6 +153,7 @@ module.exports = ({ strapi }) => {
|
|||||||
// Update the workflow stages
|
// Update the workflow stages
|
||||||
await mapAsync(updated, (destStage) => {
|
await mapAsync(updated, (destStage) => {
|
||||||
const srcStage = srcStages.find((s) => s.id === destStage.id);
|
const srcStage = srcStages.find((s) => s.id === destStage.id);
|
||||||
|
|
||||||
return this.update(srcStage, destStage);
|
return this.update(srcStage, destStage);
|
||||||
});
|
});
|
||||||
|
|
||||||
|
Loading…
x
Reference in New Issue
Block a user