From 6789facdfcfd67765570fac6b529a9bf1002abcd Mon Sep 17 00:00:00 2001 From: Marcelo Schmidt Date: Tue, 12 Jan 2016 17:16:16 -0200 Subject: [PATCH] Set/Unset moderator via streams --- .../server/models/Subscriptions.coffee | 9 ++++++ packages/rocketchat-ui/lib/collections.coffee | 2 +- packages/rocketchat-ui/views/app/room.coffee | 17 +++++++++- server/methods/getRoomModerators.coffee | 15 +++++++++ server/publications/roomModerators.coffee | 32 ------------------- 5 files changed, 41 insertions(+), 34 deletions(-) create mode 100644 server/methods/getRoomModerators.coffee delete mode 100644 server/publications/roomModerators.coffee diff --git a/packages/rocketchat-lib/server/models/Subscriptions.coffee b/packages/rocketchat-lib/server/models/Subscriptions.coffee index 76e10ec3da9..5a324807120 100644 --- a/packages/rocketchat-lib/server/models/Subscriptions.coffee +++ b/packages/rocketchat-lib/server/models/Subscriptions.coffee @@ -25,6 +25,15 @@ RocketChat.models.Subscriptions = new class extends RocketChat.models._Base return @find query, options + # FIND + findByRoomIdAndRoles: (roomId, roles, options) -> + roles = [].concat roles + query = + "rid": roomId + "roles": { $in: roles } + + return @find query, options + getLastSeen: (options = {}) -> query = { ls: { $exists: 1 } } options.sort = { ls: -1 } diff --git a/packages/rocketchat-ui/lib/collections.coffee b/packages/rocketchat-ui/lib/collections.coffee index f238e04b016..1ac9008435f 100644 --- a/packages/rocketchat-ui/lib/collections.coffee +++ b/packages/rocketchat-ui/lib/collections.coffee @@ -1,7 +1,7 @@ @ChatMessage = new Meteor.Collection null @ChatRoom = new Meteor.Collection 'rocketchat_room' @ChatSubscription = new Meteor.Collection 'rocketchat_subscription' -@RoomModerators = new Mongo.Collection 'room_moderators' +@RoomModerators = new Mongo.Collection null @UserAndRoom = new Meteor.Collection null @CachedChannelList = new Meteor.Collection null diff --git a/packages/rocketchat-ui/views/app/room.coffee b/packages/rocketchat-ui/views/app/room.coffee index 9156d07e1f1..d26c22594c7 100644 --- a/packages/rocketchat-ui/views/app/room.coffee +++ b/packages/rocketchat-ui/views/app/room.coffee @@ -493,7 +493,22 @@ Template.room.onCreated -> @autorun => @subscribe 'fullUserData', Session.get('showUserInfo'), 1 - @subscribe 'roomModerators', @data._id + Meteor.call 'getRoomModerators', @data._id, (error, results) -> + if error + return toastr.error error.reason + + for record in results + RoomModerators.insert record + + RocketChat.callbacks.add('streamMessage', (msg) -> + if msg.t is 'new-moderator' + user = Meteor.users.findOne({ username: msg.msg }, { fields: { username: 1 } }) + RoomModerators.upsert({ _id: msg._id }, { $set: { rid: msg.rid, u: user } }) # use message _id to prevent from running it twice (https://github.com/RocketChat/Rocket.Chat/issues/1876) + else if msg.t is 'moderator-removed' + user = Meteor.users.findOne({ username: msg.msg }) + RoomModerators.remove({ rid: msg.rid, "u._id": user._id }); + return msg + , RocketChat.callbacks.priority.LOW, 'addOrRemoveModerator') Template.room.onDestroyed -> window.removeEventListener 'resize', this.onWindowResize diff --git a/server/methods/getRoomModerators.coffee b/server/methods/getRoomModerators.coffee new file mode 100644 index 00000000000..2cd263ac2db --- /dev/null +++ b/server/methods/getRoomModerators.coffee @@ -0,0 +1,15 @@ +Meteor.methods + getRoomModerators: (rid) -> + unless Meteor.userId() + throw new Meteor.Error 'invalid-user', '[methods] getRoomModerators -> Invalid user' + + check rid, String + + options = + sort: + "u.username": 1 + fields: + rid: 1 + u: 1 + + return RocketChat.models.Subscriptions.findByRoomIdAndRoles(rid, 'moderator', options).fetch() diff --git a/server/publications/roomModerators.coffee b/server/publications/roomModerators.coffee deleted file mode 100644 index 2d293914d3c..00000000000 --- a/server/publications/roomModerators.coffee +++ /dev/null @@ -1,32 +0,0 @@ -Meteor.publish 'roomModerators', (rid, limit = 50) -> - unless this.userId - return this.ready() - - pub = this - - query = - rid: rid - roles: 'moderator' - - options = - limit: limit - sort: - "u.username": 1 - fields: - rid: 1 - u: 1 - - cursor = RocketChat.models.Subscriptions.find(query, options).observeChanges - added: (_id, record) -> - pub.added('room_moderators', _id, record) - - changed: (_id, record) -> - pub.changed('room_moderators', _id, record) - - removed: (_id, record) -> - pub.removed('room_moderators', _id, record) - - this.ready() - this.onStop -> - cursor.stop() -