diff --git a/packages/rocketchat-lib/server/models/Rooms.coffee b/packages/rocketchat-lib/server/models/Rooms.coffee index 97c9be55d85c..42b3ce211757 100644 --- a/packages/rocketchat-lib/server/models/Rooms.coffee +++ b/packages/rocketchat-lib/server/models/Rooms.coffee @@ -139,6 +139,15 @@ RocketChat.models.Rooms = new class extends RocketChat.models._Base return @find query, options + findByNameAndTypeNotContainingUsername: (name, type, username, options) -> + query = + t: type + name: name + usernames: + $ne: username + + return @find query, options + findByNameStartingAndTypes: (name, types, options) -> nameRegex = new RegExp "^" + s.trim(s.escapeRegExp(name)), "i" diff --git a/packages/rocketchat-ui/views/app/spotlight/spotlight.coffee b/packages/rocketchat-ui/views/app/spotlight/spotlight.coffee index eb2c81eed4da..904974fca012 100644 --- a/packages/rocketchat-ui/views/app/spotlight/spotlight.coffee +++ b/packages/rocketchat-ui/views/app/spotlight/spotlight.coffee @@ -7,6 +7,21 @@ $('.spotlight').removeClass('hidden') $('.spotlight input').focus() +serverResults = new ReactiveVar +serverSearch = new ReactiveVar + +Tracker.autorun -> + text = serverSearch.get() + serverResults.set() + + if text?.trim().length >= 2 + Meteor.call 'spotlight', text, Meteor.user().username, (err, results) -> + if err? + return console.log err + + serverResults.set(results) + + Template.spotlight.helpers popupConfig: -> self = this @@ -23,7 +38,27 @@ Template.spotlight.helpers getFilter: (collection, filter) -> exp = new RegExp("#{RegExp.escape filter}", 'i') - return collection.find({name: exp, rid: {$ne: Session.get('openedRoom')}}, {limit: 10, sort: {unread: -1, ls: -1}}).fetch() + serverSearch.set(filter) + + memory = collection.find({name: exp, rid: {$ne: Session.get('openedRoom')}}, {limit: 10, sort: {unread: -1, ls: -1}}).fetch() + server = serverResults.get() + + if server?.users?.length > 0 + for user in server.users + memory.push({ + t: 'd', + name: user.username + }) + + if server?.rooms?.length > 0 + for room in server.rooms + memory.push({ + t: 'c', + name: room.name + }) + + return memory + getValue: (_id, collection, firstPartValue) -> doc = collection.findOne(_id) diff --git a/server/publications/spotlight.coffee b/server/publications/spotlight.coffee index e95824cc595b..798c737daff6 100644 --- a/server/publications/spotlight.coffee +++ b/server/publications/spotlight.coffee @@ -1,27 +1,25 @@ -Meteor.publish 'spotlight', (selector, options, collName) -> - if not this.userId? or not selector?.name?.$regex? - return this.ready() +Meteor.methods + spotlight: (text, username) -> + if not this.userId? + return { + users: [] + rooms: [] + } - self = this - subHandleUsers = null - subHandleRooms = null + regex = new RegExp s.trim(s.escapeRegExp(text)), "i" - subHandleUsers = RocketChat.models.Users.findUsersByNameOrUsername(new RegExp(selector.name.$regex, 'i'), { limit: 10, fields: { name: 1, username: 1, status: 1 }, sort: { name: 1 } }).observeChanges - added: (id, fields) -> - data = { type: 'u', uid: id, username: fields.username, name: fields.username + ' - ' + fields.name, status: fields.status } - self.added("autocompleteRecords", id, data) - removed: (id) -> - self.removed("autocompleteRecords", id) + users = RocketChat.models.Users.findByUsername(regex, { limit: 5, fields: { username: 1, status: 1 }, sort: { username: 1 } }).fetch() - subHandleRooms = RocketChat.models.Rooms.findByNameContainingAndTypes(selector.name.$regex, ['c'], { limit: 10, fields: { t: 1, name: 1 }, sort: {name: 1}}).observeChanges - added: (id, fields) -> - data = { type: 'r', rid: id, name: fields.name, t: fields.t } - self.added("autocompleteRecords", id, data) - removed: (id) -> - self.removed("autocompleteRecords", id) + rooms = RocketChat.models.Rooms.findByNameAndTypeNotContainingUsername(regex, 'c', username, { limit: 5, fields: { t: 1, name: 1 }, sort: { name: 1 } }).fetch() - this.ready() + return { + users: users + rooms: rooms + } - this.onStop -> - subHandleUsers?.stop() - subHandleRooms?.stop() +DDPRateLimiter.addRule + type: 'method' + name: 'spotlight' + userId: (userId) -> + return true +, 10, 10000