From bb842f2e4d60bd2b0cfe136e1dceda976baba544 Mon Sep 17 00:00:00 2001 From: Marcos Spessatto Defendi Date: Tue, 17 Dec 2019 15:11:28 -0300 Subject: [PATCH] [IMPROVE] Replace roles publication by REST (#15910) --- app/authorization/client/lib/streamer.js | 3 +++ app/authorization/client/startup.js | 16 +++++++++++++++- .../client/views/permissionsRole.js | 2 -- app/authorization/server/lib/streamer.js | 5 +++++ app/authorization/server/methods/deleteRole.js | 11 +++++++++-- app/authorization/server/methods/saveRole.js | 6 +++++- app/authorization/server/publications/roles.js | 1 + app/models/client/models/Roles.js | 2 +- 8 files changed, 39 insertions(+), 7 deletions(-) create mode 100644 app/authorization/client/lib/streamer.js create mode 100644 app/authorization/server/lib/streamer.js diff --git a/app/authorization/client/lib/streamer.js b/app/authorization/client/lib/streamer.js new file mode 100644 index 00000000000..1aab5af6eb4 --- /dev/null +++ b/app/authorization/client/lib/streamer.js @@ -0,0 +1,3 @@ +import { Meteor } from 'meteor/meteor'; + +export const rolesStreamer = new Meteor.Streamer('roles'); diff --git a/app/authorization/client/startup.js b/app/authorization/client/startup.js index 3656b7d0043..99c1f06e760 100644 --- a/app/authorization/client/startup.js +++ b/app/authorization/client/startup.js @@ -3,9 +3,15 @@ import { Meteor } from 'meteor/meteor'; import { hasAtLeastOnePermission } from './hasPermission'; import { CachedCollectionManager } from '../../ui-cached-collection'; import { AdminBox } from '../../ui-utils/client/lib/AdminBox'; +import { APIClient } from '../../utils/client'; +import { Roles } from '../../models/client'; +import { rolesStreamer } from './lib/streamer'; Meteor.startup(() => { - CachedCollectionManager.onLogin(() => Meteor.subscribe('roles')); + CachedCollectionManager.onLogin(async () => { + const { roles } = await APIClient.v1.get('roles.list'); + roles.forEach((role) => Roles.insert(role)); + }); AdminBox.addOption({ href: 'admin-permissions', @@ -15,4 +21,12 @@ Meteor.startup(() => { return hasAtLeastOnePermission(['access-permissions', 'access-setting-permissions']); }, }); + const events = { + changed: (role) => { + delete role.type; + Roles.upsert({ _id: role.name }, role); + }, + removed: (role) => Roles.remove({ _id: role.name }), + }; + rolesStreamer.on('roles', (role) => events[role.type](role)); }); diff --git a/app/authorization/client/views/permissionsRole.js b/app/authorization/client/views/permissionsRole.js index 1788e47a2dd..50dd6b0e607 100644 --- a/app/authorization/client/views/permissionsRole.js +++ b/app/authorization/client/views/permissionsRole.js @@ -256,8 +256,6 @@ Template.permissionsRole.onCreated(async function() { this.searchRoom = new ReactiveVar(); this.searchUsername = new ReactiveVar(); this.usersInRole = new ReactiveVar([]); - - this.subscription = this.subscribe('roles', FlowRouter.getParam('name')); }); Template.permissionsRole.onRendered(function() { diff --git a/app/authorization/server/lib/streamer.js b/app/authorization/server/lib/streamer.js new file mode 100644 index 00000000000..f00103832be --- /dev/null +++ b/app/authorization/server/lib/streamer.js @@ -0,0 +1,5 @@ +import { Meteor } from 'meteor/meteor'; + +export const rolesStreamer = new Meteor.Streamer('roles'); +rolesStreamer.allowWrite('none'); +rolesStreamer.allowRead('logged'); diff --git a/app/authorization/server/methods/deleteRole.js b/app/authorization/server/methods/deleteRole.js index 8613e1761b0..0b42263c23f 100644 --- a/app/authorization/server/methods/deleteRole.js +++ b/app/authorization/server/methods/deleteRole.js @@ -2,6 +2,7 @@ import { Meteor } from 'meteor/meteor'; import * as Models from '../../../models/server'; import { hasPermission } from '../functions/hasPermission'; +import { rolesStreamer } from '../lib/streamer'; Meteor.methods({ 'authorization:deleteRole'(roleName) { @@ -34,7 +35,13 @@ Meteor.methods({ method: 'authorization:deleteRole', }); } - - return Models.Roles.remove(role.name); + const removed = Models.Roles.remove(role.name); + if (removed) { + rolesStreamer.emit('roles', { + type: 'removed', + name: roleName, + }); + } + return removed; }, }); diff --git a/app/authorization/server/methods/saveRole.js b/app/authorization/server/methods/saveRole.js index 5f0998e7d49..64cb3437c9d 100644 --- a/app/authorization/server/methods/saveRole.js +++ b/app/authorization/server/methods/saveRole.js @@ -4,6 +4,7 @@ import { Roles } from '../../../models/server'; import { settings } from '../../../settings/server'; import { Notifications } from '../../../notifications/server'; import { hasPermission } from '../functions/hasPermission'; +import { rolesStreamer } from '../lib/streamer'; Meteor.methods({ 'authorization:saveRole'(roleData) { @@ -31,7 +32,10 @@ Meteor.methods({ _id: roleData.name, }); } - + rolesStreamer.emit('roles', { + type: 'changed', + ...roleData, + }); return update; }, }); diff --git a/app/authorization/server/publications/roles.js b/app/authorization/server/publications/roles.js index 57e17673eae..c4ca8d926eb 100644 --- a/app/authorization/server/publications/roles.js +++ b/app/authorization/server/publications/roles.js @@ -4,6 +4,7 @@ import { Roles } from '../../../models'; import { clearCache } from '../functions/hasPermission'; Meteor.publish('roles', function() { + console.warn('The publication "roles" is deprecated and will be removed after version v3.0.0'); if (!this.userId) { return this.ready(); } diff --git a/app/models/client/models/Roles.js b/app/models/client/models/Roles.js index 0d720ac90f9..b0acacdfd18 100644 --- a/app/models/client/models/Roles.js +++ b/app/models/client/models/Roles.js @@ -2,7 +2,7 @@ import { Mongo } from 'meteor/mongo'; import * as Models from '..'; -const Roles = new Mongo.Collection('rocketchat_roles'); +const Roles = new Mongo.Collection(null); Object.assign(Roles, { findUsersInRole(name, scope, options) {