From 4f4ab98db4d44af4f2196a251966df4f9a5ae785 Mon Sep 17 00:00:00 2001 From: lucassartor Date: Mon, 28 Jun 2021 10:39:23 -0300 Subject: [PATCH 1/6] create roles.delete endpoint --- app/api/server/v1/roles.js | 32 ++++++++++++++++++++++++++++++++ 1 file changed, 32 insertions(+) diff --git a/app/api/server/v1/roles.js b/app/api/server/v1/roles.js index 5f2b39f624ba6..a4ede86bc4977 100644 --- a/app/api/server/v1/roles.js +++ b/app/api/server/v1/roles.js @@ -181,3 +181,35 @@ API.v1.addRoute('roles.update', { authRequired: true }, { }); }, }); + +API.v1.addRoute('roles.delete', { authRequired: true }, { + post() { + check(this.bodyParams, { + roleId: String + }); + + if (!hasPermission(Meteor.userId(), 'access-permissions')) { + throw new Meteor.Error('error-action-not-allowed', 'Accessing permissions is not allowed'); + } + + const role = Roles.findOneByIdOrName(this.bodyParams.roleId); + + if (!role) { + throw new Meteor.Error('error-invalid-roleId', 'This role does not exist'); + } + + if (role.protected) { + throw new Meteor.Error('error-role-protected', 'Cannot delete a protected role'); + } + + const existingUsers = Roles.findUsersInRole(role._id, role.scope); + + if (existingUsers && existingUsers.count() > 0) { + throw new Meteor.Error('error-role-in-use', 'Cannot delete role because it\'s in use'); + } + + Roles.remove(role._id) + + return API.v1.success(); + } +}); From c610151a38b83533ca2ab2bd54a737d37d3f5c12 Mon Sep 17 00:00:00 2001 From: lucassartor Date: Mon, 28 Jun 2021 11:39:05 -0300 Subject: [PATCH 2/6] add tests for new endpoint --- tests/end-to-end/api/13-roles.js | 78 +++++++++++++++++++++++++++++++- 1 file changed, 77 insertions(+), 1 deletion(-) diff --git a/tests/end-to-end/api/13-roles.js b/tests/end-to-end/api/13-roles.js index a05b5206eea2c..0341d2c5ee4d2 100644 --- a/tests/end-to-end/api/13-roles.js +++ b/tests/end-to-end/api/13-roles.js @@ -31,7 +31,27 @@ function createRole(name, scope, description) { }); } -describe('[Roles]', function() { +function addUserToRole(roleId, username) { + return new Promise((resolve) => { + request.post(api('roles.addUserToRole')) + .set(credentials) + .send({ + roleName: roleId, + username + }) + .expect('Content-Type', 'application/json') + .expect(200) + .expect((res) => { + expect(res.body).to.have.property('success', true); + expect(res.body).to.have.nested.property('role._id', roleId); + }) + .end((err, req) => { + resolve(req.body.role); + }); + }); +} + +describe.only('[Roles]', function() { this.retries(0); before((done) => getCredentials(done)); @@ -310,4 +330,60 @@ describe('[Roles]', function() { .end(done); }); }); + + describe('POST [/roles.delete]', () => { + let roleWithUser; + let roleWithoutUser; + before(async () => { + roleWithUser = await createRole(`roleWithUser-${ Date.now() }`, 'Users'); + roleWithoutUser = await createRole(`roleWithoutUser-${ Date.now() }`, 'Users'); + + await addUserToRole(roleWithUser._id, login.user); + console.log(login.user); + }); + + it('should delete a role that it is not being used', (done) => { + request.post(api('roles.delete')) + .set(credentials) + .send({ + roleId: roleWithoutUser._id + }) + .expect('Content-Type', 'application/json') + .expect(200) + .expect((res) => { + expect(res.body).to.have.property('success', true); + }) + .end(done); + }); + + it('should NOT delete a role that it is protected', (done) => { + request.post(api('roles.delete')) + .set(credentials) + .send({ + roleId: 'admin' + }) + .expect('Content-Type', 'application/json') + .expect(400) + .expect((res) => { + expect(res.body).to.have.property('success', false); + expect(res.body).to.have.nested.property('error', 'Cannot delete a protected role [error-role-protected]'); + }) + .end(done); + }); + + it('should NOT delete a role that it is being used', (done) => { + request.post(api('roles.delete')) + .set(credentials) + .send({ + roleId: roleWithUser._id + }) + .expect('Content-Type', 'application/json') + .expect(400) + .expect((res) => { + expect(res.body).to.have.property('success', false); + expect(res.body).to.have.nested.property('error', 'Cannot delete role because it\'s in use [error-role-in-use]'); + }) + .end(done); + }); + }); }); From 465fb76ebbdb7651bd73f099732b980a0be58f52 Mon Sep 17 00:00:00 2001 From: lucassartor Date: Mon, 28 Jun 2021 11:52:23 -0300 Subject: [PATCH 3/6] fix eslint stuff --- app/api/server/v1/roles.js | 6 +++--- tests/end-to-end/api/13-roles.js | 8 ++++---- 2 files changed, 7 insertions(+), 7 deletions(-) diff --git a/app/api/server/v1/roles.js b/app/api/server/v1/roles.js index a4ede86bc4977..bcad95b964dd1 100644 --- a/app/api/server/v1/roles.js +++ b/app/api/server/v1/roles.js @@ -185,7 +185,7 @@ API.v1.addRoute('roles.update', { authRequired: true }, { API.v1.addRoute('roles.delete', { authRequired: true }, { post() { check(this.bodyParams, { - roleId: String + roleId: String, }); if (!hasPermission(Meteor.userId(), 'access-permissions')) { @@ -208,8 +208,8 @@ API.v1.addRoute('roles.delete', { authRequired: true }, { throw new Meteor.Error('error-role-in-use', 'Cannot delete role because it\'s in use'); } - Roles.remove(role._id) + Roles.remove(role._id); return API.v1.success(); - } + }, }); diff --git a/tests/end-to-end/api/13-roles.js b/tests/end-to-end/api/13-roles.js index 0341d2c5ee4d2..91df384e13b4c 100644 --- a/tests/end-to-end/api/13-roles.js +++ b/tests/end-to-end/api/13-roles.js @@ -37,7 +37,7 @@ function addUserToRole(roleId, username) { .set(credentials) .send({ roleName: roleId, - username + username, }) .expect('Content-Type', 'application/json') .expect(200) @@ -346,7 +346,7 @@ describe.only('[Roles]', function() { request.post(api('roles.delete')) .set(credentials) .send({ - roleId: roleWithoutUser._id + roleId: roleWithoutUser._id, }) .expect('Content-Type', 'application/json') .expect(200) @@ -360,7 +360,7 @@ describe.only('[Roles]', function() { request.post(api('roles.delete')) .set(credentials) .send({ - roleId: 'admin' + roleId: 'admin', }) .expect('Content-Type', 'application/json') .expect(400) @@ -375,7 +375,7 @@ describe.only('[Roles]', function() { request.post(api('roles.delete')) .set(credentials) .send({ - roleId: roleWithUser._id + roleId: roleWithUser._id, }) .expect('Content-Type', 'application/json') .expect(400) From cfbe9c51e2e5158902bd968701b0e462bc644aa3 Mon Sep 17 00:00:00 2001 From: Lucas Sartor Chauvin Date: Mon, 28 Jun 2021 13:12:10 -0300 Subject: [PATCH 4/6] remove .only from test --- tests/end-to-end/api/13-roles.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/tests/end-to-end/api/13-roles.js b/tests/end-to-end/api/13-roles.js index 91df384e13b4c..bca7418ffdbf1 100644 --- a/tests/end-to-end/api/13-roles.js +++ b/tests/end-to-end/api/13-roles.js @@ -51,7 +51,7 @@ function addUserToRole(roleId, username) { }); } -describe.only('[Roles]', function() { +describe('[Roles]', function() { this.retries(0); before((done) => getCredentials(done)); From 790bc5f71c20154165b2184c7e58d05484174794 Mon Sep 17 00:00:00 2001 From: Lucas Sartor Chauvin Date: Mon, 28 Jun 2021 13:14:46 -0300 Subject: [PATCH 5/6] remove console.log --- tests/end-to-end/api/13-roles.js | 1 - 1 file changed, 1 deletion(-) diff --git a/tests/end-to-end/api/13-roles.js b/tests/end-to-end/api/13-roles.js index bca7418ffdbf1..207aa83b22941 100644 --- a/tests/end-to-end/api/13-roles.js +++ b/tests/end-to-end/api/13-roles.js @@ -339,7 +339,6 @@ describe('[Roles]', function() { roleWithoutUser = await createRole(`roleWithoutUser-${ Date.now() }`, 'Users'); await addUserToRole(roleWithUser._id, login.user); - console.log(login.user); }); it('should delete a role that it is not being used', (done) => { From d9847830eb85c63daa5d3c97cd49285f5f1aaf4a Mon Sep 17 00:00:00 2001 From: Lucas Sartor Chauvin Date: Tue, 29 Jun 2021 12:54:54 -0300 Subject: [PATCH 6/6] remove Meteor.userId() Co-authored-by: pierre-lehnen-rc <55164754+pierre-lehnen-rc@users.noreply.github.com> --- app/api/server/v1/roles.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/app/api/server/v1/roles.js b/app/api/server/v1/roles.js index bcad95b964dd1..e66e54959873f 100644 --- a/app/api/server/v1/roles.js +++ b/app/api/server/v1/roles.js @@ -188,7 +188,7 @@ API.v1.addRoute('roles.delete', { authRequired: true }, { roleId: String, }); - if (!hasPermission(Meteor.userId(), 'access-permissions')) { + if (!hasPermission(this.userId, 'access-permissions')) { throw new Meteor.Error('error-action-not-allowed', 'Accessing permissions is not allowed'); }