diff --git a/packages/rocketchat-api/server/routes.coffee b/packages/rocketchat-api/server/routes.coffee index 950336464d6..9cc05904b38 100644 --- a/packages/rocketchat-api/server/routes.coffee +++ b/packages/rocketchat-api/server/routes.coffee @@ -104,3 +104,9 @@ RocketChat.API.v1.addRoute 'channels.create', authRequired: true, return RocketChat.API.v1.success channel: RocketChat.models.Rooms.findOne({_id: id.rid}) + +# List Private Groups a user has access to +RocketChat.API.v1.addRoute 'groups.list', authRequired: true, + get: -> + roomIds = _.pluck RocketChat.models.Subscriptions.findByTypeAndUserId('p', @userId).fetch(), 'rid' + return { groups: RocketChat.models.Rooms.findByIds(roomIds).fetch() } diff --git a/packages/rocketchat-lib/server/models/Rooms.coffee b/packages/rocketchat-lib/server/models/Rooms.coffee index ad5c9aec060..2dc83959854 100644 --- a/packages/rocketchat-lib/server/models/Rooms.coffee +++ b/packages/rocketchat-lib/server/models/Rooms.coffee @@ -160,7 +160,7 @@ RocketChat.models.Rooms = new class extends RocketChat.models._Base return @find query, options - findByTypeAndNameContainigUsername: (type, name, username, options) -> + findByTypeAndNameContainingUsername: (type, name, username, options) -> query = name: name t: type diff --git a/server/methods/groupsList.js b/server/methods/groupsList.js new file mode 100644 index 00000000000..bfde693a59f --- /dev/null +++ b/server/methods/groupsList.js @@ -0,0 +1,37 @@ +Meteor.methods({ + groupsList: function(nameFilter, limit, sort) { + if (!Meteor.userId()) { + throw new Meteor.Error('error-invalid-user', 'Invalid user', { method: 'groupsList' }); + } + + let options = { + fields: { name: 1 }, + sort: { msgs: -1 } + }; + + //Verify the limit param is a number + if (_.isNumber(limit)) { + options.limit = limit; + } + + //Verify there is a sort option and it's a string + if (_.trim(sort)) { + switch (sort) { + case 'name': + options.sort = { name: 1 }; + break; + case 'msgs': + options.sort = { msgs: -1 }; + break; + } + } + + //Determine if they are searching or not, base it upon the name field + if (nameFilter) { + return { groups: RocketChat.models.Rooms.findByTypeAndNameContainingUsername('p', new RegExp(s.trim(s.escapeRegExp(nameFilter)), 'i'), Meteor.user().username, options).fetch() }; + } else { + let roomIds = _.pluck(RocketChat.models.Subscriptions.findByTypeAndUserId('p', Meteor.userId()).fetch(), 'rid'); + return { groups: RocketChat.models.Rooms.findByIds(roomIds, options).fetch() }; + } + } +}); diff --git a/server/startup/roomPublishes.coffee b/server/startup/roomPublishes.coffee index b69a301e131..ecf4f9f18b8 100644 --- a/server/startup/roomPublishes.coffee +++ b/server/startup/roomPublishes.coffee @@ -32,7 +32,7 @@ Meteor.startup -> archived: 1 user = RocketChat.models.Users.findOneById this.userId, fields: username: 1 - return RocketChat.models.Rooms.findByTypeAndNameContainigUsername 'p', identifier, user.username, options + return RocketChat.models.Rooms.findByTypeAndNameContainingUsername 'p', identifier, user.username, options RocketChat.roomTypes.setPublish 'd', (identifier) -> options =