diff --git a/client/methods/deleteMessage.js b/client/methods/deleteMessage.js index d69dfd5be604..0db295059f76 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 5aa41618387e..2a6c7dc0c600 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 eddaa5e4e052..689923b5d7ec 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 bb406e8ab86a..c901b99b9c86 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 b03d115ffddb..792f0d56d498 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 84cbaf9af6a6..e2a582e55762 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 e9d3a606b607..a30891a14cba 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 8f1dfd711038..a125c9eae6c8 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 04cdd75cfbb1..277bcd28d9c8 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 d2f01ec88207..a6e693f2c1c0 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 e5602cd19313..311fd2dbcadd 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 b261ba9199b8..46b6a74c2e47 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 a266acb05978..8a4db8c31a0f 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 5203d1bb11a0..af88a858a572 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 8c08a2b502d5..f4048a1c14e9 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 7b350be120f0..64ee2c4d5552 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 78a75fa74aad..dbc277396f7d 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 4c8a10096960..bd4d8eb662ff 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 3d82fc7be455..000000000000 --- 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 4039271580e4..22666d6df064 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 2be56832fd46..b58297d84fc6 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 d1660f7474b7..6ac07823c477 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 39d3bd33f2e2..77486d75f534 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 d06c67b4b35e..d9a310935a5a 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 ff6ca2f764c6..4c268225f31a 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 48f030c895f8..49e283da7582 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 3e94195132d2..f51cf7d7350a 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 861bc4add4a6..d384c4a8a2e5 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 6785ac815a48..000000000000 --- 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 499666bb4d94..000000000000 --- 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 3760a85f7401..522bde494ee5 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 0a4612dd71d8..620fd6da9dd5 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 7f0ffc39589d..cff4ddd3536f 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 5d62edb1fdde..717f4d91afc4 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 b18ba6c52ed3..1f9377daea20 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: { diff --git a/server/configuration/accounts_meld.js b/server/configuration/accounts_meld.js index 777840e236fa..d9d14a5865f6 100644 --- a/server/configuration/accounts_meld.js +++ b/server/configuration/accounts_meld.js @@ -1,5 +1,6 @@ import _ from 'underscore'; import { Accounts } from 'meteor/accounts-base'; +import { Users } from 'meteor/rocketchat:models'; const orig_updateOrCreateUserFromExternalService = Accounts.updateOrCreateUserFromExternalService; @@ -31,7 +32,7 @@ Accounts.updateOrCreateUserFromExternalService = function(serviceName, serviceDa } if (serviceData.email) { - const user = RocketChat.models.Users.findOneByEmailAddress(serviceData.email); + const user = Users.findOneByEmailAddress(serviceData.email); if (user != null) { const findQuery = { address: serviceData.email, @@ -39,11 +40,11 @@ Accounts.updateOrCreateUserFromExternalService = function(serviceName, serviceDa }; if (!_.findWhere(user.emails, findQuery)) { - RocketChat.models.Users.resetPasswordAndSetRequirePasswordChange(user._id, true, 'This_email_has_already_been_used_and_has_not_been_verified__Please_change_your_password'); + Users.resetPasswordAndSetRequirePasswordChange(user._id, true, 'This_email_has_already_been_used_and_has_not_been_verified__Please_change_your_password'); } - RocketChat.models.Users.setServiceId(user._id, serviceName, serviceData.id); - RocketChat.models.Users.setEmailVerified(user._id, serviceData.email); + Users.setServiceId(user._id, serviceName, serviceData.id); + Users.setEmailVerified(user._id, serviceData.email); } } diff --git a/server/lib/accounts.js b/server/lib/accounts.js index 1530c90c3e0e..19463e3be893 100644 --- a/server/lib/accounts.js +++ b/server/lib/accounts.js @@ -5,22 +5,26 @@ import { TAPi18n } from 'meteor/tap:i18n'; import _ from 'underscore'; import s from 'underscore.string'; import * as Mailer from 'meteor/rocketchat:mailer'; +import { settings } from 'meteor/rocketchat:settings'; +import { callbacks } from 'meteor/rocketchat:callbacks'; +import { Roles, Users, Settings } from 'meteor/rocketchat:models'; +import { addUserRoles } from 'meteor/rocketchat:authorization'; const accountsConfig = { forbidClientAccountCreation: true, - loginExpirationInDays: RocketChat.settings.get('Accounts_LoginExpiration'), + loginExpirationInDays: settings.get('Accounts_LoginExpiration'), }; Accounts.config(accountsConfig); -Accounts.emailTemplates.siteName = RocketChat.settings.get('Site_Name'); +Accounts.emailTemplates.siteName = settings.get('Site_Name'); -Accounts.emailTemplates.from = `${ RocketChat.settings.get('Site_Name') } <${ RocketChat.settings.get('From_Email') }>`; +Accounts.emailTemplates.from = `${ settings.get('Site_Name') } <${ settings.get('From_Email') }>`; Accounts.emailTemplates.userToActivate = { subject() { const subject = TAPi18n.__('Accounts_Admin_Email_Approval_Needed_Subject_Default'); - const siteName = RocketChat.settings.get('Site_Name'); + const siteName = settings.get('Site_Name'); return `[${ siteName }] ${ subject }`; }, @@ -41,7 +45,7 @@ Accounts.emailTemplates.userActivated = { const activated = username ? 'Activated' : 'Approved'; const action = active ? activated : 'Deactivated'; const subject = `Accounts_Email_${ action }_Subject`; - const siteName = RocketChat.settings.get('Site_Name'); + const siteName = settings.get('Site_Name'); return `[${ siteName }] ${ TAPi18n.__(subject) }`; }, @@ -80,7 +84,7 @@ Accounts.urls.resetPassword = function(token) { Accounts.emailTemplates.resetPassword.html = Accounts.emailTemplates.resetPassword.text; Accounts.emailTemplates.enrollAccount.subject = function(user) { - const subject = RocketChat.settings.get('Accounts_Enrollment_Email_Subject'); + const subject = settings.get('Accounts_Enrollment_Email_Subject'); return Mailer.replace(subject, user); }; @@ -92,10 +96,10 @@ Accounts.emailTemplates.enrollAccount.html = function(user = {}/* , url*/) { }; Accounts.onCreateUser(function(options, user = {}) { - RocketChat.callbacks.run('beforeCreateUser', options, user); + callbacks.run('beforeCreateUser', options, user); user.status = 'offline'; - user.active = !RocketChat.settings.get('Accounts_ManuallyApproveNewUsers'); + user.active = !settings.get('Accounts_ManuallyApproveNewUsers'); if (!user.name) { if (options.profile) { @@ -129,7 +133,7 @@ Accounts.onCreateUser(function(options, user = {}) { if (!user.active) { const destinations = []; - RocketChat.models.Roles.findUsersInRole('admin').forEach((adminUser) => { + Roles.findUsersInRole('admin').forEach((adminUser) => { if (Array.isArray(adminUser.emails)) { adminUser.emails.forEach((email) => { destinations.push(`${ adminUser.name }<${ email.address }>`); @@ -139,7 +143,7 @@ Accounts.onCreateUser(function(options, user = {}) { const email = { to: destinations, - from: RocketChat.settings.get('From_Email'), + from: settings.get('From_Email'), subject: Accounts.emailTemplates.userToActivate.subject(), html: Accounts.emailTemplates.userToActivate.html(options), }; @@ -160,7 +164,7 @@ Accounts.insertUserDoc = _.wrap(Accounts.insertUserDoc, function(insertUserDoc, delete user.globalRoles; if (user.services && !user.services.password) { - const defaultAuthServiceRoles = String(RocketChat.settings.get('Accounts_Registration_AuthenticationServices_Default_Roles')).split(','); + const defaultAuthServiceRoles = String(settings.get('Accounts_Registration_AuthenticationServices_Default_Roles')).split(','); if (defaultAuthServiceRoles.length > 0) { roles = roles.concat(defaultAuthServiceRoles.map((s) => s.trim())); } @@ -185,13 +189,13 @@ Accounts.insertUserDoc = _.wrap(Accounts.insertUserDoc, function(insertUserDoc, if (user.type !== 'visitor') { Meteor.defer(function() { - return RocketChat.callbacks.run('afterCreateUser', user); + return callbacks.run('afterCreateUser', user); }); } } if (roles.length === 0) { - const hasAdmin = RocketChat.models.Users.findOne({ + const hasAdmin = Users.findOne({ roles: 'admin', type: 'user', }, { @@ -204,19 +208,19 @@ Accounts.insertUserDoc = _.wrap(Accounts.insertUserDoc, function(insertUserDoc, roles.push('user'); } else { roles.push('admin'); - if (RocketChat.settings.get('Show_Setup_Wizard') === 'pending') { - RocketChat.models.Settings.updateValueById('Show_Setup_Wizard', 'in_progress'); + if (settings.get('Show_Setup_Wizard') === 'pending') { + Settings.updateValueById('Show_Setup_Wizard', 'in_progress'); } } } - RocketChat.authz.addUserRoles(_id, roles); + addUserRoles(_id, roles); return _id; }); Accounts.validateLoginAttempt(function(login) { - login = RocketChat.callbacks.run('beforeValidateLogin', login); + login = callbacks.run('beforeValidateLogin', login); if (login.allowed !== true) { return login.allowed; @@ -238,18 +242,18 @@ Accounts.validateLoginAttempt(function(login) { }); } - if (login.user.roles.includes('admin') === false && login.type === 'password' && RocketChat.settings.get('Accounts_EmailVerification') === true) { + if (login.user.roles.includes('admin') === false && login.type === 'password' && settings.get('Accounts_EmailVerification') === true) { const validEmail = login.user.emails.filter((email) => email.verified === true); if (validEmail.length === 0) { throw new Meteor.Error('error-invalid-email', 'Invalid email __email__'); } } - login = RocketChat.callbacks.run('onValidateLogin', login); + login = callbacks.run('onValidateLogin', login); - RocketChat.models.Users.updateLastLoginById(login.user._id); + Users.updateLastLoginById(login.user._id); Meteor.defer(function() { - return RocketChat.callbacks.run('afterValidateLogin', login); + return callbacks.run('afterValidateLogin', login); }); return true; @@ -260,7 +264,7 @@ Accounts.validateNewUser(function(user) { return true; } - if (RocketChat.settings.get('Accounts_Registration_AuthenticationServices_Enabled') === false && RocketChat.settings.get('LDAP_Enable') === false && !(user.services && user.services.password)) { + if (settings.get('Accounts_Registration_AuthenticationServices_Enabled') === false && settings.get('LDAP_Enable') === false && !(user.services && user.services.password)) { throw new Meteor.Error('registration-disabled-authentication-services', 'User registration is disabled for authentication services'); } @@ -272,7 +276,7 @@ Accounts.validateNewUser(function(user) { return true; } - let domainWhiteList = RocketChat.settings.get('Accounts_AllowedDomainsList'); + let domainWhiteList = settings.get('Accounts_AllowedDomainsList'); if (_.isEmpty(s.trim(domainWhiteList))) { return true; } diff --git a/server/lib/cordova.js b/server/lib/cordova.js index 445c8327288f..1c3eef13189a 100644 --- a/server/lib/cordova.js +++ b/server/lib/cordova.js @@ -4,6 +4,8 @@ import { TAPi18n } from 'meteor/tap:i18n'; import { SystemLogger } from 'meteor/rocketchat:logger'; import { getWorkspaceAccessToken } from 'meteor/rocketchat:cloud'; import { Push } from 'meteor/rocketchat:push'; +import { hasRole } from 'meteor/rocketchat:authorization'; +import { settings } from 'meteor/rocketchat:settings'; Meteor.methods({ @@ -20,7 +22,7 @@ Meteor.methods({ }); } - if (!RocketChat.authz.hasRole(user._id, 'admin')) { + if (!hasRole(user._id, 'admin')) { throw new Meteor.Error('error-not-allowed', 'Not allowed', { method: 'push_test', }); @@ -92,7 +94,7 @@ function sendPush(service, token, options, tries = 0) { data.headers.Authorization = `Bearer ${ workspaceAccesstoken }`; } - return HTTP.post(`${ RocketChat.settings.get('Push_gateway') }/push/${ service }/send`, data, function(error, response) { + return HTTP.post(`${ settings.get('Push_gateway') }/push/${ service }/send`, data, function(error, response) { if (response && response.statusCode === 406) { console.log('removing push token', token); Push.appCollection.remove({ @@ -124,38 +126,38 @@ function sendPush(service, token, options, tries = 0) { } function configurePush() { - if (RocketChat.settings.get('Push_debug')) { + if (settings.get('Push_debug')) { Push.debug = true; console.log('Push: configuring...'); } - if (RocketChat.settings.get('Push_enable') === true) { + if (settings.get('Push_enable') === true) { Push.allow({ send(userId/* , notification*/) { - return RocketChat.authz.hasRole(userId, 'admin'); + return hasRole(userId, 'admin'); }, }); let apn; let gcm; - if (RocketChat.settings.get('Push_enable_gateway') === false) { + if (settings.get('Push_enable_gateway') === false) { gcm = { - apiKey: RocketChat.settings.get('Push_gcm_api_key'), - projectNumber: RocketChat.settings.get('Push_gcm_project_number'), + apiKey: settings.get('Push_gcm_api_key'), + projectNumber: settings.get('Push_gcm_project_number'), }; apn = { - passphrase: RocketChat.settings.get('Push_apn_passphrase'), - keyData: RocketChat.settings.get('Push_apn_key'), - certData: RocketChat.settings.get('Push_apn_cert'), + passphrase: settings.get('Push_apn_passphrase'), + keyData: settings.get('Push_apn_key'), + certData: settings.get('Push_apn_cert'), }; - if (RocketChat.settings.get('Push_production') !== true) { + if (settings.get('Push_production') !== true) { apn = { - passphrase: RocketChat.settings.get('Push_apn_dev_passphrase'), - keyData: RocketChat.settings.get('Push_apn_dev_key'), - certData: RocketChat.settings.get('Push_apn_dev_cert'), + passphrase: settings.get('Push_apn_dev_passphrase'), + keyData: settings.get('Push_apn_dev_key'), + certData: settings.get('Push_apn_dev_cert'), gateway: 'gateway.sandbox.push.apple.com', }; } @@ -172,12 +174,12 @@ function configurePush() { Push.Configure({ apn, gcm, - production: RocketChat.settings.get('Push_production'), + production: settings.get('Push_production'), sendInterval: 5000, sendBatchSize: 10, }); - if (RocketChat.settings.get('Push_enable_gateway') === true) { + if (settings.get('Push_enable_gateway') === true) { Push.serverSend = function(options = { badge: 0 }) { if (options.from !== String(options.from)) { throw new Error('Push.send: option "from" not a string'); @@ -188,7 +190,7 @@ function configurePush() { if (options.text !== String(options.text)) { throw new Error('Push.send: option "text" not a string'); } - if (RocketChat.settings.get('Push_debug')) { + if (settings.get('Push_debug')) { console.log(`Push: send message "${ options.title }" via query`, options.query); } @@ -207,7 +209,7 @@ function configurePush() { }; return Push.appCollection.find(query).forEach((app) => { - if (RocketChat.settings.get('Push_debug')) { + if (settings.get('Push_debug')) { console.log('Push: send to token', app.token); } diff --git a/server/lib/roomFiles.js b/server/lib/roomFiles.js index f1f6bbbc5a73..f3544649e110 100644 --- a/server/lib/roomFiles.js +++ b/server/lib/roomFiles.js @@ -1,4 +1,5 @@ import { Meteor } from 'meteor/meteor'; +import { Users, Uploads } from 'meteor/rocketchat:models'; export const roomFiles = (pub, { rid, searchText, limit = 50 }) => { if (!pub.userId) { @@ -9,14 +10,14 @@ export const roomFiles = (pub, { rid, searchText, limit = 50 }) => { return this.ready(); } - const cursorFileListHandle = RocketChat.models.Uploads.findNotHiddenFilesOfRoom(rid, searchText, limit).observeChanges({ + const cursorFileListHandle = Uploads.findNotHiddenFilesOfRoom(rid, searchText, limit).observeChanges({ added(_id, record) { - const { username, name } = record.userId ? RocketChat.models.Users.findOneById(record.userId) : {}; + const { username, name } = record.userId ? Users.findOneById(record.userId) : {}; return pub.added('room_files', _id, { ...record, user: { username, name } }); }, changed(_id, recordChanges) { if (!recordChanges.hasOwnProperty('user') && recordChanges.userId) { - recordChanges.user = RocketChat.models.Users.findOneById(recordChanges.userId); + recordChanges.user = Users.findOneById(recordChanges.userId); } return pub.changed('room_files', _id, recordChanges); }, diff --git a/server/methods/OEmbedCacheCleanup.js b/server/methods/OEmbedCacheCleanup.js index 0b36f39621b5..ff61d5253ea6 100644 --- a/server/methods/OEmbedCacheCleanup.js +++ b/server/methods/OEmbedCacheCleanup.js @@ -1,17 +1,20 @@ import { Meteor } from 'meteor/meteor'; +import { OEmbedCache } from 'meteor/rocketchat:models'; +import { settings } from 'meteor/rocketchat:settings'; +import { hasRole } from 'meteor/rocketchat:authorization'; Meteor.methods({ OEmbedCacheCleanup() { - if (Meteor.userId() && !RocketChat.authz.hasRole(Meteor.userId(), 'admin')) { + if (Meteor.userId() && !hasRole(Meteor.userId(), 'admin')) { throw new Meteor.Error('error-not-allowed', 'Not allowed', { method: 'OEmbedCacheCleanup', }); } const date = new Date(); - const expirationDays = RocketChat.settings.get('API_EmbedCacheExpirationDays'); + const expirationDays = settings.get('API_EmbedCacheExpirationDays'); date.setDate(date.getDate() - expirationDays); - RocketChat.models.OEmbedCache.removeAfterDate(date); + OEmbedCache.removeAfterDate(date); return { message: 'cache_cleared', }; diff --git a/server/methods/addAllUserToRoom.js b/server/methods/addAllUserToRoom.js index c696218ec16d..f33e37fa7ce9 100644 --- a/server/methods/addAllUserToRoom.js +++ b/server/methods/addAllUserToRoom.js @@ -1,5 +1,9 @@ import { Meteor } from 'meteor/meteor'; import { check } from 'meteor/check'; +import { hasRole } from 'meteor/rocketchat:authorization'; +import { Users, Rooms, Subscriptions, Messages } from 'meteor/rocketchat:models'; +import { settings } from 'meteor/rocketchat:settings'; +import { callbacks } from 'meteor/rocketchat:callbacks'; Meteor.methods({ addAllUserToRoom(rid, activeUsersOnly = false) { @@ -7,15 +11,15 @@ Meteor.methods({ check (rid, String); check (activeUsersOnly, Boolean); - if (RocketChat.authz.hasRole(this.userId, 'admin') === true) { - const userCount = RocketChat.models.Users.find().count(); - if (userCount > RocketChat.settings.get('API_User_Limit')) { + if (hasRole(this.userId, 'admin') === true) { + const userCount = Users.find().count(); + if (userCount > settings.get('API_User_Limit')) { throw new Meteor.Error('error-user-limit-exceeded', 'User Limit Exceeded', { method: 'addAllToRoom', }); } - const room = RocketChat.models.Rooms.findOneById(rid); + const room = Rooms.findOneById(rid); if (room == null) { throw new Meteor.Error('error-invalid-room', 'Invalid room', { method: 'addAllToRoom', @@ -27,15 +31,15 @@ Meteor.methods({ userFilter.active = true; } - const users = RocketChat.models.Users.find(userFilter).fetch(); + const users = Users.find(userFilter).fetch(); const now = new Date(); users.forEach(function(user) { - const subscription = RocketChat.models.Subscriptions.findOneByRoomIdAndUserId(rid, user._id); + const subscription = Subscriptions.findOneByRoomIdAndUserId(rid, user._id); if (subscription != null) { return; } - RocketChat.callbacks.run('beforeJoinRoom', user, room); - RocketChat.models.Subscriptions.createWithRoomAndUser(room, user, { + callbacks.run('beforeJoinRoom', user, room); + Subscriptions.createWithRoomAndUser(room, user, { ts: now, open: true, alert: true, @@ -43,11 +47,11 @@ Meteor.methods({ userMentions: 1, groupMentions: 0, }); - RocketChat.models.Messages.createUserJoinWithRoomIdAndUser(rid, user, { + Messages.createUserJoinWithRoomIdAndUser(rid, user, { ts: now, }); Meteor.defer(function() {}); - return RocketChat.callbacks.run('afterJoinRoom', user, room); + return callbacks.run('afterJoinRoom', user, room); }); return true; } else { diff --git a/server/methods/addRoomLeader.js b/server/methods/addRoomLeader.js index 1c0fd31d4d13..dd7734474a5b 100644 --- a/server/methods/addRoomLeader.js +++ b/server/methods/addRoomLeader.js @@ -1,5 +1,9 @@ import { Meteor } from 'meteor/meteor'; import { check } from 'meteor/check'; +import { hasPermission } from 'meteor/rocketchat:authorization'; +import { Users, Subscriptions, Messages } from 'meteor/rocketchat:models'; +import { settings } from 'meteor/rocketchat:settings'; +import { Notifications } from 'meteor/rocketchat:notifications'; Meteor.methods({ addRoomLeader(rid, userId) { @@ -12,13 +16,13 @@ Meteor.methods({ }); } - if (!RocketChat.authz.hasPermission(Meteor.userId(), 'set-leader', rid)) { + if (!hasPermission(Meteor.userId(), 'set-leader', rid)) { throw new Meteor.Error('error-not-allowed', 'Not allowed', { method: 'addRoomLeader', }); } - const user = RocketChat.models.Users.findOneById(userId); + const user = Users.findOneById(userId); if (!user || !user.username) { throw new Meteor.Error('error-invalid-user', 'Invalid user', { @@ -26,7 +30,7 @@ Meteor.methods({ }); } - const subscription = RocketChat.models.Subscriptions.findOneByRoomIdAndUserId(rid, user._id); + const subscription = Subscriptions.findOneByRoomIdAndUserId(rid, user._id); if (!subscription) { throw new Meteor.Error('error-user-not-in-room', 'User is not in this room', { @@ -40,11 +44,11 @@ Meteor.methods({ }); } - RocketChat.models.Subscriptions.addRoleById(subscription._id, 'leader'); + Subscriptions.addRoleById(subscription._id, 'leader'); - const fromUser = RocketChat.models.Users.findOneById(Meteor.userId()); + const fromUser = Users.findOneById(Meteor.userId()); - RocketChat.models.Messages.createSubscriptionRoleAddedWithRoomIdAndUser(rid, user, { + Messages.createSubscriptionRoleAddedWithRoomIdAndUser(rid, user, { u: { _id: fromUser._id, username: fromUser.username, @@ -52,8 +56,8 @@ Meteor.methods({ role: 'leader', }); - if (RocketChat.settings.get('UI_DisplayRoles')) { - RocketChat.Notifications.notifyLogged('roles-change', { + if (settings.get('UI_DisplayRoles')) { + Notifications.notifyLogged('roles-change', { type: 'added', _id: 'leader', u: { diff --git a/server/methods/addRoomModerator.js b/server/methods/addRoomModerator.js index eaf2f5a69bc5..6bc72580ba5e 100644 --- a/server/methods/addRoomModerator.js +++ b/server/methods/addRoomModerator.js @@ -1,5 +1,9 @@ import { Meteor } from 'meteor/meteor'; import { check } from 'meteor/check'; +import { hasPermission } from 'meteor/rocketchat:authorization'; +import { Users, Subscriptions, Messages } from 'meteor/rocketchat:models'; +import { settings } from 'meteor/rocketchat:settings'; +import { Notifications } from 'meteor/rocketchat:notifications'; Meteor.methods({ addRoomModerator(rid, userId) { @@ -12,13 +16,13 @@ Meteor.methods({ }); } - if (!RocketChat.authz.hasPermission(Meteor.userId(), 'set-moderator', rid)) { + if (!hasPermission(Meteor.userId(), 'set-moderator', rid)) { throw new Meteor.Error('error-not-allowed', 'Not allowed', { method: 'addRoomModerator', }); } - const user = RocketChat.models.Users.findOneById(userId); + const user = Users.findOneById(userId); if (!user || !user.username) { throw new Meteor.Error('error-invalid-user', 'Invalid user', { @@ -26,7 +30,7 @@ Meteor.methods({ }); } - const subscription = RocketChat.models.Subscriptions.findOneByRoomIdAndUserId(rid, user._id); + const subscription = Subscriptions.findOneByRoomIdAndUserId(rid, user._id); if (!subscription) { throw new Meteor.Error('error-user-not-in-room', 'User is not in this room', { @@ -40,11 +44,11 @@ Meteor.methods({ }); } - RocketChat.models.Subscriptions.addRoleById(subscription._id, 'moderator'); + Subscriptions.addRoleById(subscription._id, 'moderator'); - const fromUser = RocketChat.models.Users.findOneById(Meteor.userId()); + const fromUser = Users.findOneById(Meteor.userId()); - RocketChat.models.Messages.createSubscriptionRoleAddedWithRoomIdAndUser(rid, user, { + Messages.createSubscriptionRoleAddedWithRoomIdAndUser(rid, user, { u: { _id: fromUser._id, username: fromUser.username, @@ -52,8 +56,8 @@ Meteor.methods({ role: 'moderator', }); - if (RocketChat.settings.get('UI_DisplayRoles')) { - RocketChat.Notifications.notifyLogged('roles-change', { + if (settings.get('UI_DisplayRoles')) { + Notifications.notifyLogged('roles-change', { type: 'added', _id: 'moderator', u: { diff --git a/server/methods/addRoomOwner.js b/server/methods/addRoomOwner.js index a1507147488f..fa0acf3508d4 100644 --- a/server/methods/addRoomOwner.js +++ b/server/methods/addRoomOwner.js @@ -1,5 +1,9 @@ import { Meteor } from 'meteor/meteor'; import { check } from 'meteor/check'; +import { hasPermission } from 'meteor/rocketchat:authorization'; +import { Users, Subscriptions, Messages } from 'meteor/rocketchat:models'; +import { settings } from 'meteor/rocketchat:settings'; +import { Notifications } from 'meteor/rocketchat:notifications'; Meteor.methods({ addRoomOwner(rid, userId) { @@ -12,13 +16,13 @@ Meteor.methods({ }); } - if (!RocketChat.authz.hasPermission(Meteor.userId(), 'set-owner', rid)) { + if (!hasPermission(Meteor.userId(), 'set-owner', rid)) { throw new Meteor.Error('error-not-allowed', 'Not allowed', { method: 'addRoomOwner', }); } - const user = RocketChat.models.Users.findOneById(userId); + const user = Users.findOneById(userId); if (!user || !user.username) { throw new Meteor.Error('error-invalid-user', 'Invalid user', { @@ -26,7 +30,7 @@ Meteor.methods({ }); } - const subscription = RocketChat.models.Subscriptions.findOneByRoomIdAndUserId(rid, user._id); + const subscription = Subscriptions.findOneByRoomIdAndUserId(rid, user._id); if (!subscription) { throw new Meteor.Error('error-user-not-in-room', 'User is not in this room', { @@ -40,11 +44,11 @@ Meteor.methods({ }); } - RocketChat.models.Subscriptions.addRoleById(subscription._id, 'owner'); + Subscriptions.addRoleById(subscription._id, 'owner'); - const fromUser = RocketChat.models.Users.findOneById(Meteor.userId()); + const fromUser = Users.findOneById(Meteor.userId()); - RocketChat.models.Messages.createSubscriptionRoleAddedWithRoomIdAndUser(rid, user, { + Messages.createSubscriptionRoleAddedWithRoomIdAndUser(rid, user, { u: { _id: fromUser._id, username: fromUser.username, @@ -52,8 +56,8 @@ Meteor.methods({ role: 'owner', }); - if (RocketChat.settings.get('UI_DisplayRoles')) { - RocketChat.Notifications.notifyLogged('roles-change', { + if (settings.get('UI_DisplayRoles')) { + Notifications.notifyLogged('roles-change', { type: 'added', _id: 'owner', u: { diff --git a/server/methods/afterVerifyEmail.js b/server/methods/afterVerifyEmail.js index 8419f065c683..e0504ef65691 100644 --- a/server/methods/afterVerifyEmail.js +++ b/server/methods/afterVerifyEmail.js @@ -1,4 +1,5 @@ import { Meteor } from 'meteor/meteor'; +import { Users, Roles } from 'meteor/rocketchat:models'; import _ from 'underscore'; Meteor.methods({ @@ -11,13 +12,13 @@ Meteor.methods({ }); } - const user = RocketChat.models.Users.findOneById(userId); + const user = Users.findOneById(userId); const verifiedEmail = _.find(user.emails, (email) => email.verified); if (verifiedEmail) { - RocketChat.models.Roles.addUserRoles(user._id, 'user'); - RocketChat.models.Roles.removeUserRoles(user._id, 'anonymous'); + Roles.addUserRoles(user._id, 'user'); + Roles.removeUserRoles(user._id, 'anonymous'); } }, }); diff --git a/server/methods/browseChannels.js b/server/methods/browseChannels.js index f5af3264aaee..a01156897974 100644 --- a/server/methods/browseChannels.js +++ b/server/methods/browseChannels.js @@ -1,5 +1,7 @@ import { Meteor } from 'meteor/meteor'; import { DDPRateLimiter } from 'meteor/ddp-rate-limiter'; +import { hasPermission } from 'meteor/rocketchat:authorization'; +import { Rooms, Users } from 'meteor/rocketchat:models'; import s from 'underscore.string'; const sortChannels = function(field, direction) { @@ -57,11 +59,11 @@ Meteor.methods({ if (type === 'channels') { const sort = sortChannels(sortBy, sortDirection); - if (!RocketChat.authz.hasPermission(user._id, 'view-c-room')) { + if (!hasPermission(user._id, 'view-c-room')) { return; } return { - results: RocketChat.models.Rooms.findByNameAndType(regex, 'c', { + results: Rooms.findByNameAndType(regex, 'c', { ...options, sort, fields: { @@ -74,17 +76,17 @@ Meteor.methods({ usersCount: 1, }, }).fetch(), - total: RocketChat.models.Rooms.findByNameAndType(regex, 'c').count(), + total: Rooms.findByNameAndType(regex, 'c').count(), }; } // type === users - if (!RocketChat.authz.hasPermission(user._id, 'view-outside-room') || !RocketChat.authz.hasPermission(user._id, 'view-d-room')) { + if (!hasPermission(user._id, 'view-outside-room') || !hasPermission(user._id, 'view-d-room')) { return; } const sort = sortUsers(sortBy, sortDirection); return { - results: RocketChat.models.Users.findByActiveUsersExcept(text, [user.username], { + results: Users.findByActiveUsersExcept(text, [user.username], { ...options, sort, fields: { @@ -94,7 +96,7 @@ Meteor.methods({ emails: 1, }, }).fetch(), - total: RocketChat.models.Users.findByActiveUsersExcept(text, [user.username]).count(), + total: Users.findByActiveUsersExcept(text, [user.username]).count(), }; }, }); diff --git a/server/methods/canAccessRoom.js b/server/methods/canAccessRoom.js index 2f6f1e6a6130..f011896dd953 100644 --- a/server/methods/canAccessRoom.js +++ b/server/methods/canAccessRoom.js @@ -1,5 +1,8 @@ import { Meteor } from 'meteor/meteor'; import { Match, check } from 'meteor/check'; +import { Users, Rooms } from 'meteor/rocketchat:models'; +import { canAccessRoom } from 'meteor/rocketchat:authorization'; +import { settings } from 'meteor/rocketchat:settings'; Meteor.methods({ canAccessRoom(rid, userId, extraData) { @@ -9,7 +12,7 @@ Meteor.methods({ let user; if (userId) { - user = RocketChat.models.Users.findOneById(userId, { + user = Users.findOneById(userId, { fields: { username: 1, }, @@ -28,16 +31,16 @@ Meteor.methods({ }); } - const room = RocketChat.models.Rooms.findOneById(rid); + const room = Rooms.findOneById(rid); if (room) { - if (RocketChat.authz.canAccessRoom.call(this, room, user, extraData)) { + if (canAccessRoom.call(this, room, user, extraData)) { if (user) { room.username = user.username; } return room; } - if (!userId && RocketChat.settings.get('Accounts_AllowAnonymousRead') === false) { + if (!userId && settings.get('Accounts_AllowAnonymousRead') === false) { throw new Meteor.Error('error-invalid-user', 'Invalid user', { method: 'canAccessRoom', }); diff --git a/server/methods/channelsList.js b/server/methods/channelsList.js index 4e4c6dab90b1..70e6f0a9fe78 100644 --- a/server/methods/channelsList.js +++ b/server/methods/channelsList.js @@ -1,5 +1,9 @@ import { Meteor } from 'meteor/meteor'; import { Match, check } from 'meteor/check'; +import { hasPermission } from 'meteor/rocketchat:authorization'; +import { Rooms, Subscriptions, Users } from 'meteor/rocketchat:models'; +import { getUserPreference } from 'meteor/rocketchat:utils'; +import { settings } from 'meteor/rocketchat:settings'; import _ from 'underscore'; import s from 'underscore.string'; @@ -51,39 +55,39 @@ Meteor.methods({ const userId = Meteor.userId(); if (channelType !== 'private') { - if (RocketChat.authz.hasPermission(userId, 'view-c-room')) { + if (hasPermission(userId, 'view-c-room')) { if (filter) { - channels = channels.concat(RocketChat.models.Rooms.findByType('c', options).fetch()); + channels = channels.concat(Rooms.findByType('c', options).fetch()); } else { - channels = channels.concat(RocketChat.models.Rooms.findByTypeAndNameContaining('c', filter, options).fetch()); + channels = channels.concat(Rooms.findByTypeAndNameContaining('c', filter, options).fetch()); } - } else if (RocketChat.authz.hasPermission(userId, 'view-joined-room')) { - const roomIds = RocketChat.models.Subscriptions.findByTypeAndUserId('c', userId, { fields: { rid: 1 } }).fetch().map((s) => s.rid); + } else if (hasPermission(userId, 'view-joined-room')) { + const roomIds = Subscriptions.findByTypeAndUserId('c', userId, { fields: { rid: 1 } }).fetch().map((s) => s.rid); if (filter) { - channels = channels.concat(RocketChat.models.Rooms.findByTypeInIds('c', roomIds, options).fetch()); + channels = channels.concat(Rooms.findByTypeInIds('c', roomIds, options).fetch()); } else { - channels = channels.concat(RocketChat.models.Rooms.findByTypeInIdsAndNameContaining('c', roomIds, filter, options).fetch()); + channels = channels.concat(Rooms.findByTypeInIdsAndNameContaining('c', roomIds, filter, options).fetch()); } } } - if (channelType !== 'public' && RocketChat.authz.hasPermission(userId, 'view-p-room')) { - const user = RocketChat.models.Users.findOne(userId, { + if (channelType !== 'public' && hasPermission(userId, 'view-p-room')) { + const user = Users.findOne(userId, { fields: { username: 1, 'settings.preferences.sidebarGroupByType': 1, }, }); - const userPref = RocketChat.getUserPreference(user, 'sidebarGroupByType'); + const userPref = getUserPreference(user, 'sidebarGroupByType'); // needs to negate globalPref because userPref represents its opposite - const groupByType = userPref !== undefined ? userPref : RocketChat.settings.get('UI_Group_Channels_By_Type'); + const groupByType = userPref !== undefined ? userPref : settings.get('UI_Group_Channels_By_Type'); if (!groupByType) { - const roomIds = RocketChat.models.Subscriptions.findByTypeAndUserId('p', userId, { fields: { rid: 1 } }).fetch().map((s) => s.rid); + const roomIds = Subscriptions.findByTypeAndUserId('p', userId, { fields: { rid: 1 } }).fetch().map((s) => s.rid); if (filter) { - channels = channels.concat(RocketChat.models.Rooms.findByTypeInIds('p', roomIds, options).fetch()); + channels = channels.concat(Rooms.findByTypeInIds('p', roomIds, options).fetch()); } else { - channels = channels.concat(RocketChat.models.Rooms.findByTypeInIdsAndNameContaining('p', roomIds, filter, options).fetch()); + channels = channels.concat(Rooms.findByTypeInIdsAndNameContaining('p', roomIds, filter, options).fetch()); } } } diff --git a/server/methods/createDirectMessage.js b/server/methods/createDirectMessage.js index 1fb380ad8368..b25524bd1265 100644 --- a/server/methods/createDirectMessage.js +++ b/server/methods/createDirectMessage.js @@ -1,5 +1,10 @@ import { Meteor } from 'meteor/meteor'; import { check } from 'meteor/check'; +import { settings } from 'meteor/rocketchat:settings'; +import { hasPermission } from 'meteor/rocketchat:authorization'; +import { Users, Rooms, Subscriptions } from 'meteor/rocketchat:models'; +import { getDefaultSubscriptionPref } from 'meteor/rocketchat:utils'; +import { RateLimiter } from 'meteor/rocketchat:lib'; Meteor.methods({ createDirectMessage(username) { @@ -19,19 +24,19 @@ Meteor.methods({ }); } - if (RocketChat.settings.get('Message_AllowDirectMessagesToYourself') === false && me.username === username) { + if (settings.get('Message_AllowDirectMessagesToYourself') === false && me.username === username) { throw new Meteor.Error('error-invalid-user', 'Invalid user', { method: 'createDirectMessage', }); } - if (!RocketChat.authz.hasPermission(Meteor.userId(), 'create-d')) { + if (!hasPermission(Meteor.userId(), 'create-d')) { throw new Meteor.Error('error-not-allowed', 'Not allowed', { method: 'createDirectMessage', }); } - const to = RocketChat.models.Users.findOneByUsername(username); + const to = Users.findOneByUsername(username); if (!to) { throw new Meteor.Error('error-invalid-user', 'Invalid user', { @@ -39,7 +44,7 @@ Meteor.methods({ }); } - if (!RocketChat.authz.hasPermission(to._id, 'view-d-room')) { + if (!hasPermission(to._id, 'view-d-room')) { throw new Meteor.Error('error-not-allowed', 'Target user not allowed to receive messages', { method: 'createDirectMessage', }); @@ -50,7 +55,7 @@ Meteor.methods({ const now = new Date(); // Make sure we have a room - RocketChat.models.Rooms.upsert({ + Rooms.upsert({ _id: rid, }, { $set: { @@ -64,7 +69,7 @@ Meteor.methods({ }, }); - const myNotificationPref = RocketChat.getDefaultSubscriptionPref(me); + const myNotificationPref = getDefaultSubscriptionPref(me); // Make user I have a subcription to this room const upsertSubscription = { @@ -94,14 +99,14 @@ Meteor.methods({ upsertSubscription.$set.archived = true; } - RocketChat.models.Subscriptions.upsert({ + Subscriptions.upsert({ rid, $and: [{ 'u._id': me._id }], // work around to solve problems with upsert and dot }, upsertSubscription); - const toNotificationPref = RocketChat.getDefaultSubscriptionPref(to); + const toNotificationPref = getDefaultSubscriptionPref(to); - RocketChat.models.Subscriptions.upsert({ + Subscriptions.upsert({ rid, $and: [{ 'u._id': to._id }], // work around to solve problems with upsert and dot }, { @@ -130,8 +135,8 @@ Meteor.methods({ }, }); -RocketChat.RateLimiter.limitMethod('createDirectMessage', 10, 60000, { +RateLimiter.limitMethod('createDirectMessage', 10, 60000, { userId(userId) { - return !RocketChat.authz.hasPermission(userId, 'send-many-messages'); + return !hasPermission(userId, 'send-many-messages'); }, }); diff --git a/server/methods/deleteFileMessage.js b/server/methods/deleteFileMessage.js index 6f033a295117..7c96d6ff9f60 100644 --- a/server/methods/deleteFileMessage.js +++ b/server/methods/deleteFileMessage.js @@ -1,12 +1,13 @@ import { Meteor } from 'meteor/meteor'; import { check } from 'meteor/check'; import { FileUpload } from 'meteor/rocketchat:file-upload'; +import { Messages } from 'meteor/rocketchat:models'; Meteor.methods({ deleteFileMessage(fileID) { check(fileID, String); - const msg = RocketChat.models.Messages.getMessageByFileId(fileID); + const msg = Messages.getMessageByFileId(fileID); if (msg) { return Meteor.call('deleteMessage', msg); diff --git a/server/methods/deleteUser.js b/server/methods/deleteUser.js index 5067c5b9ab14..b4dabda7577a 100644 --- a/server/methods/deleteUser.js +++ b/server/methods/deleteUser.js @@ -1,5 +1,8 @@ import { Meteor } from 'meteor/meteor'; import { check } from 'meteor/check'; +import { Users } from 'meteor/rocketchat:models'; +import { hasPermission } from 'meteor/rocketchat:authorization'; +import { deleteUser } from 'meteor/rocketchat:lib'; Meteor.methods({ deleteUser(userId) { @@ -11,13 +14,13 @@ Meteor.methods({ }); } - if (RocketChat.authz.hasPermission(Meteor.userId(), 'delete-user') !== true) { + if (hasPermission(Meteor.userId(), 'delete-user') !== true) { throw new Meteor.Error('error-not-allowed', 'Not allowed', { method: 'deleteUser', }); } - const user = RocketChat.models.Users.findOneById(userId); + const user = Users.findOneById(userId); if (!user) { throw new Meteor.Error('error-invalid-user', 'Invalid user to delete', { method: 'deleteUser', @@ -35,7 +38,7 @@ Meteor.methods({ }); } - RocketChat.deleteUser(userId); + deleteUser(userId); return true; }, diff --git a/server/methods/eraseRoom.js b/server/methods/eraseRoom.js index 578bec5982f7..1eee5eb8c1d5 100644 --- a/server/methods/eraseRoom.js +++ b/server/methods/eraseRoom.js @@ -1,7 +1,8 @@ import { Meteor } from 'meteor/meteor'; import { check } from 'meteor/check'; -import { RocketChat } from 'meteor/rocketchat:lib'; +import { roomTypes } from 'meteor/rocketchat:utils'; import { hasPermission } from 'meteor/rocketchat:authorization'; +import { Rooms, Messages, Subscriptions } from 'meteor/rocketchat:models'; Meteor.methods({ eraseRoom(rid) { @@ -13,7 +14,7 @@ Meteor.methods({ }); } - const room = RocketChat.models.Rooms.findOneById(rid); + const room = Rooms.findOneById(rid); if (!room) { throw new Meteor.Error('error-invalid-room', 'Invalid room', { @@ -28,16 +29,16 @@ Meteor.methods({ } } - if (!RocketChat.roomTypes.roomTypes[room.t].canBeDeleted(hasPermission, room)) { + if (!roomTypes.roomTypes[room.t].canBeDeleted(hasPermission, room)) { throw new Meteor.Error('error-not-allowed', 'Not allowed', { method: 'eraseRoom', }); } - RocketChat.models.Messages.removeFilesByRoomId(rid); - RocketChat.models.Messages.removeByRoomId(rid); - RocketChat.models.Subscriptions.removeByRoomId(rid); - const result = RocketChat.models.Rooms.removeById(rid); + Messages.removeFilesByRoomId(rid); + Messages.removeByRoomId(rid); + Subscriptions.removeByRoomId(rid); + const result = Rooms.removeById(rid); if (Apps && Apps.isLoaded()) { Apps.getBridges().getListenerBridge().roomEvent('IPostRoomDeleted', room); diff --git a/server/methods/getAvatarSuggestion.js b/server/methods/getAvatarSuggestion.js index 7b22428b96df..af70c1857861 100644 --- a/server/methods/getAvatarSuggestion.js +++ b/server/methods/getAvatarSuggestion.js @@ -2,48 +2,49 @@ import { Meteor } from 'meteor/meteor'; import { check } from 'meteor/check'; import { HTTP } from 'meteor/http'; import { Gravatar } from 'meteor/jparker:gravatar'; +import { settings } from 'meteor/rocketchat:settings'; function getAvatarSuggestionForUser(user) { check(user, Object); const avatars = []; - if (user.services.facebook && user.services.facebook.id && RocketChat.settings.get('Accounts_OAuth_Facebook')) { + if (user.services.facebook && user.services.facebook.id && settings.get('Accounts_OAuth_Facebook')) { avatars.push({ service: 'facebook', url: `https://graph.facebook.com/${ user.services.facebook.id }/picture?type=large`, }); } - if (user.services.google && user.services.google.picture && user.services.google.picture !== 'https://lh3.googleusercontent.com/-XdUIqdMkCWA/AAAAAAAAAAI/AAAAAAAAAAA/4252rscbv5M/photo.jpg' && RocketChat.settings.get('Accounts_OAuth_Google')) { + if (user.services.google && user.services.google.picture && user.services.google.picture !== 'https://lh3.googleusercontent.com/-XdUIqdMkCWA/AAAAAAAAAAI/AAAAAAAAAAA/4252rscbv5M/photo.jpg' && settings.get('Accounts_OAuth_Google')) { avatars.push({ service: 'google', url: user.services.google.picture, }); } - if (user.services.github && user.services.github.username && RocketChat.settings.get('Accounts_OAuth_Github')) { + if (user.services.github && user.services.github.username && settings.get('Accounts_OAuth_Github')) { avatars.push({ service: 'github', url: `https://avatars.githubusercontent.com/${ user.services.github.username }?s=200`, }); } - if (user.services.linkedin && user.services.linkedin.pictureUrl && RocketChat.settings.get('Accounts_OAuth_Linkedin')) { + if (user.services.linkedin && user.services.linkedin.pictureUrl && settings.get('Accounts_OAuth_Linkedin')) { avatars.push({ service: 'linkedin', url: user.services.linkedin.pictureUrl, }); } - if (user.services.twitter && user.services.twitter.profile_image_url_https && RocketChat.settings.get('Accounts_OAuth_Twitter')) { + if (user.services.twitter && user.services.twitter.profile_image_url_https && settings.get('Accounts_OAuth_Twitter')) { avatars.push({ service: 'twitter', url: user.services.twitter.profile_image_url_https.replace(/_normal|_bigger/, ''), }); } - if (user.services.gitlab && user.services.gitlab.avatar_url && RocketChat.settings.get('Accounts_OAuth_Gitlab')) { + if (user.services.gitlab && user.services.gitlab.avatar_url && settings.get('Accounts_OAuth_Gitlab')) { avatars.push({ service: 'gitlab', url: user.services.gitlab.avatar_url, @@ -57,7 +58,7 @@ function getAvatarSuggestionForUser(user) { }); } - if (user.services.blockstack && user.services.blockstack.image && RocketChat.settings.get('Blockstack_Enable')) { + if (user.services.blockstack && user.services.blockstack.image && settings.get('Blockstack_Enable')) { avatars.push({ service: 'blockstack', url: user.services.blockstack.image, diff --git a/server/methods/getRoomIdByNameOrId.js b/server/methods/getRoomIdByNameOrId.js index 786fbed4a05e..5ea03ffecaa1 100644 --- a/server/methods/getRoomIdByNameOrId.js +++ b/server/methods/getRoomIdByNameOrId.js @@ -1,6 +1,8 @@ // DEPRECATE import { Meteor } from 'meteor/meteor'; import { check } from 'meteor/check'; +import { Rooms } from 'meteor/rocketchat:models'; +import { canAccessRoom } from 'meteor/rocketchat:authorization'; Meteor.methods({ getRoomIdByNameOrId(rid) { @@ -12,7 +14,7 @@ Meteor.methods({ }); } - const room = RocketChat.models.Rooms.findOneById(rid) || RocketChat.models.Rooms.findOneByName(rid); + const room = Rooms.findOneById(rid) || Rooms.findOneByName(rid); if (room == null) { throw new Meteor.Error('error-not-allowed', 'Not allowed', { @@ -20,7 +22,7 @@ Meteor.methods({ }); } - if (!RocketChat.authz.canAccessRoom(room, Meteor.user())) { + if (!canAccessRoom(room, Meteor.user())) { throw new Meteor.Error('error-not-allowed', 'Not allowed', { method: 'getRoomIdByNameOrId', }); diff --git a/server/methods/getRoomNameById.js b/server/methods/getRoomNameById.js index 389e4c52a5d4..545805a915f8 100644 --- a/server/methods/getRoomNameById.js +++ b/server/methods/getRoomNameById.js @@ -1,5 +1,7 @@ import { Meteor } from 'meteor/meteor'; import { check } from 'meteor/check'; +import { Rooms, Subscriptions } from 'meteor/rocketchat:models'; +import { hasPermission } from 'meteor/rocketchat:authorization'; Meteor.methods({ getRoomNameById(rid) { @@ -11,7 +13,7 @@ Meteor.methods({ }); } - const room = RocketChat.models.Rooms.findOneById(rid); + const room = Rooms.findOneById(rid); if (room == null) { throw new Meteor.Error('error-not-allowed', 'Not allowed', { @@ -19,12 +21,12 @@ Meteor.methods({ }); } - const subscription = RocketChat.models.Subscriptions.findOneByRoomIdAndUserId(rid, userId, { fields: { _id: 1 } }); + const subscription = Subscriptions.findOneByRoomIdAndUserId(rid, userId, { fields: { _id: 1 } }); if (subscription) { return room.name; } - if (room.t !== 'c' || RocketChat.authz.hasPermission(userId, 'view-c-room') !== true) { + if (room.t !== 'c' || hasPermission(userId, 'view-c-room') !== true) { throw new Meteor.Error('error-not-allowed', 'Not allowed', { method: 'getRoomNameById', }); diff --git a/server/methods/getTotalChannels.js b/server/methods/getTotalChannels.js index bd362a67b7e6..d89a202c25c7 100644 --- a/server/methods/getTotalChannels.js +++ b/server/methods/getTotalChannels.js @@ -1,4 +1,5 @@ import { Meteor } from 'meteor/meteor'; +import { Rooms } from 'meteor/rocketchat:models'; Meteor.methods({ getTotalChannels() { @@ -11,6 +12,6 @@ Meteor.methods({ const query = { t: 'c', }; - return RocketChat.models.Rooms.find(query).count(); + return Rooms.find(query).count(); }, }); diff --git a/server/methods/getUsersOfRoom.js b/server/methods/getUsersOfRoom.js index d6bced8f9bc2..169c0bd88809 100644 --- a/server/methods/getUsersOfRoom.js +++ b/server/methods/getUsersOfRoom.js @@ -1,4 +1,6 @@ import { Meteor } from 'meteor/meteor'; +import { Subscriptions } from 'meteor/rocketchat:models'; +import { hasPermission } from 'meteor/rocketchat:authorization'; Meteor.methods({ async getUsersOfRoom(rid, showAll) { @@ -12,15 +14,15 @@ Meteor.methods({ throw new Meteor.Error('error-invalid-room', 'Invalid room', { method: 'getUsersOfRoom' }); } - if (room.broadcast && !RocketChat.authz.hasPermission(userId, 'view-broadcast-member-list', rid)) { + if (room.broadcast && !hasPermission(userId, 'view-broadcast-member-list', rid)) { throw new Meteor.Error('error-not-allowed', 'Not allowed', { method: 'getUsersOfRoom' }); } - const subscriptions = RocketChat.models.Subscriptions.findByRoomIdWhenUsernameExists(rid); + const subscriptions = Subscriptions.findByRoomIdWhenUsernameExists(rid); return { total: subscriptions.count(), - records: await RocketChat.models.Subscriptions.model.rawCollection().aggregate([ + records: await Subscriptions.model.rawCollection().aggregate([ { $match: { rid } }, { $lookup: diff --git a/server/methods/hideRoom.js b/server/methods/hideRoom.js index baa285ad3adf..3628f871ce18 100644 --- a/server/methods/hideRoom.js +++ b/server/methods/hideRoom.js @@ -1,5 +1,6 @@ import { Meteor } from 'meteor/meteor'; import { check } from 'meteor/check'; +import { Subscriptions } from 'meteor/rocketchat:models'; Meteor.methods({ hideRoom(rid) { @@ -11,6 +12,6 @@ Meteor.methods({ }); } - return RocketChat.models.Subscriptions.hideByRoomIdAndUserId(rid, Meteor.userId()); + return Subscriptions.hideByRoomIdAndUserId(rid, Meteor.userId()); }, }); diff --git a/server/methods/ignoreUser.js b/server/methods/ignoreUser.js index a968b213e4eb..30c38ea6ec48 100644 --- a/server/methods/ignoreUser.js +++ b/server/methods/ignoreUser.js @@ -1,6 +1,6 @@ import { Meteor } from 'meteor/meteor'; import { check } from 'meteor/check'; -import { RocketChat } from 'meteor/rocketchat:lib'; +import { Subscriptions } from 'meteor/rocketchat:models'; Meteor.methods({ ignoreUser({ rid, userId: ignoredUser, ignore = true }) { @@ -15,18 +15,18 @@ Meteor.methods({ }); } - const subscription = RocketChat.models.Subscriptions.findOneByRoomIdAndUserId(rid, userId); + const subscription = Subscriptions.findOneByRoomIdAndUserId(rid, userId); if (!subscription) { throw new Meteor.Error('error-invalid-subscription', 'Invalid subscription', { method: 'ignoreUser' }); } - const subscriptionIgnoredUser = RocketChat.models.Subscriptions.findOneByRoomIdAndUserId(rid, ignoredUser); + const subscriptionIgnoredUser = Subscriptions.findOneByRoomIdAndUserId(rid, ignoredUser); if (!subscriptionIgnoredUser) { throw new Meteor.Error('error-invalid-subscription', 'Invalid subscription', { method: 'ignoreUser' }); } - return !!RocketChat.models.Subscriptions.ignoreUser({ _id: subscription._id, ignoredUser, ignore }); + return !!Subscriptions.ignoreUser({ _id: subscription._id, ignoredUser, ignore }); }, }); diff --git a/server/methods/loadHistory.js b/server/methods/loadHistory.js index 5b5ab09035c9..5617cc7de5d2 100644 --- a/server/methods/loadHistory.js +++ b/server/methods/loadHistory.js @@ -1,9 +1,13 @@ import { Meteor } from 'meteor/meteor'; import { check } from 'meteor/check'; +import { Subscriptions } from 'meteor/rocketchat:models'; +import { hasPermission } from 'meteor/rocketchat:authorization'; +import { settings } from 'meteor/rocketchat:settings'; +import { loadMessageHistory } from 'meteor/rocketchat:lib'; const hideMessagesOfType = []; -RocketChat.settings.get(/Message_HideType_.+/, function(key, value) { +settings.get(/Message_HideType_.+/, function(key, value) { const type = key.replace('Message_HideType_', ''); const types = type === 'mute_unmute' ? ['user-muted', 'user-unmuted'] : [type]; @@ -25,7 +29,7 @@ Meteor.methods({ this.unblock(); check(rid, String); - if (!Meteor.userId() && RocketChat.settings.get('Accounts_AllowAnonymousRead') === false) { + if (!Meteor.userId() && settings.get('Accounts_AllowAnonymousRead') === false) { throw new Meteor.Error('error-invalid-user', 'Invalid user', { method: 'loadHistory', }); @@ -38,13 +42,13 @@ Meteor.methods({ return false; } - const canAnonymous = RocketChat.settings.get('Accounts_AllowAnonymousRead'); - const canPreview = RocketChat.authz.hasPermission(fromId, 'preview-c-room'); + const canAnonymous = settings.get('Accounts_AllowAnonymousRead'); + const canPreview = hasPermission(fromId, 'preview-c-room'); - if (room.t === 'c' && !canAnonymous && !canPreview && !RocketChat.models.Subscriptions.findOneByRoomIdAndUserId(rid, fromId, { fields: { _id: 1 } })) { + if (room.t === 'c' && !canAnonymous && !canPreview && !Subscriptions.findOneByRoomIdAndUserId(rid, fromId, { fields: { _id: 1 } })) { return false; } - return RocketChat.loadMessageHistory({ userId: fromId, rid, end, limit, ls }); + return loadMessageHistory({ userId: fromId, rid, end, limit, ls }); }, }); diff --git a/server/methods/loadMissedMessages.js b/server/methods/loadMissedMessages.js index af01894e5d33..f742ce0327aa 100644 --- a/server/methods/loadMissedMessages.js +++ b/server/methods/loadMissedMessages.js @@ -1,5 +1,7 @@ import { Meteor } from 'meteor/meteor'; import { check } from 'meteor/check'; +import { Messages } from 'meteor/rocketchat:models'; +import { settings } from 'meteor/rocketchat:settings'; Meteor.methods({ loadMissedMessages(rid, start) { @@ -23,12 +25,12 @@ Meteor.methods({ }, }; - if (!RocketChat.settings.get('Message_ShowEditedStatus')) { + if (!settings.get('Message_ShowEditedStatus')) { options.fields = { editedAt: 0, }; } - return RocketChat.models.Messages.findVisibleByRoomIdAfterTimestamp(rid, start, options).fetch(); + return Messages.findVisibleByRoomIdAfterTimestamp(rid, start, options).fetch(); }, }); diff --git a/server/methods/loadNextMessages.js b/server/methods/loadNextMessages.js index 5601b628ea7a..1f67d27f3a36 100644 --- a/server/methods/loadNextMessages.js +++ b/server/methods/loadNextMessages.js @@ -1,5 +1,8 @@ import { Meteor } from 'meteor/meteor'; import { check } from 'meteor/check'; +import { Messages } from 'meteor/rocketchat:models'; +import { settings } from 'meteor/rocketchat:settings'; +import { composeMessageObjectWithUser } from 'meteor/rocketchat:utils'; Meteor.methods({ loadNextMessages(rid, end, limit = 20) { @@ -25,7 +28,7 @@ Meteor.methods({ limit, }; - if (!RocketChat.settings.get('Message_ShowEditedStatus')) { + if (!settings.get('Message_ShowEditedStatus')) { options.fields = { editedAt: 0, }; @@ -33,13 +36,13 @@ Meteor.methods({ let records; if (end) { - records = RocketChat.models.Messages.findVisibleByRoomIdAfterTimestamp(rid, end, options).fetch(); + records = Messages.findVisibleByRoomIdAfterTimestamp(rid, end, options).fetch(); } else { - records = RocketChat.models.Messages.findVisibleByRoomId(rid, options).fetch(); + records = Messages.findVisibleByRoomId(rid, options).fetch(); } return { - messages: records.map((message) => RocketChat.composeMessageObjectWithUser(message, fromId)), + messages: records.map((message) => composeMessageObjectWithUser(message, fromId)), }; }, }); diff --git a/server/methods/loadSurroundingMessages.js b/server/methods/loadSurroundingMessages.js index 69db55d14fd5..796b69411df3 100644 --- a/server/methods/loadSurroundingMessages.js +++ b/server/methods/loadSurroundingMessages.js @@ -1,5 +1,8 @@ import { Meteor } from 'meteor/meteor'; import { check } from 'meteor/check'; +import { Messages } from 'meteor/rocketchat:models'; +import { settings } from 'meteor/rocketchat:settings'; +import { composeMessageObjectWithUser } from 'meteor/rocketchat:utils'; Meteor.methods({ loadSurroundingMessages(message, limit = 50) { @@ -18,7 +21,7 @@ Meteor.methods({ return false; } - message = RocketChat.models.Messages.findOneById(message._id); + message = Messages.findOneById(message._id); if (!message || !message.rid) { return false; @@ -37,13 +40,13 @@ Meteor.methods({ limit: Math.ceil(limit / 2), }; - if (!RocketChat.settings.get('Message_ShowEditedStatus')) { + if (!settings.get('Message_ShowEditedStatus')) { options.fields = { editedAt: 0, }; } - const messages = RocketChat.models.Messages.findVisibleByRoomIdBeforeTimestamp(message.rid, message.ts, options).fetch(); + const messages = Messages.findVisibleByRoomIdBeforeTimestamp(message.rid, message.ts, options).fetch(); const moreBefore = messages.length === options.limit; @@ -55,13 +58,13 @@ Meteor.methods({ options.limit = Math.floor(limit / 2); - const afterMessages = RocketChat.models.Messages.findVisibleByRoomIdAfterTimestamp(message.rid, message.ts, options).fetch(); + const afterMessages = Messages.findVisibleByRoomIdAfterTimestamp(message.rid, message.ts, options).fetch(); const moreAfter = afterMessages.length === options.limit; return { messages: messages.concat(afterMessages) - .map((message) => RocketChat.composeMessageObjectWithUser(message, fromId)), + .map((message) => composeMessageObjectWithUser(message, fromId)), moreBefore, moreAfter, }; diff --git a/server/methods/logoutCleanUp.js b/server/methods/logoutCleanUp.js index 157db2896cb7..40a71419470d 100644 --- a/server/methods/logoutCleanUp.js +++ b/server/methods/logoutCleanUp.js @@ -1,12 +1,13 @@ import { Meteor } from 'meteor/meteor'; import { check } from 'meteor/check'; +import { callbacks } from 'meteor/rocketchat:callbacks'; Meteor.methods({ logoutCleanUp(user) { check(user, Object); Meteor.defer(function() { - RocketChat.callbacks.run('afterLogoutCleanUp', user); + callbacks.run('afterLogoutCleanUp', user); }); }, }); diff --git a/server/methods/messageSearch.js b/server/methods/messageSearch.js index dd40f392928e..44ade636a0a0 100644 --- a/server/methods/messageSearch.js +++ b/server/methods/messageSearch.js @@ -1,5 +1,7 @@ import { Meteor } from 'meteor/meteor'; import { Match, check } from 'meteor/check'; +import { Subscriptions, Messages } from 'meteor/rocketchat:models'; +import { settings } from 'meteor/rocketchat:settings'; import s from 'underscore.string'; Meteor.methods({ @@ -27,7 +29,7 @@ Meteor.methods({ if (!Meteor.call('canAccessRoom', rid, currentUserId)) { return result; } - } else if (RocketChat.settings.get('Search.defaultProvider.GlobalSearchEnabled') !== true) { + } else if (settings.get('Search.defaultProvider.GlobalSearchEnabled') !== true) { return result; } @@ -187,7 +189,7 @@ Meteor.methods({ $regex: r[1], $options: r[2], }; - } else if (RocketChat.settings.get('Message_AlwaysSearchRegExp')) { + } else if (settings.get('Message_AlwaysSearchRegExp')) { query.msg = { $regex: text, $options: 'i', @@ -216,19 +218,19 @@ Meteor.methods({ query.rid = rid; } else { query.rid = { - $in: RocketChat.models.Subscriptions.findByUserId(user._id) + $in: Subscriptions.findByUserId(user._id) .fetch() .map((subscription) => subscription.rid), }; } - if (!RocketChat.settings.get('Message_ShowEditedStatus')) { + if (!settings.get('Message_ShowEditedStatus')) { options.fields = { editedAt: 0, }; } - result.message.docs = RocketChat.models.Messages.find(query, options).fetch(); + result.message.docs = Messages.find(query, options).fetch(); } return result; diff --git a/server/methods/migrate.js b/server/methods/migrate.js index e46e7dc11993..938a2271fad9 100644 --- a/server/methods/migrate.js +++ b/server/methods/migrate.js @@ -1,5 +1,7 @@ import { Meteor } from 'meteor/meteor'; import { check } from 'meteor/check'; +import { Migrations } from 'meteor/rocketchat:migrations'; +import { hasPermission } from 'meteor/rocketchat:authorization'; Meteor.methods({ migrateTo(version) { @@ -13,7 +15,7 @@ Meteor.methods({ const user = Meteor.user(); - if (!user || RocketChat.authz.hasPermission(user._id, 'run-migration') !== true) { + if (!user || hasPermission(user._id, 'run-migration') !== true) { throw new Meteor.Error('error-not-allowed', 'Not allowed', { method: 'migrateTo', }); @@ -21,7 +23,7 @@ Meteor.methods({ this.unblock(); - RocketChat.Migrations.migrateTo(version); + Migrations.migrateTo(version); return version; }, @@ -33,6 +35,6 @@ Meteor.methods({ }); } - return RocketChat.Migrations.getVersion(); + return Migrations.getVersion(); }, }); diff --git a/server/methods/muteUserInRoom.js b/server/methods/muteUserInRoom.js index b63c3e4a1729..496ea2b90aaa 100644 --- a/server/methods/muteUserInRoom.js +++ b/server/methods/muteUserInRoom.js @@ -1,5 +1,7 @@ import { Meteor } from 'meteor/meteor'; import { Match, check } from 'meteor/check'; +import { Rooms, Subscriptions, Users, Messages } from 'meteor/rocketchat:models'; +import { hasPermission } from 'meteor/rocketchat:authorization'; Meteor.methods({ muteUserInRoom(data) { @@ -16,13 +18,13 @@ Meteor.methods({ const fromId = Meteor.userId(); - if (!RocketChat.authz.hasPermission(fromId, 'mute-user', data.rid)) { + if (!hasPermission(fromId, 'mute-user', data.rid)) { throw new Meteor.Error('error-not-allowed', 'Not allowed', { method: 'muteUserInRoom', }); } - const room = RocketChat.models.Rooms.findOneById(data.rid); + const room = Rooms.findOneById(data.rid); if (!room) { throw new Meteor.Error('error-invalid-room', 'Invalid room', { @@ -37,20 +39,20 @@ Meteor.methods({ }); } - const subscription = RocketChat.models.Subscriptions.findOneByRoomIdAndUsername(data.rid, data.username, { fields: { _id: 1 } }); + const subscription = Subscriptions.findOneByRoomIdAndUsername(data.rid, data.username, { fields: { _id: 1 } }); if (!subscription) { throw new Meteor.Error('error-user-not-in-room', 'User is not in this room', { method: 'muteUserInRoom', }); } - const mutedUser = RocketChat.models.Users.findOneByUsername(data.username); + const mutedUser = Users.findOneByUsername(data.username); - RocketChat.models.Rooms.muteUsernameByRoomId(data.rid, mutedUser.username); + Rooms.muteUsernameByRoomId(data.rid, mutedUser.username); - const fromUser = RocketChat.models.Users.findOneById(fromId); + const fromUser = Users.findOneById(fromId); - RocketChat.models.Messages.createUserMutedWithRoomIdAndUser(data.rid, mutedUser, { + Messages.createUserMutedWithRoomIdAndUser(data.rid, mutedUser, { u: { _id: fromUser._id, username: fromUser.username, diff --git a/server/methods/openRoom.js b/server/methods/openRoom.js index 2a9af14d3e07..678631e13b71 100644 --- a/server/methods/openRoom.js +++ b/server/methods/openRoom.js @@ -1,5 +1,6 @@ import { Meteor } from 'meteor/meteor'; import { check } from 'meteor/check'; +import { Subscriptions } from 'meteor/rocketchat:models'; Meteor.methods({ openRoom(rid) { @@ -11,6 +12,6 @@ Meteor.methods({ }); } - return RocketChat.models.Subscriptions.openByRoomIdAndUserId(rid, Meteor.userId()); + return Subscriptions.openByRoomIdAndUserId(rid, Meteor.userId()); }, }); diff --git a/server/methods/readMessages.js b/server/methods/readMessages.js index 939cfc9a471b..789bc40789c3 100644 --- a/server/methods/readMessages.js +++ b/server/methods/readMessages.js @@ -1,6 +1,7 @@ import { Meteor } from 'meteor/meteor'; import { check } from 'meteor/check'; import { ReadReceipt } from '../../imports/message-read-receipt/server/lib/ReadReceipt'; +import { Subscriptions } from 'meteor/rocketchat:models'; Meteor.methods({ readMessages(rid) { @@ -15,9 +16,9 @@ Meteor.methods({ } // this prevents cache from updating object reference/pointer - const userSubscription = Object.assign({}, RocketChat.models.Subscriptions.findOneByRoomIdAndUserId(rid, userId)); + const userSubscription = Object.assign({}, Subscriptions.findOneByRoomIdAndUserId(rid, userId)); - RocketChat.models.Subscriptions.setAsReadByRoomIdAndUserId(rid, userId); + Subscriptions.setAsReadByRoomIdAndUserId(rid, userId); Meteor.defer(() => { ReadReceipt.markMessagesAsRead(rid, userId, userSubscription.ls); diff --git a/server/methods/registerUser.js b/server/methods/registerUser.js index 660f65feac65..68ae85da63c4 100644 --- a/server/methods/registerUser.js +++ b/server/methods/registerUser.js @@ -3,6 +3,10 @@ import { Match, check } from 'meteor/check'; import { Accounts } from 'meteor/accounts-base'; import s from 'underscore.string'; import * as Mailer from 'meteor/rocketchat:mailer'; +import { Users } from 'meteor/rocketchat:models'; +import { settings } from 'meteor/rocketchat:settings'; +import { saveCustomFields, validateEmailDomain, passwordPolicy } from 'meteor/rocketchat:lib'; + let verifyEmailTemplate = ''; Meteor.startup(() => { Mailer.getTemplateWrapped('Verification_Email', (value) => { @@ -11,9 +15,9 @@ Meteor.startup(() => { }); Meteor.methods({ registerUser(formData) { - const AllowAnonymousRead = RocketChat.settings.get('Accounts_AllowAnonymousRead'); - const AllowAnonymousWrite = RocketChat.settings.get('Accounts_AllowAnonymousWrite'); - const manuallyApproveNewUsers = RocketChat.settings.get('Accounts_ManuallyApproveNewUsers'); + const AllowAnonymousRead = settings.get('Accounts_AllowAnonymousRead'); + const AllowAnonymousWrite = settings.get('Accounts_AllowAnonymousWrite'); + const manuallyApproveNewUsers = settings.get('Accounts_ManuallyApproveNewUsers'); if (AllowAnonymousRead === true && AllowAnonymousWrite === true && formData.email == null) { const userId = Accounts.insertUserDoc({}, { globalRoles: [ @@ -35,15 +39,15 @@ Meteor.methods({ })); } - if (RocketChat.settings.get('Accounts_RegistrationForm') === 'Disabled') { + if (settings.get('Accounts_RegistrationForm') === 'Disabled') { throw new Meteor.Error('error-user-registration-disabled', 'User registration is disabled', { method: 'registerUser' }); - } else if (RocketChat.settings.get('Accounts_RegistrationForm') === 'Secret URL' && (!formData.secretURL || formData.secretURL !== RocketChat.settings.get('Accounts_RegistrationForm_SecretURL'))) { + } else if (settings.get('Accounts_RegistrationForm') === 'Secret URL' && (!formData.secretURL || formData.secretURL !== settings.get('Accounts_RegistrationForm_SecretURL'))) { throw new Meteor.Error ('error-user-registration-secret', 'User registration is only allowed via Secret URL', { method: 'registerUser' }); } - RocketChat.passwordPolicy.validate(formData.pass); + passwordPolicy.validate(formData.pass); - RocketChat.validateEmailDomain(formData.email); + validateEmailDomain(formData.email); const userData = { email: s.trim(formData.email.toLowerCase()), @@ -53,7 +57,7 @@ Meteor.methods({ }; // Check if user has already been imported and never logged in. If so, set password and let it through - const importedUser = RocketChat.models.Users.findOneByEmailAddress(s.trim(formData.email.toLowerCase())); + const importedUser = Users.findOneByEmailAddress(s.trim(formData.email.toLowerCase())); let userId; if (importedUser && importedUser.importIds && importedUser.importIds.length && !importedUser.lastLogin) { Accounts.setPassword(importedUser._id, userData.password); @@ -62,18 +66,18 @@ Meteor.methods({ userId = Accounts.createUser(userData); } - RocketChat.models.Users.setName(userId, s.trim(formData.name)); + Users.setName(userId, s.trim(formData.name)); const reason = s.trim(formData.reason); if (manuallyApproveNewUsers && reason) { - RocketChat.models.Users.setReason(userId, reason); + Users.setReason(userId, reason); } - RocketChat.saveCustomFields(userId, formData); + saveCustomFields(userId, formData); try { - const subject = Mailer.replace(RocketChat.settings.get('Verification_Email_Subject')); + const subject = Mailer.replace(settings.get('Verification_Email_Subject')); Accounts.emailTemplates.verifyEmail.subject = () => subject; Accounts.emailTemplates.verifyEmail.html = (userModel, url) => Mailer.replace(Mailer.replacekey(verifyEmailTemplate, 'Verification_Url', url), userModel);