diff --git a/client/methods/deleteMessage.js b/client/methods/deleteMessage.js index d69dfd5be60..0db295059f7 100644 --- a/client/methods/deleteMessage.js +++ b/client/methods/deleteMessage.js @@ -1,6 +1,8 @@ import { Meteor } from 'meteor/meteor'; import { Tracker } from 'meteor/tracker'; import { ChatMessage } from 'meteor/rocketchat:models'; +import { hasAtLeastOnePermission } from 'meteor/rocketchat:authorization'; +import { settings } from 'meteor/rocketchat:settings'; import _ from 'underscore'; import moment from 'moment'; @@ -13,9 +15,9 @@ Meteor.methods({ // We're now only passed in the `_id` property to lower the amount of data sent to the server message = ChatMessage.findOne({ _id: message._id }); - const hasPermission = RocketChat.authz.hasAtLeastOnePermission('delete-message', message.rid); - const forceDelete = RocketChat.authz.hasAtLeastOnePermission('force-delete-message', message.rid); - const deleteAllowed = RocketChat.settings.get('Message_AllowDeleting'); + const hasPermission = hasAtLeastOnePermission('delete-message', message.rid); + const forceDelete = hasAtLeastOnePermission('force-delete-message', message.rid); + const deleteAllowed = settings.get('Message_AllowDeleting'); let deleteOwn = false; if (message && message.u && message.u._id) { @@ -24,7 +26,7 @@ Meteor.methods({ if (!(forceDelete || hasPermission || (deleteAllowed && deleteOwn))) { return false; } - const blockDeleteInMinutes = RocketChat.settings.get('Message_AllowDeleting_BlockDeleteInMinutes'); + const blockDeleteInMinutes = settings.get('Message_AllowDeleting_BlockDeleteInMinutes'); if (!forceDelete && _.isNumber(blockDeleteInMinutes) && blockDeleteInMinutes !== 0) { const msgTs = moment(message.ts); const currentTsDiff = moment().diff(msgTs, 'minutes'); diff --git a/client/methods/updateMessage.js b/client/methods/updateMessage.js index 5aa41618387..2a6c7dc0c60 100644 --- a/client/methods/updateMessage.js +++ b/client/methods/updateMessage.js @@ -3,6 +3,9 @@ import { Tracker } from 'meteor/tracker'; import { TimeSync } from 'meteor/mizzao:timesync'; import { t } from 'meteor/rocketchat:utils'; import { ChatMessage } from 'meteor/rocketchat:models'; +import { hasAtLeastOnePermission } from 'meteor/rocketchat:authorization'; +import { settings } from 'meteor/rocketchat:settings'; +import { callbacks } from 'meteor/rocketchat:callbacks'; import _ from 'underscore'; import moment from 'moment'; import toastr from 'toastr'; @@ -15,8 +18,8 @@ Meteor.methods({ const originalMessage = ChatMessage.findOne(message._id); - const hasPermission = RocketChat.authz.hasAtLeastOnePermission('edit-message', message.rid); - const editAllowed = RocketChat.settings.get('Message_AllowEditing'); + const hasPermission = hasAtLeastOnePermission('edit-message', message.rid); + const editAllowed = settings.get('Message_AllowEditing'); let editOwn = false; if (originalMessage.msg === message.msg) { return; @@ -32,7 +35,7 @@ Meteor.methods({ return false; } - const blockEditInMinutes = RocketChat.settings.get('Message_AllowEditing_BlockEditInMinutes'); + const blockEditInMinutes = settings.get('Message_AllowEditing_BlockEditInMinutes'); if (_.isNumber(blockEditInMinutes) && blockEditInMinutes !== 0) { if (originalMessage.ts) { const msgTs = moment(originalMessage.ts); @@ -59,7 +62,7 @@ Meteor.methods({ username: me.username, }; - message = RocketChat.callbacks.run('beforeSaveMessage', message); + message = callbacks.run('beforeSaveMessage', message); const messageObject = { editedAt: message.editedAt, editedBy: message.editedBy, msg: message.msg }; if (originalMessage.attachments) { diff --git a/client/notifications/UsersNameChanged.js b/client/notifications/UsersNameChanged.js index eddaa5e4e05..689923b5d7e 100644 --- a/client/notifications/UsersNameChanged.js +++ b/client/notifications/UsersNameChanged.js @@ -1,8 +1,10 @@ import { Meteor } from 'meteor/meteor'; +import { Notifications } from 'meteor/rocketchat:notifications'; +import { Messages, Subscriptions } from 'meteor/rocketchat:models'; Meteor.startup(function() { - RocketChat.Notifications.onLogged('Users:NameChanged', function({ _id, name, username }) { - RocketChat.models.Messages.update({ + Notifications.onLogged('Users:NameChanged', function({ _id, name, username }) { + Messages.update({ 'u._id': _id, }, { $set: { @@ -12,7 +14,7 @@ Meteor.startup(function() { multi: true, }); - RocketChat.models.Messages.update({ + Messages.update({ mentions: { $elemMatch: { _id }, }, @@ -24,7 +26,7 @@ Meteor.startup(function() { multi: true, }); - RocketChat.models.Subscriptions.update({ + Subscriptions.update({ name: username, t: 'd', }, { diff --git a/client/notifications/notification.js b/client/notifications/notification.js index bb406e8ab86..c901b99b9c8 100644 --- a/client/notifications/notification.js +++ b/client/notifications/notification.js @@ -2,7 +2,11 @@ import { Meteor } from 'meteor/meteor'; import { Tracker } from 'meteor/tracker'; import { FlowRouter } from 'meteor/kadira:flow-router'; import { Session } from 'meteor/session'; -import { KonchatNotification, fireGlobalEvent, readMessage, CachedChatSubscription } from 'meteor/rocketchat:ui'; +import { KonchatNotification } from 'meteor/rocketchat:ui'; +import { CachedChatSubscription } from 'meteor/rocketchat:models'; +import { fireGlobalEvent, readMessage, Layout } from 'meteor/rocketchat:ui-utils'; +import { getUserPreference } from 'meteor/rocketchat:utils'; +import { Notifications } from 'meteor/rocketchat:notifications'; // Show notifications and play a sound for new messages. // We trust the server to only send notifications for interesting messages, e.g. direct messages or @@ -23,7 +27,7 @@ function notifyNewRoom(sub) { Meteor.startup(function() { Tracker.autorun(function() { if (Meteor.userId()) { - RocketChat.Notifications.onUser('notification', function(notification) { + Notifications.onUser('notification', function(notification) { let openedRoomId = undefined; if (['channel', 'group', 'direct'].includes(FlowRouter.getRouteName())) { @@ -33,7 +37,7 @@ Meteor.startup(function() { // This logic is duplicated in /client/startup/unread.coffee. const hasFocus = readMessage.isEnable(); const messageIsInOpenedRoom = openedRoomId === notification.payload.rid; - const muteFocusedConversations = RocketChat.getUserPreference(Meteor.userId(), 'muteFocusedConversations'); + const muteFocusedConversations = getUserPreference(Meteor.userId(), 'muteFocusedConversations'); fireGlobalEvent('notification', { notification, @@ -41,7 +45,7 @@ Meteor.startup(function() { hasFocus, }); - if (RocketChat.Layout.isEmbedded()) { + if (Layout.isEmbedded()) { if (!hasFocus && messageIsInOpenedRoom) { // Play a sound and show a notification. KonchatNotification.newMessage(notification.payload.rid); @@ -57,16 +61,16 @@ Meteor.startup(function() { } }); - RocketChat.Notifications.onUser('audioNotification', function(notification) { + Notifications.onUser('audioNotification', function(notification) { const openedRoomId = Session.get('openedRoom'); // This logic is duplicated in /client/startup/unread.coffee. const hasFocus = readMessage.isEnable(); const messageIsInOpenedRoom = openedRoomId === notification.payload.rid; - const muteFocusedConversations = RocketChat.getUserPreference(Meteor.userId(), 'muteFocusedConversations'); + const muteFocusedConversations = getUserPreference(Meteor.userId(), 'muteFocusedConversations'); - if (RocketChat.Layout.isEmbedded()) { + if (Layout.isEmbedded()) { if (!hasFocus && messageIsInOpenedRoom) { // Play a notification sound KonchatNotification.newMessage(notification.payload.rid); @@ -83,7 +87,7 @@ Meteor.startup(function() { } }; - RocketChat.Notifications.onUser('subscriptions-changed', (action, sub) => { + Notifications.onUser('subscriptions-changed', (action, sub) => { notifyNewRoom(sub); }); } diff --git a/client/notifications/updateAvatar.js b/client/notifications/updateAvatar.js index b03d115ffdd..792f0d56d49 100644 --- a/client/notifications/updateAvatar.js +++ b/client/notifications/updateAvatar.js @@ -1,8 +1,9 @@ import { Meteor } from 'meteor/meteor'; -import { updateAvatarOfUsername } from 'meteor/rocketchat:ui'; +import { updateAvatarOfUsername } from 'meteor/rocketchat:ui-utils'; +import { Notifications } from 'meteor/rocketchat:notifications'; Meteor.startup(function() { - RocketChat.Notifications.onLogged('updateAvatar', function(data) { + Notifications.onLogged('updateAvatar', function(data) { updateAvatarOfUsername(data.username); }); }); diff --git a/client/notifications/updateUserState.js b/client/notifications/updateUserState.js index 84cbaf9af6a..e2a582e5576 100644 --- a/client/notifications/updateUserState.js +++ b/client/notifications/updateUserState.js @@ -1,9 +1,10 @@ import { Meteor } from 'meteor/meteor'; -import { fireGlobalEvent } from 'meteor/rocketchat:ui'; +import { fireGlobalEvent } from 'meteor/rocketchat:ui-utils'; +import { callbacks } from 'meteor/rocketchat:callbacks'; /* fire user state change globally, to listen on desktop electron client */ Meteor.startup(function() { - RocketChat.callbacks.add('userStatusManuallySet', (status) => { + callbacks.add('userStatusManuallySet', (status) => { fireGlobalEvent('user-status-manually-set', status); }); }); diff --git a/client/routes/roomRoute.js b/client/routes/roomRoute.js index e9d3a606b60..a30891a14cb 100644 --- a/client/routes/roomRoute.js +++ b/client/routes/roomRoute.js @@ -1,9 +1,10 @@ import { FlowRouter } from 'meteor/kadira:flow-router'; import { ChatSubscription } from 'meteor/rocketchat:models'; +import { roomTypes } from 'meteor/rocketchat:utils'; FlowRouter.goToRoomById = (roomId) => { const subscription = ChatSubscription.findOne({ rid: roomId }); if (subscription) { - RocketChat.roomTypes.openRouteLink(subscription.t, subscription, FlowRouter.current().queryParams); + roomTypes.openRouteLink(subscription.t, subscription, FlowRouter.current().queryParams); } }; diff --git a/client/routes/router.js b/client/routes/router.js index 8f1dfd71103..a125c9eae6c 100644 --- a/client/routes/router.js +++ b/client/routes/router.js @@ -6,6 +6,7 @@ import { FlowRouter } from 'meteor/kadira:flow-router'; import { BlazeLayout } from 'meteor/kadira:blaze-layout'; import { Session } from 'meteor/session'; import { KonchatNotification } from 'meteor/rocketchat:ui'; +import { Layout } from 'meteor/rocketchat:ui-utils'; import s from 'underscore.string'; Blaze.registerHelper('pathFor', function(path, kw) { @@ -27,7 +28,7 @@ FlowRouter.subscriptions = function() { FlowRouter.route('/', { name: 'index', action() { - BlazeLayout.render('main', { modal: RocketChat.Layout.isEmbedded(), center: 'loading' }); + BlazeLayout.render('main', { modal: Layout.isEmbedded(), center: 'loading' }); if (!Meteor.userId()) { return FlowRouter.go('home'); } diff --git a/client/startup/emailVerification.js b/client/startup/emailVerification.js index 04cdd75cfbb..277bcd28d9c 100644 --- a/client/startup/emailVerification.js +++ b/client/startup/emailVerification.js @@ -2,12 +2,13 @@ import { Meteor } from 'meteor/meteor'; import { Tracker } from 'meteor/tracker'; import { Session } from 'meteor/session'; import { TAPi18n } from 'meteor/tap:i18n'; +import { settings } from 'meteor/rocketchat:settings'; import toastr from 'toastr'; Meteor.startup(function() { Tracker.autorun(function() { const user = Meteor.user(); - if (user && user.emails && user.emails[0] && user.emails[0].verified !== true && RocketChat.settings.get('Accounts_EmailVerification') === true && !Session.get('Accounts_EmailVerification_Warning')) { + if (user && user.emails && user.emails[0] && user.emails[0].verified !== true && settings.get('Accounts_EmailVerification') === true && !Session.get('Accounts_EmailVerification_Warning')) { toastr.warning(TAPi18n.__('You_have_not_verified_your_email')); Session.set('Accounts_EmailVerification_Warning', true); } diff --git a/client/startup/i18n.js b/client/startup/i18n.js index d2f01ec8820..a6e693f2c1c 100644 --- a/client/startup/i18n.js +++ b/client/startup/i18n.js @@ -3,6 +3,8 @@ import { ReactiveVar } from 'meteor/reactive-var'; import { Tracker } from 'meteor/tracker'; import { TAPi18n } from 'meteor/tap:i18n'; import { isRtl } from 'meteor/rocketchat:utils'; +import { settings } from 'meteor/rocketchat:settings'; +import { Users } from 'meteor/rocketchat:models'; import moment from 'moment'; const currentLanguage = new ReactiveVar(); @@ -66,11 +68,11 @@ Meteor.startup(() => { }; window.setLanguage = setLanguage; - const defaultUserLanguage = () => RocketChat.settings.get('Language') || getBrowserLanguage() || 'en'; + const defaultUserLanguage = () => settings.get('Language') || getBrowserLanguage() || 'en'; window.defaultUserLanguage = defaultUserLanguage; Tracker.autorun(() => { - const user = RocketChat.models.Users.findOne(Meteor.userId(), { fields: { language: 1 } }); + const user = Users.findOne(Meteor.userId(), { fields: { language: 1 } }); setLanguage((user && user.language) || defaultUserLanguage()); }); diff --git a/client/startup/startup.js b/client/startup/startup.js index e5602cd1931..311fd2dbcad 100644 --- a/client/startup/startup.js +++ b/client/startup/startup.js @@ -3,7 +3,10 @@ import { Tracker } from 'meteor/tracker'; import { Session } from 'meteor/session'; import { TimeSync } from 'meteor/mizzao:timesync'; import { UserPresence } from 'meteor/konecty:user-presence'; -import { fireGlobalEvent } from 'meteor/rocketchat:ui'; +import { fireGlobalEvent } from 'meteor/rocketchat:ui-utils'; +import { settings } from 'meteor/rocketchat:settings'; +import { Users } from 'meteor/rocketchat:models'; +import { getUserPreference } from 'meteor/rocketchat:utils'; import toastr from 'toastr'; import hljs from 'highlight.js'; import 'highlight.js/styles/github.css'; @@ -26,7 +29,7 @@ Meteor.startup(function() { window.lastMessageWindowHistory = {}; Tracker.autorun(function(computation) { - if (!Meteor.userId() && !RocketChat.settings.get('Accounts_AllowAnonymousRead')) { + if (!Meteor.userId() && !settings.get('Accounts_AllowAnonymousRead')) { return; } Meteor.subscribe('userData'); @@ -39,7 +42,7 @@ Meteor.startup(function() { if (!Meteor.userId()) { return; } - const user = RocketChat.models.Users.findOne(Meteor.userId(), { + const user = Users.findOne(Meteor.userId(), { fields: { status: 1, 'settings.preferences.idleTimeLimit': 1, @@ -51,8 +54,8 @@ Meteor.startup(function() { return; } - if (RocketChat.getUserPreference(user, 'enableAutoAway')) { - const idleTimeLimit = RocketChat.getUserPreference(user, 'idleTimeLimit') || 300; + if (getUserPreference(user, 'enableAutoAway')) { + const idleTimeLimit = getUserPreference(user, 'idleTimeLimit') || 300; UserPresence.awayTime = idleTimeLimit * 1000; } else { delete UserPresence.awayTime; diff --git a/client/startup/unread.js b/client/startup/unread.js index b261ba9199b..46b6a74c2e4 100644 --- a/client/startup/unread.js +++ b/client/startup/unread.js @@ -5,6 +5,8 @@ import { Session } from 'meteor/session'; import { Favico } from 'meteor/rocketchat:favico'; import { ChatSubscription } from 'meteor/rocketchat:models'; import { RoomManager, menu, fireGlobalEvent, readMessage } from 'meteor/rocketchat:ui-utils'; +import { getUserPreference } from 'meteor/rocketchat:utils'; +import { settings } from 'meteor/rocketchat:settings'; Meteor.startup(function() { Tracker.autorun(function() { @@ -38,7 +40,7 @@ Meteor.startup(function() { // Increment the total unread count. unreadCount += subscription.unread; if (subscription.alert === true && subscription.unreadAlert !== 'nothing') { - const userUnreadAlert = RocketChat.getUserPreference(Meteor.userId(), 'unreadAlert'); + const userUnreadAlert = getUserPreference(Meteor.userId(), 'unreadAlert'); if (subscription.unreadAlert === 'all' || userUnreadAlert !== false) { unreadAlert = '•'; } @@ -73,7 +75,7 @@ Meteor.startup(function() { }); Tracker.autorun(function() { - const siteName = RocketChat.settings.get('Site_Name') || ''; + const siteName = settings.get('Site_Name') || ''; const unread = Session.get('unread'); fireGlobalEvent('unread-changed', unread); diff --git a/client/startup/userSetUtcOffset.js b/client/startup/userSetUtcOffset.js index a266acb0597..8a4db8c31a0 100644 --- a/client/startup/userSetUtcOffset.js +++ b/client/startup/userSetUtcOffset.js @@ -1,10 +1,11 @@ import { Meteor } from 'meteor/meteor'; import { Tracker } from 'meteor/tracker'; +import { Users } from 'meteor/rocketchat:models'; import moment from 'moment'; Meteor.startup(function() { Tracker.autorun(function() { - const user = RocketChat.models.Users.findOne({ _id: Meteor.userId() }, { fields: { statusConnection: 1, utcOffset: 1 } }); + const user = Users.findOne({ _id: Meteor.userId() }, { fields: { statusConnection: 1, utcOffset: 1 } }); if (user && user.statusConnection === 'online') { const utcOffset = moment().utcOffset() / 60; if (user.utcOffset !== utcOffset) { diff --git a/imports/message-read-receipt/client/main.js b/imports/message-read-receipt/client/main.js index 5203d1bb11a..af88a858a57 100644 --- a/imports/message-read-receipt/client/main.js +++ b/imports/message-read-receipt/client/main.js @@ -1,8 +1,9 @@ import { Template } from 'meteor/templating'; +import { settings } from 'meteor/rocketchat:settings'; Template.main.helpers({ readReceiptsEnabled() { - if (RocketChat.settings.get('Message_Read_Receipt_Store_Users')) { + if (settings.get('Message_Read_Receipt_Store_Users')) { return 'read-receipts-enabled'; } }, diff --git a/imports/message-read-receipt/client/message.js b/imports/message-read-receipt/client/message.js index 8c08a2b502d..f4048a1c14e 100644 --- a/imports/message-read-receipt/client/message.js +++ b/imports/message-read-receipt/client/message.js @@ -1,8 +1,9 @@ import { Template } from 'meteor/templating'; +import { settings } from 'meteor/rocketchat:settings'; Template.message.helpers({ readReceipt() { - if (!RocketChat.settings.get('Message_Read_Receipt_Enabled')) { + if (!settings.get('Message_Read_Receipt_Enabled')) { return; } diff --git a/imports/message-read-receipt/client/readReceipts.js b/imports/message-read-receipt/client/readReceipts.js index 7b350be120f..64ee2c4d555 100644 --- a/imports/message-read-receipt/client/readReceipts.js +++ b/imports/message-read-receipt/client/readReceipts.js @@ -1,6 +1,7 @@ import { Meteor } from 'meteor/meteor'; import { ReactiveVar } from 'meteor/reactive-var'; import { Template } from 'meteor/templating'; +import { settings } from 'meteor/rocketchat:settings'; import moment from 'moment'; import './readReceipts.css'; @@ -11,7 +12,7 @@ Template.readReceipts.helpers({ return Template.instance().readReceipts.get(); }, displayName() { - return (RocketChat.settings.get('UI_Use_Real_Name') && this.user.name) || this.user.username; + return (settings.get('UI_Use_Real_Name') && this.user.name) || this.user.username; }, time() { return moment(this.ts).format('L LTS'); diff --git a/imports/message-read-receipt/client/room.js b/imports/message-read-receipt/client/room.js index 78a75fa74aa..dbc277396f7 100644 --- a/imports/message-read-receipt/client/room.js +++ b/imports/message-read-receipt/client/room.js @@ -1,7 +1,8 @@ import { t } from 'meteor/rocketchat:utils'; -import { modal } from 'meteor/rocketchat:ui-utils'; +import { modal, MessageAction } from 'meteor/rocketchat:ui-utils'; +import { settings } from 'meteor/rocketchat:settings'; -RocketChat.MessageAction.addButton({ +MessageAction.addButton({ id: 'receipt-detail', icon: 'info-circled', label: 'Message_info', @@ -20,7 +21,7 @@ RocketChat.MessageAction.addButton({ }); }, condition() { - return RocketChat.settings.get('Message_Read_Receipt_Store_Users'); + return settings.get('Message_Read_Receipt_Store_Users'); }, order: 1, group: 'menu', diff --git a/imports/message-read-receipt/server/api/methods/getReadReceipts.js b/imports/message-read-receipt/server/api/methods/getReadReceipts.js index 4c8a1009696..bd4d8eb662f 100644 --- a/imports/message-read-receipt/server/api/methods/getReadReceipts.js +++ b/imports/message-read-receipt/server/api/methods/getReadReceipts.js @@ -1,5 +1,5 @@ import { Meteor } from 'meteor/meteor'; - +import { Messages } from 'meteor/rocketchat:models'; import { ReadReceipt } from '../../lib/ReadReceipt'; Meteor.methods({ @@ -12,7 +12,7 @@ Meteor.methods({ throw new Meteor.Error('error-invalid-message', 'The required \'messageId\' param is missing.', { method: 'getReadReceipts' }); } - const message = RocketChat.models.Messages.findOneById(messageId); + const message = Messages.findOneById(messageId); if (!message) { throw new Meteor.Error('error-invalid-message', 'Invalid message', { method: 'getReadReceipts' }); diff --git a/imports/message-read-receipt/server/dbIndexes.js b/imports/message-read-receipt/server/dbIndexes.js deleted file mode 100644 index 3d82fc7be45..00000000000 --- a/imports/message-read-receipt/server/dbIndexes.js +++ /dev/null @@ -1,5 +0,0 @@ -RocketChat.models.Messages.tryEnsureIndex({ - unread: 1, -}, { - sparse: true, -}); diff --git a/imports/message-read-receipt/server/hooks.js b/imports/message-read-receipt/server/hooks.js index 4039271580e..22666d6df06 100644 --- a/imports/message-read-receipt/server/hooks.js +++ b/imports/message-read-receipt/server/hooks.js @@ -1,6 +1,8 @@ +import { callbacks } from 'meteor/rocketchat:callbacks'; +import { Subscriptions } from 'meteor/rocketchat:models'; import { ReadReceipt } from './lib/ReadReceipt'; -RocketChat.callbacks.add('afterSaveMessage', (message, room) => { +callbacks.add('afterSaveMessage', (message, room) => { // skips this callback if the message was edited if (message.editedAt) { @@ -8,7 +10,7 @@ RocketChat.callbacks.add('afterSaveMessage', (message, room) => { } // set subscription as read right after message was sent - RocketChat.models.Subscriptions.setAsReadByRoomIdAndUserId(room._id, message.u._id); + Subscriptions.setAsReadByRoomIdAndUserId(room._id, message.u._id); // mark message as read as well ReadReceipt.markMessageAsReadBySender(message, room._id, message.u._id); diff --git a/imports/message-read-receipt/server/index.js b/imports/message-read-receipt/server/index.js index 2be56832fd4..b58297d84fc 100644 --- a/imports/message-read-receipt/server/index.js +++ b/imports/message-read-receipt/server/index.js @@ -1,4 +1,3 @@ -import './dbIndexes'; import './hooks'; import './settings'; diff --git a/imports/message-read-receipt/server/lib/ReadReceipt.js b/imports/message-read-receipt/server/lib/ReadReceipt.js index d1660f7474b..6ac07823c47 100644 --- a/imports/message-read-receipt/server/lib/ReadReceipt.js +++ b/imports/message-read-receipt/server/lib/ReadReceipt.js @@ -1,8 +1,9 @@ import { Meteor } from 'meteor/meteor'; import { Random } from 'meteor/random'; -import ModelReadReceipts from '../models/ReadReceipts'; +import { ReadReceipts, Subscriptions, Messages, Rooms, Users } from 'meteor/rocketchat:models'; +import { settings } from 'meteor/rocketchat:settings'; -const rawReadReceipts = ModelReadReceipts.model.rawCollection(); +const rawReadReceipts = ReadReceipts.model.rawCollection(); // debounced function by roomId, so multiple calls within 2 seconds to same roomId runs only once const list = {}; @@ -15,17 +16,17 @@ const debounceByRoomId = function(fn) { const updateMessages = debounceByRoomId(Meteor.bindEnvironment((roomId) => { // @TODO maybe store firstSubscription in room object so we don't need to call the above update method - const firstSubscription = RocketChat.models.Subscriptions.getMinimumLastSeenByRoomId(roomId); - RocketChat.models.Messages.setAsRead(roomId, firstSubscription.ls); + const firstSubscription = Subscriptions.getMinimumLastSeenByRoomId(roomId); + Messages.setAsRead(roomId, firstSubscription.ls); })); export const ReadReceipt = { markMessagesAsRead(roomId, userId, userLastSeen) { - if (!RocketChat.settings.get('Message_Read_Receipt_Enabled')) { + if (!settings.get('Message_Read_Receipt_Enabled')) { return; } - const room = RocketChat.models.Rooms.findOneById(roomId, { fields: { lm: 1 } }); + const room = Rooms.findOneById(roomId, { fields: { lm: 1 } }); // if users last seen is greadebounceByRoomIdter than room's last message, it means the user already have this room marked as read if (userLastSeen > room.lm) { @@ -33,28 +34,28 @@ export const ReadReceipt = { } if (userLastSeen) { - this.storeReadReceipts(RocketChat.models.Messages.findUnreadMessagesByRoomAndDate(roomId, userLastSeen), roomId, userId); + this.storeReadReceipts(Messages.findUnreadMessagesByRoomAndDate(roomId, userLastSeen), roomId, userId); } updateMessages(roomId); }, markMessageAsReadBySender(message, roomId, userId) { - if (!RocketChat.settings.get('Message_Read_Receipt_Enabled')) { + if (!settings.get('Message_Read_Receipt_Enabled')) { return; } // this will usually happens if the message sender is the only one on the room - const firstSubscription = RocketChat.models.Subscriptions.getMinimumLastSeenByRoomId(roomId); + const firstSubscription = Subscriptions.getMinimumLastSeenByRoomId(roomId); if (message.unread && message.ts < firstSubscription.ls) { - RocketChat.models.Messages.setAsReadById(message._id, firstSubscription.ls); + Messages.setAsReadById(message._id, firstSubscription.ls); } this.storeReadReceipts([{ _id: message._id }], roomId, userId); }, storeReadReceipts(messages, roomId, userId) { - if (RocketChat.settings.get('Message_Read_Receipt_Store_Users')) { + if (settings.get('Message_Read_Receipt_Store_Users')) { const ts = new Date(); const receipts = messages.map((message) => ({ _id: Random.id(), @@ -77,9 +78,9 @@ export const ReadReceipt = { }, getReceipts(message) { - return ModelReadReceipts.findByMessageId(message._id).map((receipt) => ({ + return ReadReceipts.findByMessageId(message._id).map((receipt) => ({ ...receipt, - user: RocketChat.models.Users.findOneById(receipt.userId, { fields: { username: 1, name: 1 } }), + user: Users.findOneById(receipt.userId, { fields: { username: 1, name: 1 } }), })); }, }; diff --git a/imports/message-read-receipt/server/settings.js b/imports/message-read-receipt/server/settings.js index 39d3bd33f2e..77486d75f53 100644 --- a/imports/message-read-receipt/server/settings.js +++ b/imports/message-read-receipt/server/settings.js @@ -1,10 +1,12 @@ -RocketChat.settings.add('Message_Read_Receipt_Enabled', false, { +import { settings } from 'meteor/rocketchat:settings'; + +settings.add('Message_Read_Receipt_Enabled', false, { group: 'Message', type: 'boolean', public: true, }); -RocketChat.settings.add('Message_Read_Receipt_Store_Users', false, { +settings.add('Message_Read_Receipt_Store_Users', false, { group: 'Message', type: 'boolean', public: true, diff --git a/imports/personal-access-tokens/client/personalAccessTokens.js b/imports/personal-access-tokens/client/personalAccessTokens.js index d06c67b4b35..d9a310935a5 100644 --- a/imports/personal-access-tokens/client/personalAccessTokens.js +++ b/imports/personal-access-tokens/client/personalAccessTokens.js @@ -5,6 +5,7 @@ import { Tracker } from 'meteor/tracker'; import { Template } from 'meteor/templating'; import { t } from 'meteor/rocketchat:utils'; import { modal, SideNav } from 'meteor/rocketchat:ui-utils'; +import { hasAllPermission } from 'meteor/rocketchat:authorization'; import toastr from 'toastr'; import moment from 'moment'; @@ -14,7 +15,7 @@ const PersonalAccessTokens = new Mongo.Collection('personal_access_tokens'); Template.accountTokens.helpers({ isAllowed() { - return RocketChat.authz.hasAllPermission(['create-personal-access-tokens']); + return hasAllPermission(['create-personal-access-tokens']); }, tokens() { return (PersonalAccessTokens.find({}).fetch()[0] && PersonalAccessTokens.find({}).fetch()[0].tokens) || []; diff --git a/imports/personal-access-tokens/server/api/methods/generateToken.js b/imports/personal-access-tokens/server/api/methods/generateToken.js index ff6ca2f764c..4c268225f31 100644 --- a/imports/personal-access-tokens/server/api/methods/generateToken.js +++ b/imports/personal-access-tokens/server/api/methods/generateToken.js @@ -1,18 +1,20 @@ import { Meteor } from 'meteor/meteor'; import { Random } from 'meteor/random'; import { Accounts } from 'meteor/accounts-base'; +import { hasPermission } from 'meteor/rocketchat:authorization'; +import { Users } from 'meteor/rocketchat:models'; Meteor.methods({ 'personalAccessTokens:generateToken'({ tokenName }) { if (!Meteor.userId()) { throw new Meteor.Error('not-authorized', 'Not Authorized', { method: 'personalAccessTokens:generateToken' }); } - if (!RocketChat.authz.hasPermission(Meteor.userId(), 'create-personal-access-tokens')) { + if (!hasPermission(Meteor.userId(), 'create-personal-access-tokens')) { throw new Meteor.Error('not-authorized', 'Not Authorized', { method: 'personalAccessTokens:generateToken' }); } const token = Random.secret(); - const tokenExist = RocketChat.models.Users.findPersonalAccessTokenByTokenNameAndUserId({ + const tokenExist = Users.findPersonalAccessTokenByTokenNameAndUserId({ userId: Meteor.userId(), tokenName, }); @@ -20,7 +22,7 @@ Meteor.methods({ throw new Meteor.Error('error-token-already-exists', 'A token with this name already exists', { method: 'personalAccessTokens:generateToken' }); } - RocketChat.models.Users.addPersonalAccessTokenToUser({ + Users.addPersonalAccessTokenToUser({ userId: Meteor.userId(), loginTokenObject: { hashedToken: Accounts._hashLoginToken(token), diff --git a/imports/personal-access-tokens/server/api/methods/regenerateToken.js b/imports/personal-access-tokens/server/api/methods/regenerateToken.js index 48f030c895f..49e283da758 100644 --- a/imports/personal-access-tokens/server/api/methods/regenerateToken.js +++ b/imports/personal-access-tokens/server/api/methods/regenerateToken.js @@ -1,15 +1,17 @@ import { Meteor } from 'meteor/meteor'; +import { hasPermission } from 'meteor/rocketchat:authorization'; +import { Users } from 'meteor/rocketchat:models'; Meteor.methods({ 'personalAccessTokens:regenerateToken'({ tokenName }) { if (!Meteor.userId()) { throw new Meteor.Error('not-authorized', 'Not Authorized', { method: 'personalAccessTokens:regenerateToken' }); } - if (!RocketChat.authz.hasPermission(Meteor.userId(), 'create-personal-access-tokens')) { + if (!hasPermission(Meteor.userId(), 'create-personal-access-tokens')) { throw new Meteor.Error('not-authorized', 'Not Authorized', { method: 'personalAccessTokens:regenerateToken' }); } - const tokenExist = RocketChat.models.Users.findPersonalAccessTokenByTokenNameAndUserId({ + const tokenExist = Users.findPersonalAccessTokenByTokenNameAndUserId({ userId: Meteor.userId(), tokenName, }); diff --git a/imports/personal-access-tokens/server/api/methods/removeToken.js b/imports/personal-access-tokens/server/api/methods/removeToken.js index 3e94195132d..f51cf7d7350 100644 --- a/imports/personal-access-tokens/server/api/methods/removeToken.js +++ b/imports/personal-access-tokens/server/api/methods/removeToken.js @@ -1,21 +1,23 @@ import { Meteor } from 'meteor/meteor'; +import { hasPermission } from 'meteor/rocketchat:authorization'; +import { Users } from 'meteor/rocketchat:models'; Meteor.methods({ 'personalAccessTokens:removeToken'({ tokenName }) { if (!Meteor.userId()) { throw new Meteor.Error('not-authorized', 'Not Authorized', { method: 'personalAccessTokens:removeToken' }); } - if (!RocketChat.authz.hasPermission(Meteor.userId(), 'create-personal-access-tokens')) { + if (!hasPermission(Meteor.userId(), 'create-personal-access-tokens')) { throw new Meteor.Error('not-authorized', 'Not Authorized', { method: 'personalAccessTokens:removeToken' }); } - const tokenExist = RocketChat.models.Users.findPersonalAccessTokenByTokenNameAndUserId({ + const tokenExist = Users.findPersonalAccessTokenByTokenNameAndUserId({ userId: Meteor.userId(), tokenName, }); if (!tokenExist) { throw new Meteor.Error('error-token-does-not-exists', 'Token does not exist', { method: 'personalAccessTokens:removeToken' }); } - RocketChat.models.Users.removePersonalAccessTokenOfUser({ + Users.removePersonalAccessTokenOfUser({ userId: Meteor.userId(), loginTokenObject: { type: 'personalAccessToken', diff --git a/imports/personal-access-tokens/server/index.js b/imports/personal-access-tokens/server/index.js index 861bc4add4a..d384c4a8a2e 100644 --- a/imports/personal-access-tokens/server/index.js +++ b/imports/personal-access-tokens/server/index.js @@ -1,5 +1,4 @@ import './api/methods'; -import './models'; import './publications'; diff --git a/imports/personal-access-tokens/server/models/Users.js b/imports/personal-access-tokens/server/models/Users.js deleted file mode 100644 index 6785ac815a4..00000000000 --- a/imports/personal-access-tokens/server/models/Users.js +++ /dev/null @@ -1,39 +0,0 @@ -RocketChat.models.Users.getLoginTokensByUserId = function(userId) { - const query = { - 'services.resume.loginTokens.type': { - $exists: true, - $eq: 'personalAccessToken', - }, - _id: userId, - }; - - return this.find(query, { fields: { 'services.resume.loginTokens': 1 } }); -}; - -RocketChat.models.Users.addPersonalAccessTokenToUser = function({ userId, loginTokenObject }) { - return this.update(userId, { - $push: { - 'services.resume.loginTokens': loginTokenObject, - }, - }); -}; - -RocketChat.models.Users.removePersonalAccessTokenOfUser = function({ userId, loginTokenObject }) { - return this.update(userId, { - $pull: { - 'services.resume.loginTokens': loginTokenObject, - }, - }); -}; - -RocketChat.models.Users.findPersonalAccessTokenByTokenNameAndUserId = function({ userId, tokenName }) { - const query = { - 'services.resume.loginTokens': { - $elemMatch: { name: tokenName, type: 'personalAccessToken' }, - }, - _id: userId, - }; - - return this.findOne(query); -}; - diff --git a/imports/personal-access-tokens/server/models/index.js b/imports/personal-access-tokens/server/models/index.js deleted file mode 100644 index 499666bb4d9..00000000000 --- a/imports/personal-access-tokens/server/models/index.js +++ /dev/null @@ -1 +0,0 @@ -import './Users'; diff --git a/imports/personal-access-tokens/server/publications/personalAccessTokens.js b/imports/personal-access-tokens/server/publications/personalAccessTokens.js index 3760a85f740..522bde494ee 100644 --- a/imports/personal-access-tokens/server/publications/personalAccessTokens.js +++ b/imports/personal-access-tokens/server/publications/personalAccessTokens.js @@ -1,10 +1,12 @@ import { Meteor } from 'meteor/meteor'; +import { hasPermission } from 'meteor/rocketchat:authorization'; +import { Users } from 'meteor/rocketchat:models'; Meteor.publish('personalAccessTokens', function() { if (!this.userId) { return this.ready(); } - if (!RocketChat.authz.hasPermission(this.userId, 'create-personal-access-tokens')) { + if (!hasPermission(this.userId, 'create-personal-access-tokens')) { return this.ready(); } const self = this; @@ -15,7 +17,7 @@ Meteor.publish('personalAccessTokens', function() { createdAt: loginToken.createdAt, lastTokenPart: loginToken.lastTokenPart, })); - const handle = RocketChat.models.Users.getLoginTokensByUserId(this.userId).observeChanges({ + const handle = Users.getLoginTokensByUserId(this.userId).observeChanges({ added(id, fields) { self.added('personal_access_tokens', id, { tokens: getFieldsToPublish(fields) }); }, diff --git a/packages/rocketchat-models/server/index.js b/packages/rocketchat-models/server/index.js index 0a4612dd71d..620fd6da9dd 100644 --- a/packages/rocketchat-models/server/index.js +++ b/packages/rocketchat-models/server/index.js @@ -30,6 +30,7 @@ import LivechatOfficeHour from './models/LivechatOfficeHour'; import LivechatPageVisited from './models/LivechatPageVisited'; import LivechatTrigger from './models/LivechatTrigger'; import LivechatVisitors from './models/LivechatVisitors'; +import ReadReceipts from './models/ReadReceipts'; export { Base, @@ -64,4 +65,5 @@ export { LivechatPageVisited, LivechatTrigger, LivechatVisitors, + ReadReceipts, }; diff --git a/packages/rocketchat-models/server/models/Messages.js b/packages/rocketchat-models/server/models/Messages.js index 7f0ffc39589..cff4ddd3536 100644 --- a/packages/rocketchat-models/server/models/Messages.js +++ b/packages/rocketchat-models/server/models/Messages.js @@ -23,6 +23,7 @@ export class Messages extends Base { this.tryEnsureIndex({ snippeted: 1 }, { sparse: 1 }); this.tryEnsureIndex({ location: '2dsphere' }); this.tryEnsureIndex({ slackBotId: 1, slackTs: 1 }, { sparse: 1 }); + this.tryEnsureIndex({ unread: 1 }, { sparse: true }); this.loadSettings(); } diff --git a/imports/message-read-receipt/server/models/ReadReceipts.js b/packages/rocketchat-models/server/models/ReadReceipts.js similarity index 62% rename from imports/message-read-receipt/server/models/ReadReceipts.js rename to packages/rocketchat-models/server/models/ReadReceipts.js index 5d62edb1fdd..717f4d91afc 100644 --- a/imports/message-read-receipt/server/models/ReadReceipts.js +++ b/packages/rocketchat-models/server/models/ReadReceipts.js @@ -1,4 +1,6 @@ -class ModelReadReceipts extends RocketChat.models._Base { +import { Base } from './_Base'; + +export class ReadReceipts extends Base { constructor(...args) { super(...args); @@ -16,4 +18,4 @@ class ModelReadReceipts extends RocketChat.models._Base { } } -export default new ModelReadReceipts('message_read_receipt'); +export default new ReadReceipts('message_read_receipt'); diff --git a/packages/rocketchat-models/server/models/Users.js b/packages/rocketchat-models/server/models/Users.js index b18ba6c52ed..1f9377daea2 100644 --- a/packages/rocketchat-models/server/models/Users.js +++ b/packages/rocketchat-models/server/models/Users.js @@ -27,6 +27,45 @@ export class Users extends Base { }); } + getLoginTokensByUserId(userId) { + const query = { + 'services.resume.loginTokens.type': { + $exists: true, + $eq: 'personalAccessToken', + }, + _id: userId, + }; + + return this.find(query, { fields: { 'services.resume.loginTokens': 1 } }); + } + + addPersonalAccessTokenToUser({ userId, loginTokenObject }) { + return this.update(userId, { + $push: { + 'services.resume.loginTokens': loginTokenObject, + }, + }); + } + + removePersonalAccessTokenOfUser({ userId, loginTokenObject }) { + return this.update(userId, { + $pull: { + 'services.resume.loginTokens': loginTokenObject, + }, + }); + } + + findPersonalAccessTokenByTokenNameAndUserId({ userId, tokenName }) { + const query = { + 'services.resume.loginTokens': { + $elemMatch: { name: tokenName, type: 'personalAccessToken' }, + }, + _id: userId, + }; + + return this.findOne(query); + } + setOperator(_id, operator) { const update = { $set: {