diff --git a/.github/no-js-action-config.json b/.github/no-js-action-config.json index 5dd97fccaf67..45e82790b82e 100644 --- a/.github/no-js-action-config.json +++ b/.github/no-js-action-config.json @@ -1,5 +1,13 @@ { "added": { - "ignore": ["packages/accounts-linkedin/**/*", "packages/linkedin-oauth/**/*", "tests/cypress/integration/08-resolutions.spec.js", "**/.eslintrc.js", "packages/eslint-config/**", "**/babel.config.js"] + "ignore": [ + "packages/node-poplib/**/*", + "packages/accounts-linkedin/**/*", + "packages/linkedin-oauth/**/*", + "tests/cypress/integration/08-resolutions.spec.js", + "**/.eslintrc.js", + "packages/eslint-config/**", + "**/babel.config.js" + ] } } diff --git a/_templates/package/new/package.json.ejs.t b/_templates/package/new/package.json.ejs.t index 948e2ded4be4..11d8139f8b5f 100644 --- a/_templates/package/new/package.json.ejs.t +++ b/_templates/package/new/package.json.ejs.t @@ -26,5 +26,13 @@ to: packages/<%= name %>/package.json "/dist" ], "dependencies": { + }, + "eslintConfig": { + "extends": [ + "@rocket.chat/eslint-config" + ], + "ignorePatterns": [ + "**/dist" + ] } } diff --git a/apps/meteor/app/2fa/server/functions/resetTOTP.ts b/apps/meteor/app/2fa/server/functions/resetTOTP.ts index 25da60ca2b1d..dd404515c8f2 100644 --- a/apps/meteor/app/2fa/server/functions/resetTOTP.ts +++ b/apps/meteor/app/2fa/server/functions/resetTOTP.ts @@ -1,10 +1,10 @@ import { Meteor } from 'meteor/meteor'; import { TAPi18n } from 'meteor/rocketchat:tap-i18n'; import type { IUser } from '@rocket.chat/core-typings'; +import { Users } from '@rocket.chat/models'; import { settings } from '../../../settings/server'; import * as Mailer from '../../../mailer'; -import { Users } from '../../../models/server/raw/index'; const sendResetNotification = async function (uid: string): Promise { const user = await Users.findOneById>(uid, { diff --git a/apps/meteor/app/2fa/server/lib/totp.ts b/apps/meteor/app/2fa/server/lib/totp.ts index ad831ce37029..c06a1ffc9b17 100644 --- a/apps/meteor/app/2fa/server/lib/totp.ts +++ b/apps/meteor/app/2fa/server/lib/totp.ts @@ -2,8 +2,7 @@ import { SHA256 } from 'meteor/sha'; import { Random } from 'meteor/random'; import speakeasy from 'speakeasy'; -// @ts-expect-error -import { Users } from '../../../models'; +import { Users } from '../../../models/server'; import { settings } from '../../../settings/server'; export const TOTP = { diff --git a/apps/meteor/app/analytics/client/trackEvents.js b/apps/meteor/app/analytics/client/trackEvents.js index 28c3987dc1b9..86cd69ea95a4 100644 --- a/apps/meteor/app/analytics/client/trackEvents.js +++ b/apps/meteor/app/analytics/client/trackEvents.js @@ -4,7 +4,7 @@ import { Tracker } from 'meteor/tracker'; import { settings } from '../../settings'; import { callbacks } from '../../../lib/callbacks'; -import { ChatRoom } from '../../models'; +import { ChatRoom } from '../../models/client'; function trackEvent(category, action, label) { if (window._paq) { diff --git a/apps/meteor/app/api/server/lib/emailInbox.ts b/apps/meteor/app/api/server/lib/emailInbox.ts index c679c3d714ee..d993dd538ab2 100644 --- a/apps/meteor/app/api/server/lib/emailInbox.ts +++ b/apps/meteor/app/api/server/lib/emailInbox.ts @@ -1,7 +1,7 @@ import { IEmailInbox } from '@rocket.chat/core-typings'; import { InsertOneWriteOpResult, UpdateWriteOpResult, WithId } from 'mongodb'; +import { EmailInbox } from '@rocket.chat/models'; -import { EmailInbox } from '../../../models/server/raw'; import { hasPermissionAsync } from '../../../authorization/server/functions/hasPermission'; import { Users } from '../../../models/server'; diff --git a/apps/meteor/app/api/server/lib/emoji-custom.ts b/apps/meteor/app/api/server/lib/emoji-custom.ts index 2c3f660c67f1..5444bdba8256 100644 --- a/apps/meteor/app/api/server/lib/emoji-custom.ts +++ b/apps/meteor/app/api/server/lib/emoji-custom.ts @@ -1,7 +1,6 @@ import { IEmojiCustom, ILivechatDepartmentRecord } from '@rocket.chat/core-typings'; import { FilterQuery, SortOptionObject } from 'mongodb'; - -import { EmojiCustom } from '../../../models/server/raw'; +import { EmojiCustom } from '@rocket.chat/models'; export async function findEmojisCustom({ query = {}, diff --git a/apps/meteor/app/api/server/lib/integrations.ts b/apps/meteor/app/api/server/lib/integrations.ts index c785984380e5..517b64ad3440 100644 --- a/apps/meteor/app/api/server/lib/integrations.ts +++ b/apps/meteor/app/api/server/lib/integrations.ts @@ -1,6 +1,6 @@ import type { IIntegration, IUser } from '@rocket.chat/core-typings'; +import { Integrations } from '@rocket.chat/models'; -import { Integrations } from '../../../models/server/raw'; import { hasPermissionAsync } from '../../../authorization/server/functions/hasPermission'; const hasIntegrationsPermission = async (userId: string, integration: IIntegration): Promise => { diff --git a/apps/meteor/app/api/server/lib/messages.ts b/apps/meteor/app/api/server/lib/messages.ts index 194bdabdd274..e59c987dcbec 100644 --- a/apps/meteor/app/api/server/lib/messages.ts +++ b/apps/meteor/app/api/server/lib/messages.ts @@ -1,7 +1,7 @@ import { IMessage, IUser } from '@rocket.chat/core-typings'; +import { Rooms, Messages, Users } from '@rocket.chat/models'; import { canAccessRoomAsync } from '../../../authorization/server/functions/canAccessRoom'; -import { Rooms, Messages, Users } from '../../../models/server/raw'; import { getValue } from '../../../settings/server/raw'; export async function findMentionedMessages({ @@ -19,7 +19,7 @@ export async function findMentionedMessages({ total: number; }> { const room = await Rooms.findOneById(roomId); - if (!(await canAccessRoomAsync(room, { _id: uid }))) { + if (!room || !(await canAccessRoomAsync(room, { _id: uid }))) { throw new Error('error-not-allowed'); } const user: IUser | null = await Users.findOneById(uid, { fields: { username: 1 } }); @@ -60,7 +60,7 @@ export async function findStarredMessages({ total: number; }> { const room = await Rooms.findOneById(roomId); - if (!(await canAccessRoomAsync(room, { _id: uid }))) { + if (!room || !(await canAccessRoomAsync(room, { _id: uid }))) { throw new Error('error-not-allowed'); } const user = await Users.findOneById(uid, { fields: { username: 1 } }); @@ -133,7 +133,7 @@ export async function findSnippetedMessages({ } const room = await Rooms.findOneById(roomId); - if (!(await canAccessRoomAsync(room, { _id: uid }))) { + if (!room || !(await canAccessRoomAsync(room, { _id: uid }))) { throw new Error('error-not-allowed'); } @@ -173,7 +173,7 @@ export async function findDiscussionsFromRoom({ }> { const room = await Rooms.findOneById(roomId); - if (!(await canAccessRoomAsync(room, { _id: uid }))) { + if (!room || !(await canAccessRoomAsync(room, { _id: uid }))) { throw new Error('error-not-allowed'); } diff --git a/apps/meteor/app/api/server/lib/rooms.ts b/apps/meteor/app/api/server/lib/rooms.ts index 5ffd4798bb78..106b92123f33 100644 --- a/apps/meteor/app/api/server/lib/rooms.ts +++ b/apps/meteor/app/api/server/lib/rooms.ts @@ -1,7 +1,7 @@ import { IRoom, ISubscription } from '@rocket.chat/core-typings'; +import { Rooms } from '@rocket.chat/models'; import { hasPermissionAsync, hasAtLeastOnePermissionAsync } from '../../../authorization/server/functions/hasPermission'; -import { Rooms } from '../../../models/server/raw'; import { Subscriptions } from '../../../models/server'; import { adminFields } from '../../../../lib/rooms/adminFields'; diff --git a/apps/meteor/app/api/server/lib/users.ts b/apps/meteor/app/api/server/lib/users.ts index 7762b9b20a18..588a21328112 100644 --- a/apps/meteor/app/api/server/lib/users.ts +++ b/apps/meteor/app/api/server/lib/users.ts @@ -1,8 +1,8 @@ import { escapeRegExp } from '@rocket.chat/string-helpers'; import { ILivechatDepartmentRecord, IUser } from '@rocket.chat/core-typings'; import { FilterQuery } from 'mongodb'; +import { Users } from '@rocket.chat/models'; -import { Users } from '../../../models/server/raw'; import { hasPermissionAsync } from '../../../authorization/server/functions/hasPermission'; export async function findUsersToAutocomplete({ diff --git a/apps/meteor/app/api/server/lib/webdav.ts b/apps/meteor/app/api/server/lib/webdav.ts index 7f3701a7d695..db0c47a64e2d 100644 --- a/apps/meteor/app/api/server/lib/webdav.ts +++ b/apps/meteor/app/api/server/lib/webdav.ts @@ -1,6 +1,5 @@ import type { IWebdavAccount } from '@rocket.chat/core-typings'; - -import { WebdavAccounts } from '../../../models/server/raw'; +import { WebdavAccounts } from '@rocket.chat/models'; export async function findWebdavAccountsByUserId({ uid }: { uid: string }): Promise { return WebdavAccounts.findWithUserId(uid, { diff --git a/apps/meteor/app/api/server/v1/channels.js b/apps/meteor/app/api/server/v1/channels.js index b5137b487223..c1036d46c2c3 100644 --- a/apps/meteor/app/api/server/v1/channels.js +++ b/apps/meteor/app/api/server/v1/channels.js @@ -1,9 +1,9 @@ import { Meteor } from 'meteor/meteor'; import { Match, check } from 'meteor/check'; import _ from 'underscore'; +import { Integrations, Uploads } from '@rocket.chat/models'; import { Rooms, Subscriptions, Messages, Users } from '../../../models/server'; -import { Integrations, Uploads } from '../../../models/server/raw'; import { canAccessRoom, hasPermission, hasAtLeastOnePermission } from '../../../authorization/server'; import { mountIntegrationQueryBasedOnPermissions } from '../../../integrations/server/lib/mountQueriesBasedOnPermission'; import { normalizeMessagesForUser } from '../../../utils/server/lib/normalizeMessagesForUser'; diff --git a/apps/meteor/app/api/server/v1/chat.js b/apps/meteor/app/api/server/v1/chat.js index 424568cf2ced..c8195b302f7f 100644 --- a/apps/meteor/app/api/server/v1/chat.js +++ b/apps/meteor/app/api/server/v1/chat.js @@ -2,7 +2,7 @@ import { escapeRegExp } from '@rocket.chat/string-helpers'; import { Meteor } from 'meteor/meteor'; import { Match, check } from 'meteor/check'; -import { Messages } from '../../../models'; +import { Messages } from '../../../models/server'; import { canAccessRoom, canAccessRoomId, roomAccessAttributes, hasPermission } from '../../../authorization/server'; import { normalizeMessagesForUser } from '../../../utils/server/lib/normalizeMessagesForUser'; import { processWebhookMessage } from '../../../lib/server'; diff --git a/apps/meteor/app/api/server/v1/custom-sounds.ts b/apps/meteor/app/api/server/v1/custom-sounds.ts index f6294c8a5ec1..59536dce5ce3 100644 --- a/apps/meteor/app/api/server/v1/custom-sounds.ts +++ b/apps/meteor/app/api/server/v1/custom-sounds.ts @@ -1,4 +1,5 @@ -import { CustomSounds } from '../../../models/server/raw'; +import { CustomSounds } from '@rocket.chat/models'; + import { API } from '../api'; API.v1.addRoute( diff --git a/apps/meteor/app/api/server/v1/custom-user-status.ts b/apps/meteor/app/api/server/v1/custom-user-status.ts index e86df11a7380..6bf0770ae750 100644 --- a/apps/meteor/app/api/server/v1/custom-user-status.ts +++ b/apps/meteor/app/api/server/v1/custom-user-status.ts @@ -1,7 +1,7 @@ import { Meteor } from 'meteor/meteor'; import { Match, check } from 'meteor/check'; +import { CustomUserStatus } from '@rocket.chat/models'; -import { CustomUserStatus } from '../../../models/server/raw'; import { API } from '../api'; API.v1.addRoute( diff --git a/apps/meteor/app/api/server/v1/email-inbox.ts b/apps/meteor/app/api/server/v1/email-inbox.ts index 1e6392a8aad0..e94370acf3f3 100644 --- a/apps/meteor/app/api/server/v1/email-inbox.ts +++ b/apps/meteor/app/api/server/v1/email-inbox.ts @@ -1,9 +1,9 @@ import { check, Match } from 'meteor/check'; +import { EmailInbox } from '@rocket.chat/models'; import { API } from '../api'; import { insertOneEmailInbox, findEmailInboxes, findOneEmailInbox, updateEmailInbox } from '../lib/emailInbox'; import { hasPermission } from '../../../authorization/server/functions/hasPermission'; -import { EmailInbox } from '../../../models/server/raw'; import Users from '../../../models/server/models/Users'; import { sendTestEmailToInbox } from '../../../../server/features/EmailInbox/EmailInbox_Outgoing'; diff --git a/apps/meteor/app/api/server/v1/emoji-custom.ts b/apps/meteor/app/api/server/v1/emoji-custom.ts index df66f686edfd..619215db4cf9 100644 --- a/apps/meteor/app/api/server/v1/emoji-custom.ts +++ b/apps/meteor/app/api/server/v1/emoji-custom.ts @@ -1,6 +1,6 @@ import { Meteor } from 'meteor/meteor'; +import { EmojiCustom } from '@rocket.chat/models'; -import { EmojiCustom } from '../../../models/server/raw'; import { API } from '../api'; import { getUploadFormData } from '../lib/getUploadFormData'; import { findEmojisCustom } from '../lib/emoji-custom'; diff --git a/apps/meteor/app/api/server/v1/groups.js b/apps/meteor/app/api/server/v1/groups.js index 4a715ad65d2c..54e1a8e0e185 100644 --- a/apps/meteor/app/api/server/v1/groups.js +++ b/apps/meteor/app/api/server/v1/groups.js @@ -1,10 +1,10 @@ import _ from 'underscore'; import { Meteor } from 'meteor/meteor'; import { Match, check } from 'meteor/check'; +import { Integrations, Uploads } from '@rocket.chat/models'; import { mountIntegrationQueryBasedOnPermissions } from '../../../integrations/server/lib/mountQueriesBasedOnPermission'; import { Subscriptions, Rooms, Messages, Users } from '../../../models/server'; -import { Integrations, Uploads } from '../../../models/server/raw'; import { hasPermission, hasAtLeastOnePermission, diff --git a/apps/meteor/app/api/server/v1/im.ts b/apps/meteor/app/api/server/v1/im.ts index 0236d350b212..99d11c470d7a 100644 --- a/apps/meteor/app/api/server/v1/im.ts +++ b/apps/meteor/app/api/server/v1/im.ts @@ -12,9 +12,10 @@ import { } from '@rocket.chat/rest-typings'; import { Meteor } from 'meteor/meteor'; import { Match, check } from 'meteor/check'; +import { Subscriptions, Uploads, Messages, Rooms, Settings } from '@rocket.chat/models'; +import type { FilterQuery } from 'mongodb'; import { Users } from '../../../models/server'; -import { Subscriptions, Uploads, Messages, Rooms, Settings } from '../../../models/server/raw'; import { canAccessRoomIdAsync } from '../../../authorization/server/functions/canAccessRoom'; import { hasPermission } from '../../../authorization/server'; import { normalizeMessagesForUser } from '../../../utils/server/lib/normalizeMessagesForUser'; @@ -477,7 +478,7 @@ API.v1.addRoute( const { offset, count }: { offset: number; count: number } = this.getPaginationItems(); const { sort, fields, query } = this.parseJsonQuery(); - const ourQuery = { ...query, t: 'd' }; + const ourQuery = { ...query, t: 'd' } as FilterQuery; const rooms = await Rooms.find(ourQuery, { sort: sort || { name: 1 }, diff --git a/apps/meteor/app/api/server/v1/import.js b/apps/meteor/app/api/server/v1/import.ts similarity index 77% rename from apps/meteor/app/api/server/v1/import.js rename to apps/meteor/app/api/server/v1/import.ts index b681b480d9d5..adaf638c0df3 100644 --- a/apps/meteor/app/api/server/v1/import.js +++ b/apps/meteor/app/api/server/v1/import.ts @@ -1,4 +1,15 @@ import { Meteor } from 'meteor/meteor'; +import { + isUploadImportFileParamsPOST, + isDownloadPublicImportFileParamsPOST, + isStartImportParamsPOST, + isGetImportFileDataParamsGET, + isGetImportProgressParamsGET, + isGetLatestImportOperationsParamsGET, + isDownloadPendingFilesParamsPOST, + isDownloadPendingAvatarsParamsPOST, + isGetCurrentImportOperationParamsGET, +} from '@rocket.chat/rest-typings'; import { API } from '../api'; import { hasPermission } from '../../../authorization/server'; @@ -7,7 +18,10 @@ import { Importers } from '../../../importer/server'; API.v1.addRoute( 'uploadImportFile', - { authRequired: true }, + { + authRequired: true, + validateParams: isUploadImportFileParamsPOST, + }, { post() { const { binaryContent, contentType, fileName, importerKey } = this.bodyParams; @@ -19,7 +33,10 @@ API.v1.addRoute( API.v1.addRoute( 'downloadPublicImportFile', - { authRequired: true }, + { + authRequired: true, + validateParams: isDownloadPublicImportFileParamsPOST, + }, { post() { const { fileUrl, importerKey } = this.bodyParams; @@ -35,7 +52,10 @@ API.v1.addRoute( API.v1.addRoute( 'startImport', - { authRequired: true }, + { + authRequired: true, + validateParams: isStartImportParamsPOST, + }, { post() { const { input } = this.bodyParams; @@ -51,7 +71,10 @@ API.v1.addRoute( API.v1.addRoute( 'getImportFileData', - { authRequired: true }, + { + authRequired: true, + validateParams: isGetImportFileDataParamsGET, + }, { get() { let result; @@ -66,7 +89,10 @@ API.v1.addRoute( API.v1.addRoute( 'getImportProgress', - { authRequired: true }, + { + authRequired: true, + validateParams: isGetImportProgressParamsGET, + }, { get() { let result; @@ -81,7 +107,10 @@ API.v1.addRoute( API.v1.addRoute( 'getLatestImportOperations', - { authRequired: true }, + { + authRequired: true, + validateParams: isGetLatestImportOperationsParamsGET, + }, { get() { let result; @@ -96,7 +125,10 @@ API.v1.addRoute( API.v1.addRoute( 'downloadPendingFiles', - { authRequired: true }, + { + authRequired: true, + validateParams: isDownloadPendingFilesParamsPOST, + }, { post() { if (!this.userId) { @@ -129,7 +161,10 @@ API.v1.addRoute( API.v1.addRoute( 'downloadPendingAvatars', - { authRequired: true }, + { + authRequired: true, + validateParams: isDownloadPendingAvatarsParamsPOST, + }, { post() { if (!this.userId) { @@ -162,7 +197,10 @@ API.v1.addRoute( API.v1.addRoute( 'getCurrentImportOperation', - { authRequired: true }, + { + authRequired: true, + validateParams: isGetCurrentImportOperationParamsGET, + }, { get() { if (!this.userId) { diff --git a/apps/meteor/app/api/server/v1/instances.ts b/apps/meteor/app/api/server/v1/instances.ts index 6826d6733743..204f1ceb9440 100644 --- a/apps/meteor/app/api/server/v1/instances.ts +++ b/apps/meteor/app/api/server/v1/instances.ts @@ -1,9 +1,9 @@ import type { IInstanceStatus } from '@rocket.chat/core-typings'; +import { InstanceStatus } from '@rocket.chat/models'; import { getInstanceConnection } from '../../../../server/stream/streamBroadcast'; import { hasPermission } from '../../../authorization/server'; import { API } from '../api'; -import { InstanceStatus } from '../../../models/server/raw'; API.v1.addRoute( 'instances.get', diff --git a/apps/meteor/app/api/server/v1/integrations.ts b/apps/meteor/app/api/server/v1/integrations.ts index 61413e87af3a..0938b0d4eb65 100644 --- a/apps/meteor/app/api/server/v1/integrations.ts +++ b/apps/meteor/app/api/server/v1/integrations.ts @@ -8,9 +8,9 @@ import { isIntegrationsGetProps, isIntegrationsUpdateProps, } from '@rocket.chat/rest-typings'; +import { Integrations, IntegrationHistory } from '@rocket.chat/models'; import { hasAtLeastOnePermission } from '../../../authorization/server'; -import { Integrations, IntegrationHistory } from '../../../models/server/raw'; import { API } from '../api'; import { mountIntegrationHistoryQueryBasedOnPermissions, diff --git a/apps/meteor/app/api/server/v1/oauthapps.ts b/apps/meteor/app/api/server/v1/oauthapps.ts index 50d9549dac67..a9d48884595d 100644 --- a/apps/meteor/app/api/server/v1/oauthapps.ts +++ b/apps/meteor/app/api/server/v1/oauthapps.ts @@ -1,7 +1,7 @@ import { isOauthAppsGetParams } from '@rocket.chat/rest-typings'; +import { OAuthApps } from '@rocket.chat/models'; import { hasPermissionAsync } from '../../../authorization/server/functions/hasPermission'; -import { OAuthApps } from '../../../models/server/raw'; import { API } from '../api'; API.v1.addRoute( diff --git a/apps/meteor/app/api/server/v1/permissions.ts b/apps/meteor/app/api/server/v1/permissions.ts index f820c733c4b7..d03fab78e7fb 100644 --- a/apps/meteor/app/api/server/v1/permissions.ts +++ b/apps/meteor/app/api/server/v1/permissions.ts @@ -1,10 +1,10 @@ import { Meteor } from 'meteor/meteor'; import type { IPermission } from '@rocket.chat/core-typings'; import { isBodyParamsValidPermissionUpdate } from '@rocket.chat/rest-typings'; +import { Permissions, Roles } from '@rocket.chat/models'; import { hasPermission } from '../../../authorization/server'; import { API } from '../api'; -import { Permissions, Roles } from '../../../models/server/raw'; API.v1.addRoute( 'permissions.listAll', diff --git a/apps/meteor/app/api/server/v1/push.ts b/apps/meteor/app/api/server/v1/push.ts index 1dc649cb5adf..4a5743ec3c68 100644 --- a/apps/meteor/app/api/server/v1/push.ts +++ b/apps/meteor/app/api/server/v1/push.ts @@ -1,13 +1,13 @@ import { Meteor } from 'meteor/meteor'; import { Random } from 'meteor/random'; import { Match, check } from 'meteor/check'; +import { Messages } from '@rocket.chat/models'; import { appTokensCollection } from '../../../push/server'; import { API } from '../api'; import PushNotification from '../../../push-notifications/server/lib/PushNotification'; import { canAccessRoom } from '../../../authorization/server/functions/canAccessRoom'; import { Users, Rooms } from '../../../models/server'; -import { Messages } from '../../../models/server/raw'; API.v1.addRoute( 'push.token', diff --git a/apps/meteor/app/api/server/v1/roles.ts b/apps/meteor/app/api/server/v1/roles.ts index 9785741326d7..62d0571b687c 100644 --- a/apps/meteor/app/api/server/v1/roles.ts +++ b/apps/meteor/app/api/server/v1/roles.ts @@ -8,13 +8,13 @@ import { isRoleUpdateProps, } from '@rocket.chat/rest-typings'; import type { IRole } from '@rocket.chat/core-typings'; +import { Roles } from '@rocket.chat/models'; import { Users } from '../../../models/server'; import { API } from '../api'; import { getUsersInRole, hasRole } from '../../../authorization/server'; import { settings } from '../../../settings/server/index'; import { api } from '../../../../server/sdk/api'; -import { Roles } from '../../../models/server/raw'; import { apiDeprecationLogger } from '../../../lib/server/lib/deprecationWarningLogger'; import { hasAnyRoleAsync } from '../../../authorization/server/functions/hasRole'; import { hasPermissionAsync } from '../../../authorization/server/functions/hasPermission'; diff --git a/apps/meteor/app/api/server/v1/rooms.js b/apps/meteor/app/api/server/v1/rooms.js index 3efbf9f00116..b03dc1a53986 100644 --- a/apps/meteor/app/api/server/v1/rooms.js +++ b/apps/meteor/app/api/server/v1/rooms.js @@ -1,7 +1,7 @@ import { Meteor } from 'meteor/meteor'; import { FileUpload } from '../../../file-upload'; -import { Rooms, Messages } from '../../../models'; +import { Rooms, Messages } from '../../../models/server'; import { API } from '../api'; import { findAdminRooms, diff --git a/apps/meteor/app/api/server/v1/settings.ts b/apps/meteor/app/api/server/v1/settings.ts index f91c09d2166a..73ef52184906 100644 --- a/apps/meteor/app/api/server/v1/settings.ts +++ b/apps/meteor/app/api/server/v1/settings.ts @@ -8,8 +8,8 @@ import { isSettingsUpdatePropsActions, isSettingsUpdatePropsColor, } from '@rocket.chat/rest-typings'; +import { Settings } from '@rocket.chat/models'; -import { Settings } from '../../../models/server/raw'; import { hasPermission } from '../../../authorization/server'; import { API, ResultFor } from '../api'; import { SettingsEvents, settings } from '../../../settings/server'; diff --git a/apps/meteor/app/api/server/v1/subscriptions.ts b/apps/meteor/app/api/server/v1/subscriptions.ts index c042863eb1ec..08b186301f91 100644 --- a/apps/meteor/app/api/server/v1/subscriptions.ts +++ b/apps/meteor/app/api/server/v1/subscriptions.ts @@ -5,8 +5,8 @@ import { isSubscriptionsReadProps, isSubscriptionsUnreadProps, } from '@rocket.chat/rest-typings'; +import { Subscriptions } from '@rocket.chat/models'; -import { Subscriptions } from '../../../models/server/raw'; import { API } from '../api'; API.v1.addRoute( diff --git a/apps/meteor/app/api/server/v1/users.ts b/apps/meteor/app/api/server/v1/users.ts index 8e6808fd34b4..d9fbdeaffc5b 100644 --- a/apps/meteor/app/api/server/v1/users.ts +++ b/apps/meteor/app/api/server/v1/users.ts @@ -17,9 +17,9 @@ import { Accounts } from 'meteor/accounts-base'; import { Match, check } from 'meteor/check'; import { TAPi18n } from 'meteor/rocketchat:tap-i18n'; import { IExportOperation, IPersonalAccessToken, IUser } from '@rocket.chat/core-typings'; +import { Users as UsersRaw } from '@rocket.chat/models'; import { Users, Subscriptions } from '../../../models/server'; -import { Users as UsersRaw } from '../../../models/server/raw'; import { hasPermission } from '../../../authorization/server'; import { settings } from '../../../settings/server'; import { @@ -390,7 +390,7 @@ API.v1.addRoute( queryOperations: ['$or', '$and'], }, { - get() { + async get() { if (!hasPermission(this.userId, 'view-d-room')) { return API.v1.unauthorized(); } @@ -431,39 +431,37 @@ API.v1.addRoute( ] : []; - const result = Promise.await( - UsersRaw.col - .aggregate([ - { - $match: nonEmptyQuery, - }, - { - $project: inclusiveFields, - }, - { - $addFields: { - nameInsensitive: { - $toLower: '$name', - }, + const result = await UsersRaw.col + .aggregate<{ sortedResults: IUser[]; totalCount: { total: number }[] }>([ + { + $match: nonEmptyQuery, + }, + { + $project: inclusiveFields, + }, + { + $addFields: { + nameInsensitive: { + $toLower: '$name', }, }, - { - $facet: { - sortedResults: [ - { - $sort: actualSort, - }, - { - $skip: offset, - }, - ...limit, - ], - totalCount: [{ $group: { _id: null, total: { $sum: 1 } } }], - }, + }, + { + $facet: { + sortedResults: [ + { + $sort: actualSort, + }, + { + $skip: offset, + }, + ...limit, + ], + totalCount: [{ $group: { _id: null, total: { $sum: 1 } } }], }, - ]) - .toArray(), - ); + }, + ]) + .toArray(); const { sortedResults: users, diff --git a/apps/meteor/app/api/server/v1/voip/events.ts b/apps/meteor/app/api/server/v1/voip/events.ts index 13648aff6e64..5b3d61a46f6d 100644 --- a/apps/meteor/app/api/server/v1/voip/events.ts +++ b/apps/meteor/app/api/server/v1/voip/events.ts @@ -1,10 +1,10 @@ import { Match, check } from 'meteor/check'; import { VoipClientEvents } from '@rocket.chat/core-typings'; +import { VoipRoom } from '@rocket.chat/models'; import { API } from '../../api'; import { LivechatVoip } from '../../../../../server/sdk'; import { canAccessRoom } from '../../../../authorization/server'; -import { VoipRoom } from '../../../../models/server/raw'; API.v1.addRoute( 'voip/events', diff --git a/apps/meteor/app/api/server/v1/voip/extensions.ts b/apps/meteor/app/api/server/v1/voip/extensions.ts index 7d23a991fefd..598a8bce662e 100644 --- a/apps/meteor/app/api/server/v1/voip/extensions.ts +++ b/apps/meteor/app/api/server/v1/voip/extensions.ts @@ -1,8 +1,8 @@ import { Match, check } from 'meteor/check'; import type { IVoipExtensionBase } from '@rocket.chat/core-typings'; +import { Users } from '@rocket.chat/models'; import { API } from '../../api'; -import { Users } from '../../../../models/server/raw/index'; import { Voip } from '../../../../../server/sdk'; import { generateJWT } from '../../../../utils/server/lib/JWTHelper'; import { settings } from '../../../../settings/server'; diff --git a/apps/meteor/app/api/server/v1/voip/omnichannel.ts b/apps/meteor/app/api/server/v1/voip/omnichannel.ts index 521da77aa256..28ef3608be67 100644 --- a/apps/meteor/app/api/server/v1/voip/omnichannel.ts +++ b/apps/meteor/app/api/server/v1/voip/omnichannel.ts @@ -1,8 +1,8 @@ import { Match, check } from 'meteor/check'; import { IUser, IVoipExtensionWithAgentInfo } from '@rocket.chat/core-typings'; +import { Users } from '@rocket.chat/models'; import { API } from '../../api'; -import { Users } from '../../../../models/server/raw/index'; import { hasPermission } from '../../../../authorization/server/index'; import { LivechatVoip } from '../../../../../server/sdk'; import { logger } from './logger'; @@ -33,38 +33,6 @@ API.v1.addRoute( 'omnichannel/agent/extension', { authRequired: true }, { - // Get the extensions associated with the agent passed as request params. - async get() { - if (!hasPermission(this.userId, 'view-agent-extension-association')) { - return API.v1.unauthorized(); - } - check( - this.requestParams(), - Match.ObjectIncluding({ - username: String, - }), - ); - const { username } = this.requestParams(); - const user = await Users.findOneByAgentUsername(username, { - projection: { _id: 1 }, - }); - if (!user) { - return API.v1.notFound('User not found'); - } - const extension = await Users.getVoipExtensionByUserId(user._id, { - projection: { - _id: 1, - username: 1, - extension: 1, - }, - }); - if (!extension) { - return API.v1.notFound('Extension not found'); - } - return API.v1.success({ extension }); - }, - - // Create agent-extension association. async post() { if (!hasPermission(this.userId, 'manage-agent-extension-association')) { return API.v1.unauthorized(); @@ -121,18 +89,55 @@ API.v1.addRoute( return API.v1.failure(`extension already in use ${extension}`); } }, + }, +); + +API.v1.addRoute( + 'omnichannel/agent/extension/:username', + { authRequired: true }, + { + // Get the extensions associated with the agent passed as request params. + async get() { + if (!hasPermission(this.userId, 'view-agent-extension-association')) { + return API.v1.unauthorized(); + } + check( + this.urlParams, + Match.ObjectIncluding({ + username: String, + }), + ); + const { username } = this.urlParams; + const user = await Users.findOneByAgentUsername(username, { + projection: { _id: 1 }, + }); + if (!user) { + return API.v1.notFound('User not found'); + } + const extension = await Users.getVoipExtensionByUserId(user._id, { + projection: { + _id: 1, + username: 1, + extension: 1, + }, + }); + if (!extension) { + return API.v1.notFound('Extension not found'); + } + return API.v1.success({ extension }); + }, async delete() { if (!hasPermission(this.userId, 'manage-agent-extension-association')) { return API.v1.unauthorized(); } check( - this.requestParams(), + this.urlParams, Match.ObjectIncluding({ username: String, }), ); - const { username } = this.requestParams(); + const { username } = this.urlParams; const user = await Users.findOneByAgentUsername(username, { projection: { _id: 1, diff --git a/apps/meteor/app/api/server/v1/voip/rooms.ts b/apps/meteor/app/api/server/v1/voip/rooms.ts index ee3a37fc1347..1bc70ce928ba 100644 --- a/apps/meteor/app/api/server/v1/voip/rooms.ts +++ b/apps/meteor/app/api/server/v1/voip/rooms.ts @@ -1,10 +1,10 @@ import { Match, check } from 'meteor/check'; import { Random } from 'meteor/random'; import type { ILivechatAgent } from '@rocket.chat/core-typings'; +import { VoipRoom, LivechatVisitors, Users } from '@rocket.chat/models'; import { isVoipRoomCloseProps } from '@rocket.chat/rest-typings/dist/v1/voip'; import { API } from '../../api'; -import { VoipRoom, LivechatVisitors, Users } from '../../../../models/server/raw'; import { LivechatVoip } from '../../../../../server/sdk'; import { hasPermission } from '../../../../authorization/server'; import { typedJsonParse } from '../../../../../lib/typedJSONParse'; @@ -108,6 +108,9 @@ API.v1.addRoute( if (room) { return API.v1.success({ room, newRoom: false }); } + if (!agentId) { + return API.v1.failure('agent-not-found'); + } const agentObj: ILivechatAgent = await Users.findOneAgentById(agentId, { projection: { username: 1 }, diff --git a/apps/meteor/app/apps/server/bridges/activation.ts b/apps/meteor/app/apps/server/bridges/activation.ts index ac0a2654cae8..a610200b896e 100644 --- a/apps/meteor/app/apps/server/bridges/activation.ts +++ b/apps/meteor/app/apps/server/bridges/activation.ts @@ -1,8 +1,8 @@ import { AppActivationBridge as ActivationBridge } from '@rocket.chat/apps-engine/server/bridges/AppActivationBridge'; import { ProxiedApp } from '@rocket.chat/apps-engine/server/ProxiedApp'; import { AppStatus } from '@rocket.chat/apps-engine/definition/AppStatus'; +import { Users } from '@rocket.chat/models'; -import { Users } from '../../../models/server/raw'; import { AppServerOrchestrator } from '../orchestrator'; export class AppActivationBridge extends ActivationBridge { diff --git a/apps/meteor/app/apps/server/bridges/commands.ts b/apps/meteor/app/apps/server/bridges/commands.ts index 9f6448794e4d..8c9a429af170 100644 --- a/apps/meteor/app/apps/server/bridges/commands.ts +++ b/apps/meteor/app/apps/server/bridges/commands.ts @@ -6,6 +6,7 @@ import type { IMessage, RequiredField, SlashCommand } from '@rocket.chat/core-ty import { slashCommands } from '../../../utils/server'; import { Utilities } from '../../lib/misc/Utilities'; import { AppServerOrchestrator } from '../orchestrator'; +import { parseParameters } from '../../../../lib/utils/parseParameters'; export class AppCommandsBridge extends CommandBridge { disabledCommands: Map; @@ -169,9 +170,15 @@ export class AppCommandsBridge extends CommandBridge { const user = this.orch.getConverters()?.get('users').convertById(Meteor.userId()); const room = this.orch.getConverters()?.get('rooms').convertById(message.rid); const threadId = message.tmid; - const params = parameters.length === 0 || parameters === ' ' ? [] : parameters.split(' '); + const params = parseParameters(parameters); - const context = new SlashCommandContext(Object.freeze(user), Object.freeze(room), Object.freeze(params), threadId, triggerId); + const context = new SlashCommandContext( + Object.freeze(user), + Object.freeze(room), + Object.freeze(params) as string[], + threadId, + triggerId, + ); Promise.await(this.orch.getManager()?.getCommandManager().executeCommand(command, context)); } @@ -180,9 +187,9 @@ export class AppCommandsBridge extends CommandBridge { const user = this.orch.getConverters()?.get('users').convertById(Meteor.userId()); const room = this.orch.getConverters()?.get('rooms').convertById(message.rid); const threadId = message.tmid; - const params = parameters.length === 0 || parameters === ' ' ? [] : parameters.split(' '); + const params = parseParameters(parameters); - const context = new SlashCommandContext(Object.freeze(user), Object.freeze(room), Object.freeze(params), threadId); + const context = new SlashCommandContext(Object.freeze(user), Object.freeze(room), Object.freeze(params) as string[], threadId); return Promise.await(this.orch.getManager()?.getCommandManager().getPreviews(command, context)); } @@ -196,9 +203,15 @@ export class AppCommandsBridge extends CommandBridge { const user = this.orch.getConverters()?.get('users').convertById(Meteor.userId()); const room = this.orch.getConverters()?.get('rooms').convertById(message.rid); const threadId = message.tmid; - const params = parameters.length === 0 || parameters === ' ' ? [] : parameters.split(' '); - - const context = new SlashCommandContext(Object.freeze(user), Object.freeze(room), Object.freeze(params), threadId, triggerId); + const params = parseParameters(parameters); + + const context = new SlashCommandContext( + Object.freeze(user), + Object.freeze(room), + Object.freeze(params) as string[], + threadId, + triggerId, + ); await this.orch.getManager()?.getCommandManager().executePreview(command, preview, context); } diff --git a/apps/meteor/app/apps/server/bridges/internal.ts b/apps/meteor/app/apps/server/bridges/internal.ts index 64cb2cc59ed0..7b21e61139ed 100644 --- a/apps/meteor/app/apps/server/bridges/internal.ts +++ b/apps/meteor/app/apps/server/bridges/internal.ts @@ -1,10 +1,10 @@ import { InternalBridge } from '@rocket.chat/apps-engine/server/bridges/InternalBridge'; import { ISetting } from '@rocket.chat/apps-engine/definition/settings'; import type { ISubscription } from '@rocket.chat/core-typings'; +import { Settings } from '@rocket.chat/models'; import { AppServerOrchestrator } from '../orchestrator'; import { Subscriptions } from '../../../models/server'; -import { Settings } from '../../../models/server/raw'; export class AppInternalBridge extends InternalBridge { // eslint-disable-next-line no-empty-function diff --git a/apps/meteor/app/apps/server/bridges/livechat.ts b/apps/meteor/app/apps/server/bridges/livechat.ts index 23a0e91411da..28f28a9ae4c9 100644 --- a/apps/meteor/app/apps/server/bridges/livechat.ts +++ b/apps/meteor/app/apps/server/bridges/livechat.ts @@ -11,10 +11,11 @@ import { IUser } from '@rocket.chat/apps-engine/definition/users'; import { IMessage } from '@rocket.chat/apps-engine/definition/messages'; import { IExtraRoomParams } from '@rocket.chat/apps-engine/definition/accessors/ILivechatCreator'; import { OmnichannelSourceType } from '@rocket.chat/core-typings'; +import { LivechatVisitors } from '@rocket.chat/models'; import { getRoom } from '../../../livechat/server/api/lib/livechat'; import { Livechat } from '../../../livechat/server/lib/Livechat'; -import { Users, LivechatDepartment, LivechatVisitors, LivechatRooms } from '../../../models/server'; +import { Users, LivechatDepartment, LivechatRooms } from '../../../models/server'; import { AppServerOrchestrator } from '../orchestrator'; export class AppLivechatBridge extends LivechatBridge { @@ -216,9 +217,9 @@ export class AppLivechatBridge extends LivechatBridge { console.warn('The method AppLivechatBridge.findVisitors is deprecated. Please consider using its alternatives'); } - return LivechatVisitors.find(query) - .fetch() - .map((visitor: IVisitor) => this.orch.getConverters()?.get('visitors').convertVisitor(visitor)); + return (await LivechatVisitors.find(query).toArray()).map( + (visitor) => visitor && this.orch.getConverters()?.get('visitors').convertVisitor(visitor), + ); } protected async findVisitorById(id: string, appId: string): Promise { @@ -230,19 +231,28 @@ export class AppLivechatBridge extends LivechatBridge { protected async findVisitorByEmail(email: string, appId: string): Promise { this.orch.debugLog(`The App ${appId} is looking for livechat visitors.`); - return this.orch.getConverters()?.get('visitors').convertVisitor(LivechatVisitors.findOneGuestByEmailAddress(email)); + return this.orch + .getConverters() + ?.get('visitors') + .convertVisitor(await LivechatVisitors.findOneGuestByEmailAddress(email)); } protected async findVisitorByToken(token: string, appId: string): Promise { this.orch.debugLog(`The App ${appId} is looking for livechat visitors.`); - return this.orch.getConverters()?.get('visitors').convertVisitor(LivechatVisitors.getVisitorByToken(token, {})); + return this.orch + .getConverters() + ?.get('visitors') + .convertVisitor(await LivechatVisitors.getVisitorByToken(token, {})); } protected async findVisitorByPhoneNumber(phoneNumber: string, appId: string): Promise { this.orch.debugLog(`The App ${appId} is looking for livechat visitors.`); - return this.orch.getConverters()?.get('visitors').convertVisitor(LivechatVisitors.findOneVisitorByPhone(phoneNumber)); + return this.orch + .getConverters() + ?.get('visitors') + .convertVisitor(await LivechatVisitors.findOneVisitorByPhone(phoneNumber)); } protected async findDepartmentByIdOrName(value: string, appId: string): Promise { diff --git a/apps/meteor/app/apps/server/bridges/settings.ts b/apps/meteor/app/apps/server/bridges/settings.ts index 9262642b2d3c..4bbbefd47a81 100644 --- a/apps/meteor/app/apps/server/bridges/settings.ts +++ b/apps/meteor/app/apps/server/bridges/settings.ts @@ -1,7 +1,7 @@ import { ISetting } from '@rocket.chat/apps-engine/definition/settings'; import { ServerSettingBridge } from '@rocket.chat/apps-engine/server/bridges/ServerSettingBridge'; +import { Settings } from '@rocket.chat/models'; -import { Settings } from '../../../models/server/raw'; import { AppServerOrchestrator } from '../orchestrator'; export class AppSettingBridge extends ServerSettingBridge { diff --git a/apps/meteor/app/apps/server/bridges/users.ts b/apps/meteor/app/apps/server/bridges/users.ts index 68e5e54fc1f2..012ad09227c5 100644 --- a/apps/meteor/app/apps/server/bridges/users.ts +++ b/apps/meteor/app/apps/server/bridges/users.ts @@ -2,10 +2,10 @@ import { Random } from 'meteor/random'; import { UserPresence } from 'meteor/konecty:user-presence'; import { UserBridge } from '@rocket.chat/apps-engine/server/bridges/UserBridge'; import { IUserCreationOptions, IUser } from '@rocket.chat/apps-engine/definition/users'; +import { Subscriptions, Users as UsersRaw } from '@rocket.chat/models'; import { setUserAvatar, checkUsernameAvailability, deleteUser } from '../../../lib/server/functions'; import { Users } from '../../../models/server'; -import { Subscriptions, Users as UsersRaw } from '../../../models/server/raw'; import { AppServerOrchestrator } from '../orchestrator'; export class AppUserBridge extends UserBridge { @@ -98,7 +98,7 @@ export class AppUserBridge extends UserBridge { const { status } = fields; delete fields.status; - await UsersRaw.update({ _id: user.id }, { $set: fields }); + await UsersRaw.update({ _id: user.id }, { $set: fields as any }); if (status) { UserPresence.setDefaultStatus(user.id, status); diff --git a/apps/meteor/app/apps/server/communication/methods.ts b/apps/meteor/app/apps/server/communication/methods.ts index a469408146b2..5533651aecb3 100644 --- a/apps/meteor/app/apps/server/communication/methods.ts +++ b/apps/meteor/app/apps/server/communication/methods.ts @@ -1,7 +1,7 @@ import { Meteor } from 'meteor/meteor'; import { SettingValue } from '@rocket.chat/core-typings'; +import { Settings } from '@rocket.chat/models'; -import { Settings } from '../../../models/server/raw'; import { hasPermission } from '../../../authorization/server'; import { twoFactorRequired } from '../../../2fa/server/twoFactorRequired'; import { AppServerOrchestrator } from '../orchestrator'; diff --git a/apps/meteor/app/apps/server/communication/rest.js b/apps/meteor/app/apps/server/communication/rest.js index 0b7122e37521..4cfd13be58b0 100644 --- a/apps/meteor/app/apps/server/communication/rest.js +++ b/apps/meteor/app/apps/server/communication/rest.js @@ -1,5 +1,6 @@ import { Meteor } from 'meteor/meteor'; import { HTTP } from 'meteor/http'; +import { Settings } from '@rocket.chat/models'; import { API } from '../../../api/server'; import { getUploadFormData } from '../../../api/server/lib/getUploadFormData'; @@ -7,7 +8,6 @@ import { getWorkspaceAccessToken, getUserCloudAccessToken } from '../../../cloud import { settings } from '../../../settings/server'; import { Info } from '../../../utils'; import { Users } from '../../../models/server'; -import { Settings } from '../../../models/server/raw'; import { Apps } from '../orchestrator'; import { formatAppInstanceForRest } from '../../lib/misc/formatAppInstanceForRest'; import { actionButtonsHandler } from './endpoints/actionButtonsHandler'; diff --git a/apps/meteor/app/apps/server/converters/messages.js b/apps/meteor/app/apps/server/converters/messages.js index 35d6daa4b463..25931452edd0 100644 --- a/apps/meteor/app/apps/server/converters/messages.js +++ b/apps/meteor/app/apps/server/converters/messages.js @@ -1,6 +1,6 @@ import { Random } from 'meteor/random'; -import { Messages, Rooms, Users } from '../../../models'; +import { Messages, Rooms, Users } from '../../../models/server'; import { transformMappedData } from '../../lib/misc/transformMappedData'; export class AppMessagesConverter { diff --git a/apps/meteor/app/apps/server/converters/rooms.js b/apps/meteor/app/apps/server/converters/rooms.js index 12857a94e117..4a9f6225af15 100644 --- a/apps/meteor/app/apps/server/converters/rooms.js +++ b/apps/meteor/app/apps/server/converters/rooms.js @@ -1,6 +1,7 @@ import { RoomType } from '@rocket.chat/apps-engine/definition/rooms'; +import { LivechatVisitors } from '@rocket.chat/models'; -import { Rooms, Users, LivechatVisitors, LivechatDepartment } from '../../../models'; +import { Rooms, Users, LivechatDepartment } from '../../../models/server'; import { transformMappedData } from '../../lib/misc/transformMappedData'; export class AppRoomsConverter { @@ -36,7 +37,7 @@ export class AppRoomsConverter { let v; if (room.visitor) { - const visitor = LivechatVisitors.findOneById(room.visitor.id); + const visitor = Promise.await(LivechatVisitors.findOneById(room.visitor.id)); v = { _id: visitor._id, username: visitor.username, diff --git a/apps/meteor/app/apps/server/converters/settings.js b/apps/meteor/app/apps/server/converters/settings.js index bc5949bc7ccd..da3e075deb67 100644 --- a/apps/meteor/app/apps/server/converters/settings.js +++ b/apps/meteor/app/apps/server/converters/settings.js @@ -1,6 +1,5 @@ import { SettingType } from '@rocket.chat/apps-engine/definition/settings'; - -import { Settings } from '../../../models/server/raw'; +import { Settings } from '@rocket.chat/models'; export class AppSettingsConverter { constructor(orch) { diff --git a/apps/meteor/app/apps/server/converters/uploads.js b/apps/meteor/app/apps/server/converters/uploads.js index efbda7ae5fd1..d386e52fdcac 100644 --- a/apps/meteor/app/apps/server/converters/uploads.js +++ b/apps/meteor/app/apps/server/converters/uploads.js @@ -1,5 +1,6 @@ +import { Uploads } from '@rocket.chat/models'; + import { transformMappedData } from '../../lib/misc/transformMappedData'; -import { Uploads } from '../../../models/server/raw'; export class AppUploadsConverter { constructor(orch) { diff --git a/apps/meteor/app/apps/server/converters/users.js b/apps/meteor/app/apps/server/converters/users.js index e8891b9dd720..8c84f598934e 100644 --- a/apps/meteor/app/apps/server/converters/users.js +++ b/apps/meteor/app/apps/server/converters/users.js @@ -1,6 +1,6 @@ import { UserStatusConnection, UserType } from '@rocket.chat/apps-engine/definition/users'; -import { Users } from '../../../models'; +import { Users } from '../../../models/server'; export class AppUsersConverter { constructor(orch) { diff --git a/apps/meteor/app/apps/server/converters/visitors.js b/apps/meteor/app/apps/server/converters/visitors.js index 40c29e1c59a8..361aa3758c6a 100644 --- a/apps/meteor/app/apps/server/converters/visitors.js +++ b/apps/meteor/app/apps/server/converters/visitors.js @@ -1,19 +1,21 @@ -import LivechatVisitors from '../../../models/server/models/LivechatVisitors'; +import { LivechatVisitors } from '@rocket.chat/models'; + import { transformMappedData } from '../../lib/misc/transformMappedData'; +// TODO: check if functions from this converter can be async export class AppVisitorsConverter { constructor(orch) { this.orch = orch; } convertById(id) { - const visitor = LivechatVisitors.findOneById(id); + const visitor = Promise.await(LivechatVisitors.findOneById(id)); return this.convertVisitor(visitor); } convertByToken(token) { - const visitor = LivechatVisitors.getVisitorByToken(token); + const visitor = Promise.await(LivechatVisitors.getVisitorByToken(token)); return this.convertVisitor(visitor); } diff --git a/apps/meteor/app/apps/server/cron.js b/apps/meteor/app/apps/server/cron.js index d70ba36d1e70..86a0e74b937e 100644 --- a/apps/meteor/app/apps/server/cron.js +++ b/apps/meteor/app/apps/server/cron.js @@ -3,12 +3,12 @@ import { HTTP } from 'meteor/http'; import { SyncedCron } from 'meteor/littledata:synced-cron'; import { TAPi18n } from 'meteor/rocketchat:tap-i18n'; import { AppStatus } from '@rocket.chat/apps-engine/definition/AppStatus'; +import { Settings } from '@rocket.chat/models'; import { Apps } from './orchestrator'; import { getWorkspaceAccessToken } from '../../cloud/server'; import { Users } from '../../models/server'; import { sendMessagesToAdmins } from '../../../server/lib/sendMessagesToAdmins'; -import { Settings } from '../../models/server/raw'; const notifyAdminsAboutInvalidApps = Meteor.bindEnvironment(function _notifyAdminsAboutInvalidApps(apps) { if (!apps) { diff --git a/apps/meteor/app/authentication/server/lib/restrictLoginAttempts.ts b/apps/meteor/app/authentication/server/lib/restrictLoginAttempts.ts index f9a5ff632e81..f49abd3ac68d 100644 --- a/apps/meteor/app/authentication/server/lib/restrictLoginAttempts.ts +++ b/apps/meteor/app/authentication/server/lib/restrictLoginAttempts.ts @@ -1,14 +1,14 @@ -import moment from 'moment'; import type { IServerEvent } from '@rocket.chat/core-typings'; import { ServerEventType } from '@rocket.chat/core-typings'; +import { Rooms, ServerEvents, Sessions, Users } from '@rocket.chat/models'; +import moment from 'moment'; -import { ILoginAttempt } from '../ILoginAttempt'; -import { ServerEvents, Users, Rooms, Sessions } from '../../../models/server/raw'; -import { settings } from '../../../settings/server'; import { addMinutesToADate } from '../../../../lib/utils/addMinutesToADate'; import { getClientAddress } from '../../../../server/lib/getClientAddress'; import { sendMessage } from '../../../lib/server/functions'; import { Logger } from '../../../logger/server'; +import { settings } from '../../../settings/server'; +import { ILoginAttempt } from '../ILoginAttempt'; const logger = new Logger('LoginProtection'); @@ -94,7 +94,8 @@ export const isValidAttemptByUser = async (login: ILoginAttempt): Promise, ): Promise { @@ -51,6 +51,10 @@ export async function canSendMessageAsync( extraData: Record, ): Promise { const room = await Rooms.findOneById(rid); + if (!room) { + throw new Error('error-invalid-room'); + } + await validateRoomMessagePermissionsAsync(room, { uid, username, type }, extraData); return room; } diff --git a/apps/meteor/app/authorization/server/functions/getRoles.ts b/apps/meteor/app/authorization/server/functions/getRoles.ts index 5ace1e614527..657b546aaaae 100644 --- a/apps/meteor/app/authorization/server/functions/getRoles.ts +++ b/apps/meteor/app/authorization/server/functions/getRoles.ts @@ -1,5 +1,4 @@ import type { IRole } from '@rocket.chat/core-typings'; - -import { Roles } from '../../../models/server/raw'; +import { Roles } from '@rocket.chat/models'; export const getRoles = (): IRole[] => Promise.await(Roles.find().toArray()); diff --git a/apps/meteor/app/authorization/server/functions/getUsersInRole.ts b/apps/meteor/app/authorization/server/functions/getUsersInRole.ts index dee7e46ab2fa..39202049ccd7 100644 --- a/apps/meteor/app/authorization/server/functions/getUsersInRole.ts +++ b/apps/meteor/app/authorization/server/functions/getUsersInRole.ts @@ -1,7 +1,6 @@ import { Cursor, FindOneOptions, WithoutProjection } from 'mongodb'; import type { IRole, IUser } from '@rocket.chat/core-typings'; - -import { Roles } from '../../../models/server/raw'; +import { Roles } from '@rocket.chat/models'; export function getUsersInRole(roleId: IRole['_id'], scope?: string): Promise>; diff --git a/apps/meteor/app/authorization/server/functions/hasRole.ts b/apps/meteor/app/authorization/server/functions/hasRole.ts index 9057072a2787..040d28d8a905 100644 --- a/apps/meteor/app/authorization/server/functions/hasRole.ts +++ b/apps/meteor/app/authorization/server/functions/hasRole.ts @@ -1,6 +1,5 @@ import type { IRole, IUser, IRoom, ISubscription } from '@rocket.chat/core-typings'; - -import { Roles } from '../../../models/server/raw'; +import { Roles } from '@rocket.chat/models'; export const hasAnyRoleAsync = async ( userId: IUser['_id'], diff --git a/apps/meteor/app/authorization/server/functions/upsertPermissions.ts b/apps/meteor/app/authorization/server/functions/upsertPermissions.ts index a058d02f3978..61dc24f7197d 100644 --- a/apps/meteor/app/authorization/server/functions/upsertPermissions.ts +++ b/apps/meteor/app/authorization/server/functions/upsertPermissions.ts @@ -1,9 +1,9 @@ /* eslint no-multi-spaces: 0 */ import type { IPermission, ISetting } from '@rocket.chat/core-typings'; +import { Permissions, Settings } from '@rocket.chat/models'; import { settings } from '../../../settings/server'; import { getSettingPermissionId, CONSTANTS } from '../../lib'; -import { Permissions, Settings } from '../../../models/server/raw'; import { createOrUpdateProtectedRoleAsync } from '../../../../server/lib/roles/createOrUpdateProtectedRole'; export const upsertPermissions = async (): Promise => { diff --git a/apps/meteor/app/authorization/server/methods/addPermissionToRole.ts b/apps/meteor/app/authorization/server/methods/addPermissionToRole.ts index 946a7813b226..8041cb8b7301 100644 --- a/apps/meteor/app/authorization/server/methods/addPermissionToRole.ts +++ b/apps/meteor/app/authorization/server/methods/addPermissionToRole.ts @@ -1,8 +1,8 @@ import { Meteor } from 'meteor/meteor'; +import { Permissions } from '@rocket.chat/models'; import { hasPermission } from '../functions/hasPermission'; import { CONSTANTS, AuthorizationUtils } from '../../lib'; -import { Permissions } from '../../../models/server/raw'; Meteor.methods({ async 'authorization:addPermissionToRole'(permissionId, role) { diff --git a/apps/meteor/app/authorization/server/methods/addUserToRole.ts b/apps/meteor/app/authorization/server/methods/addUserToRole.ts index 072f5162fcbd..c33f950e0dbc 100644 --- a/apps/meteor/app/authorization/server/methods/addUserToRole.ts +++ b/apps/meteor/app/authorization/server/methods/addUserToRole.ts @@ -1,12 +1,12 @@ import { Meteor } from 'meteor/meteor'; import _ from 'underscore'; import type { IRole, IUser, IRoom } from '@rocket.chat/core-typings'; +import { Roles } from '@rocket.chat/models'; import { Users } from '../../../models/server'; import { settings } from '../../../settings/server'; import { hasPermission } from '../functions/hasPermission'; import { api } from '../../../../server/sdk/api'; -import { Roles } from '../../../models/server/raw'; import { apiDeprecationLogger } from '../../../lib/server/lib/deprecationWarningLogger'; Meteor.methods({ diff --git a/apps/meteor/app/authorization/server/methods/deleteRole.ts b/apps/meteor/app/authorization/server/methods/deleteRole.ts index 4d9fb5238fc9..71858b228705 100644 --- a/apps/meteor/app/authorization/server/methods/deleteRole.ts +++ b/apps/meteor/app/authorization/server/methods/deleteRole.ts @@ -1,7 +1,7 @@ import { Meteor } from 'meteor/meteor'; import type { IRole } from '@rocket.chat/core-typings'; +import { Roles } from '@rocket.chat/models'; -import { Roles } from '../../../models/server/raw'; import { hasPermission } from '../functions/hasPermission'; import { apiDeprecationLogger } from '../../../lib/server/lib/deprecationWarningLogger'; diff --git a/apps/meteor/app/authorization/server/methods/removeRoleFromPermission.ts b/apps/meteor/app/authorization/server/methods/removeRoleFromPermission.ts index f690c29d5ea2..0d2ecf59333f 100644 --- a/apps/meteor/app/authorization/server/methods/removeRoleFromPermission.ts +++ b/apps/meteor/app/authorization/server/methods/removeRoleFromPermission.ts @@ -1,8 +1,8 @@ import { Meteor } from 'meteor/meteor'; +import { Permissions } from '@rocket.chat/models'; import { hasPermission } from '../functions/hasPermission'; import { CONSTANTS } from '../../lib'; -import { Permissions } from '../../../models/server/raw'; Meteor.methods({ async 'authorization:removeRoleFromPermission'(permissionId, role) { diff --git a/apps/meteor/app/authorization/server/methods/removeUserFromRole.ts b/apps/meteor/app/authorization/server/methods/removeUserFromRole.ts index 996c17f8b910..3eeda9c2c84e 100644 --- a/apps/meteor/app/authorization/server/methods/removeUserFromRole.ts +++ b/apps/meteor/app/authorization/server/methods/removeUserFromRole.ts @@ -1,12 +1,12 @@ import { Meteor } from 'meteor/meteor'; import _ from 'underscore'; import type { IRole, IUser } from '@rocket.chat/core-typings'; +import { Roles } from '@rocket.chat/models'; import { Users } from '../../../models/server'; import { settings } from '../../../settings/server'; import { hasPermission } from '../functions/hasPermission'; import { api } from '../../../../server/sdk/api'; -import { Roles } from '../../../models/server/raw'; import { apiDeprecationLogger } from '../../../lib/server/lib/deprecationWarningLogger'; Meteor.methods({ diff --git a/apps/meteor/app/authorization/server/methods/saveRole.ts b/apps/meteor/app/authorization/server/methods/saveRole.ts index 5a4b485a5e15..9eb19298f7f7 100644 --- a/apps/meteor/app/authorization/server/methods/saveRole.ts +++ b/apps/meteor/app/authorization/server/methods/saveRole.ts @@ -1,9 +1,9 @@ import { Meteor } from 'meteor/meteor'; import { isRoleCreateProps } from '@rocket.chat/rest-typings'; +import { Roles } from '@rocket.chat/models'; import { settings } from '../../../settings/server'; import { hasPermission } from '../functions/hasPermission'; -import { Roles } from '../../../models/server/raw'; import { methodDeprecationLogger } from '../../../lib/server/lib/deprecationWarningLogger'; import { updateRoleAsync } from '../../../../server/lib/roles/updateRole'; import { insertRoleAsync } from '../../../../server/lib/roles/insertRole'; diff --git a/apps/meteor/app/authorization/server/streamer/permissions/index.ts b/apps/meteor/app/authorization/server/streamer/permissions/index.ts index 881f4f44e7b5..866bec5fb407 100644 --- a/apps/meteor/app/authorization/server/streamer/permissions/index.ts +++ b/apps/meteor/app/authorization/server/streamer/permissions/index.ts @@ -1,7 +1,6 @@ import { Meteor } from 'meteor/meteor'; import { check, Match } from 'meteor/check'; - -import { Permissions } from '../../../../models/server/raw'; +import { Permissions } from '@rocket.chat/models'; Meteor.methods({ async 'permissions/get'(updatedAt: Date) { diff --git a/apps/meteor/app/autotranslate/server/permissions.ts b/apps/meteor/app/autotranslate/server/permissions.ts index cf712cc6d552..f75edf705c24 100644 --- a/apps/meteor/app/autotranslate/server/permissions.ts +++ b/apps/meteor/app/autotranslate/server/permissions.ts @@ -1,6 +1,5 @@ import { Meteor } from 'meteor/meteor'; - -import { Permissions } from '../../models/server/raw'; +import { Permissions } from '@rocket.chat/models'; Meteor.startup(async () => { if (!(await Permissions.findOne({ _id: 'auto-translate' }))) { diff --git a/apps/meteor/app/cas/server/cas_server.js b/apps/meteor/app/cas/server/cas_server.js index 53d64b1e34a9..6f26c4eb20f1 100644 --- a/apps/meteor/app/cas/server/cas_server.js +++ b/apps/meteor/app/cas/server/cas_server.js @@ -7,11 +7,11 @@ import { RoutePolicy } from 'meteor/routepolicy'; import _ from 'underscore'; import fiber from 'fibers'; import CAS from 'cas'; +import { CredentialTokens } from '@rocket.chat/models'; import { logger } from './cas_rocketchat'; -import { settings } from '../../settings'; +import { settings } from '../../settings/server'; import { Rooms } from '../../models/server'; -import { CredentialTokens } from '../../models/server/raw'; import { _setRealName } from '../../lib'; import { createRoom } from '../../lib/server/functions/createRoom'; diff --git a/apps/meteor/app/channel-settings/server/functions/saveReactWhenReadOnly.js b/apps/meteor/app/channel-settings/server/functions/saveReactWhenReadOnly.js index d4a6898678d6..8b118c51f01e 100644 --- a/apps/meteor/app/channel-settings/server/functions/saveReactWhenReadOnly.js +++ b/apps/meteor/app/channel-settings/server/functions/saveReactWhenReadOnly.js @@ -1,7 +1,7 @@ import { Meteor } from 'meteor/meteor'; import { Match } from 'meteor/check'; -import { Rooms, Messages } from '../../../models'; +import { Rooms, Messages } from '../../../models/server'; export const saveReactWhenReadOnly = function (rid, allowReact, user, sendMessage = true) { if (!Match.test(rid, String)) { diff --git a/apps/meteor/app/channel-settings/server/functions/saveRoomAnnouncement.js b/apps/meteor/app/channel-settings/server/functions/saveRoomAnnouncement.js index 38a5f56d612a..b3f66bf311a0 100644 --- a/apps/meteor/app/channel-settings/server/functions/saveRoomAnnouncement.js +++ b/apps/meteor/app/channel-settings/server/functions/saveRoomAnnouncement.js @@ -1,7 +1,7 @@ import { Meteor } from 'meteor/meteor'; import { Match } from 'meteor/check'; -import { Rooms, Messages } from '../../../models'; +import { Rooms, Messages } from '../../../models/server'; export const saveRoomAnnouncement = function (rid, roomAnnouncement, user, sendMessage = true) { if (!Match.test(rid, String)) { diff --git a/apps/meteor/app/channel-settings/server/functions/saveRoomCustomFields.js b/apps/meteor/app/channel-settings/server/functions/saveRoomCustomFields.js index 5691cd69b169..c246e01224ba 100644 --- a/apps/meteor/app/channel-settings/server/functions/saveRoomCustomFields.js +++ b/apps/meteor/app/channel-settings/server/functions/saveRoomCustomFields.js @@ -1,7 +1,7 @@ import { Meteor } from 'meteor/meteor'; import { Match } from 'meteor/check'; -import { Rooms, Subscriptions } from '../../../models'; +import { Rooms, Subscriptions } from '../../../models/server'; export const saveRoomCustomFields = function (rid, roomCustomFields) { if (!Match.test(rid, String)) { diff --git a/apps/meteor/app/channel-settings/server/functions/saveRoomDescription.js b/apps/meteor/app/channel-settings/server/functions/saveRoomDescription.js index 0804175f8e2a..dd6e0fb3ee1b 100644 --- a/apps/meteor/app/channel-settings/server/functions/saveRoomDescription.js +++ b/apps/meteor/app/channel-settings/server/functions/saveRoomDescription.js @@ -1,7 +1,7 @@ import { Meteor } from 'meteor/meteor'; import { Match } from 'meteor/check'; -import { Rooms, Messages } from '../../../models'; +import { Rooms, Messages } from '../../../models/server'; export const saveRoomDescription = function (rid, roomDescription, user) { if (!Match.test(rid, String)) { diff --git a/apps/meteor/app/channel-settings/server/functions/saveRoomName.js b/apps/meteor/app/channel-settings/server/functions/saveRoomName.js index 05615a865075..941f8e86fcfc 100644 --- a/apps/meteor/app/channel-settings/server/functions/saveRoomName.js +++ b/apps/meteor/app/channel-settings/server/functions/saveRoomName.js @@ -1,7 +1,7 @@ import { Meteor } from 'meteor/meteor'; +import { Integrations } from '@rocket.chat/models'; import { Rooms, Messages, Subscriptions } from '../../../models/server'; -import { Integrations } from '../../../models/server/raw'; import { getValidRoomName } from '../../../utils/server'; import { callbacks } from '../../../../lib/callbacks'; import { checkUsernameAvailability } from '../../../lib/server/functions'; diff --git a/apps/meteor/app/channel-settings/server/functions/saveRoomReadOnly.js b/apps/meteor/app/channel-settings/server/functions/saveRoomReadOnly.js index 7b7ed7bd0404..7cdb614e0679 100644 --- a/apps/meteor/app/channel-settings/server/functions/saveRoomReadOnly.js +++ b/apps/meteor/app/channel-settings/server/functions/saveRoomReadOnly.js @@ -1,7 +1,7 @@ import { Meteor } from 'meteor/meteor'; import { Match } from 'meteor/check'; -import { Rooms, Messages } from '../../../models'; +import { Rooms, Messages } from '../../../models/server'; export const saveRoomReadOnly = function (rid, readOnly, user, sendMessage = true) { if (!Match.test(rid, String)) { diff --git a/apps/meteor/app/channel-settings/server/functions/saveRoomSystemMessages.js b/apps/meteor/app/channel-settings/server/functions/saveRoomSystemMessages.js index 200b2d4eea8d..f3e30630ce5c 100644 --- a/apps/meteor/app/channel-settings/server/functions/saveRoomSystemMessages.js +++ b/apps/meteor/app/channel-settings/server/functions/saveRoomSystemMessages.js @@ -1,7 +1,7 @@ import { Meteor } from 'meteor/meteor'; import { Match } from 'meteor/check'; -import { Rooms } from '../../../models'; +import { Rooms } from '../../../models/server'; import { MessageTypesValues } from '../../../lib/lib/MessageTypes'; export const saveRoomSystemMessages = function (rid, systemMessages) { diff --git a/apps/meteor/app/channel-settings/server/functions/saveRoomTopic.js b/apps/meteor/app/channel-settings/server/functions/saveRoomTopic.js index 51a5a05035e2..93711f67f1f7 100644 --- a/apps/meteor/app/channel-settings/server/functions/saveRoomTopic.js +++ b/apps/meteor/app/channel-settings/server/functions/saveRoomTopic.js @@ -1,7 +1,7 @@ import { Meteor } from 'meteor/meteor'; import { Match } from 'meteor/check'; -import { Rooms, Messages } from '../../../models'; +import { Rooms, Messages } from '../../../models/server'; export const saveRoomTopic = function (rid, roomTopic, user, sendMessage = true) { if (!Match.test(rid, String)) { diff --git a/apps/meteor/app/channel-settings/server/functions/saveStreamingOptions.js b/apps/meteor/app/channel-settings/server/functions/saveStreamingOptions.js index c5c2d2b8fb2b..b9b7cea7f5f7 100644 --- a/apps/meteor/app/channel-settings/server/functions/saveStreamingOptions.js +++ b/apps/meteor/app/channel-settings/server/functions/saveStreamingOptions.js @@ -1,7 +1,7 @@ import { Meteor } from 'meteor/meteor'; import { Match, check } from 'meteor/check'; -import { Rooms } from '../../../models'; +import { Rooms } from '../../../models/server'; export const saveStreamingOptions = function (rid, options) { if (!Match.test(rid, String)) { diff --git a/apps/meteor/app/channel-settings/server/methods/saveRoomSettings.js b/apps/meteor/app/channel-settings/server/methods/saveRoomSettings.js index 0027ba085683..89dcd43fb8b8 100644 --- a/apps/meteor/app/channel-settings/server/methods/saveRoomSettings.js +++ b/apps/meteor/app/channel-settings/server/methods/saveRoomSettings.js @@ -4,7 +4,7 @@ import { TEAM_TYPE } from '@rocket.chat/core-typings'; import { setRoomAvatar } from '../../../lib/server/functions/setRoomAvatar'; import { hasPermission } from '../../../authorization'; -import { Rooms } from '../../../models'; +import { Rooms } from '../../../models/server'; import { callbacks } from '../../../../lib/callbacks'; import { saveRoomName } from '../functions/saveRoomName'; import { saveRoomTopic } from '../functions/saveRoomTopic'; diff --git a/apps/meteor/app/chatpal-search/client/template/result.js b/apps/meteor/app/chatpal-search/client/template/result.js index b96df425c3b4..17a91ae4f6b1 100644 --- a/apps/meteor/app/chatpal-search/client/template/result.js +++ b/apps/meteor/app/chatpal-search/client/template/result.js @@ -3,7 +3,7 @@ import { Template } from 'meteor/templating'; import { TAPi18n } from 'meteor/rocketchat:tap-i18n'; import { getURL } from '../../../utils'; -import { Subscriptions } from '../../../models'; +import { Subscriptions } from '../../../models/client'; import { getUserAvatarURL as getAvatarUrl } from '../../../utils/lib/getUserAvatarURL'; import { formatTime } from '../../../../client/lib/utils/formatTime'; import { formatDate } from '../../../../client/lib/utils/formatDate'; diff --git a/apps/meteor/app/chatpal-search/server/provider/index.js b/apps/meteor/app/chatpal-search/server/provider/index.js index 77f88dcea5f1..77eaa2725596 100644 --- a/apps/meteor/app/chatpal-search/server/provider/index.js +++ b/apps/meteor/app/chatpal-search/server/provider/index.js @@ -3,7 +3,7 @@ import { HTTP } from 'meteor/http'; import { Random } from 'meteor/random'; import ChatpalLogger from '../utils/logger'; -import { Rooms, Messages } from '../../../models'; +import { Rooms, Messages } from '../../../models/server'; /** * Enables HTTP functions on Chatpal Backend diff --git a/apps/meteor/app/chatpal-search/server/provider/provider.js b/apps/meteor/app/chatpal-search/server/provider/provider.js index 51670a762c44..b8705cf29be3 100644 --- a/apps/meteor/app/chatpal-search/server/provider/provider.js +++ b/apps/meteor/app/chatpal-search/server/provider/provider.js @@ -2,7 +2,7 @@ import { Meteor } from 'meteor/meteor'; import { searchProviderService, SearchProvider } from '../../../search/server'; import ChatpalLogger from '../utils/logger'; -import { Subscriptions, Rooms } from '../../../models'; +import { Subscriptions, Rooms } from '../../../models/server'; import { baseUrl } from '../utils/settings'; import Index from './index'; diff --git a/apps/meteor/app/cloud/server/functions/buildRegistrationData.ts b/apps/meteor/app/cloud/server/functions/buildRegistrationData.ts index 2b57931ec5cb..712795441ece 100644 --- a/apps/meteor/app/cloud/server/functions/buildRegistrationData.ts +++ b/apps/meteor/app/cloud/server/functions/buildRegistrationData.ts @@ -1,8 +1,8 @@ import { SettingValue } from '@rocket.chat/core-typings'; +import { Statistics } from '@rocket.chat/models'; import { settings } from '../../../settings/server'; import { Users } from '../../../models/server'; -import { Statistics } from '../../../models/server/raw'; import { statistics } from '../../../statistics/server'; import { LICENSE_VERSION } from '../license'; diff --git a/apps/meteor/app/cloud/server/functions/checkUserHasCloudLogin.js b/apps/meteor/app/cloud/server/functions/checkUserHasCloudLogin.js index 39743627152b..e68ff1570498 100644 --- a/apps/meteor/app/cloud/server/functions/checkUserHasCloudLogin.js +++ b/apps/meteor/app/cloud/server/functions/checkUserHasCloudLogin.js @@ -1,5 +1,5 @@ import { retrieveRegistrationStatus } from './retrieveRegistrationStatus'; -import { Users } from '../../../models'; +import { Users } from '../../../models/server'; export function checkUserHasCloudLogin(userId) { const { connectToCloud, workspaceRegistered } = retrieveRegistrationStatus(); diff --git a/apps/meteor/app/cloud/server/functions/connectWorkspace.js b/apps/meteor/app/cloud/server/functions/connectWorkspace.js index 7ca7fcbb52f9..9c2a424c3221 100644 --- a/apps/meteor/app/cloud/server/functions/connectWorkspace.js +++ b/apps/meteor/app/cloud/server/functions/connectWorkspace.js @@ -2,8 +2,8 @@ import { HTTP } from 'meteor/http'; import { getRedirectUri } from './getRedirectUri'; import { retrieveRegistrationStatus } from './retrieveRegistrationStatus'; -import { Settings } from '../../../models'; -import { settings } from '../../../settings'; +import { Settings } from '../../../models/server'; +import { settings } from '../../../settings/server'; import { saveRegistrationData } from './saveRegistrationData'; import { SystemLogger } from '../../../../server/lib/logger/system'; diff --git a/apps/meteor/app/cloud/server/functions/disconnectWorkspace.js b/apps/meteor/app/cloud/server/functions/disconnectWorkspace.js index c1e2adda876e..c1ac36729aaa 100644 --- a/apps/meteor/app/cloud/server/functions/disconnectWorkspace.js +++ b/apps/meteor/app/cloud/server/functions/disconnectWorkspace.js @@ -1,5 +1,5 @@ import { retrieveRegistrationStatus } from './retrieveRegistrationStatus'; -import { Settings } from '../../../models'; +import { Settings } from '../../../models/server'; export function disconnectWorkspace() { const { connectToCloud } = retrieveRegistrationStatus(); diff --git a/apps/meteor/app/cloud/server/functions/finishOAuthAuthorization.js b/apps/meteor/app/cloud/server/functions/finishOAuthAuthorization.js index ec0601204795..e46bfda5cfd9 100644 --- a/apps/meteor/app/cloud/server/functions/finishOAuthAuthorization.js +++ b/apps/meteor/app/cloud/server/functions/finishOAuthAuthorization.js @@ -2,8 +2,8 @@ import { Meteor } from 'meteor/meteor'; import { HTTP } from 'meteor/http'; import { getRedirectUri } from './getRedirectUri'; -import { settings } from '../../../settings'; -import { Users } from '../../../models'; +import { settings } from '../../../settings/server'; +import { Users } from '../../../models/server'; import { userScopes } from '../oauthScopes'; import { SystemLogger } from '../../../../server/lib/logger/system'; diff --git a/apps/meteor/app/cloud/server/functions/getOAuthAuthorizationUrl.js b/apps/meteor/app/cloud/server/functions/getOAuthAuthorizationUrl.js index ff1441fa0c0d..54b2df8a490c 100644 --- a/apps/meteor/app/cloud/server/functions/getOAuthAuthorizationUrl.js +++ b/apps/meteor/app/cloud/server/functions/getOAuthAuthorizationUrl.js @@ -1,8 +1,8 @@ import { Random } from 'meteor/random'; import { getRedirectUri } from './getRedirectUri'; -import { Settings } from '../../../models'; -import { settings } from '../../../settings'; +import { Settings } from '../../../models/server'; +import { settings } from '../../../settings/server'; import { userScopes } from '../oauthScopes'; export function getOAuthAuthorizationUrl() { diff --git a/apps/meteor/app/cloud/server/functions/getRedirectUri.js b/apps/meteor/app/cloud/server/functions/getRedirectUri.js index 7fd0937dab15..a836e0561711 100644 --- a/apps/meteor/app/cloud/server/functions/getRedirectUri.js +++ b/apps/meteor/app/cloud/server/functions/getRedirectUri.js @@ -1,4 +1,4 @@ -import { settings } from '../../../settings'; +import { settings } from '../../../settings/server'; export function getRedirectUri() { return `${settings.get('Site_Url')}/admin/cloud/oauth-callback`.replace(/\/\/admin+/g, '/admin'); diff --git a/apps/meteor/app/cloud/server/functions/getUserCloudAccessToken.js b/apps/meteor/app/cloud/server/functions/getUserCloudAccessToken.js index 45b7cb59359a..b187c48d6903 100644 --- a/apps/meteor/app/cloud/server/functions/getUserCloudAccessToken.js +++ b/apps/meteor/app/cloud/server/functions/getUserCloudAccessToken.js @@ -4,8 +4,8 @@ import { getRedirectUri } from './getRedirectUri'; import { retrieveRegistrationStatus } from './retrieveRegistrationStatus'; import { unregisterWorkspace } from './unregisterWorkspace'; import { userLoggedOut } from './userLoggedOut'; -import { Users } from '../../../models'; -import { settings } from '../../../settings'; +import { Users } from '../../../models/server'; +import { settings } from '../../../settings/server'; import { userScopes } from '../oauthScopes'; import { SystemLogger } from '../../../../server/lib/logger/system'; diff --git a/apps/meteor/app/cloud/server/functions/getWorkspaceAccessToken.js b/apps/meteor/app/cloud/server/functions/getWorkspaceAccessToken.js index b9e4a35694f3..b1538161cafb 100644 --- a/apps/meteor/app/cloud/server/functions/getWorkspaceAccessToken.js +++ b/apps/meteor/app/cloud/server/functions/getWorkspaceAccessToken.js @@ -1,8 +1,14 @@ import { retrieveRegistrationStatus } from './retrieveRegistrationStatus'; import { getWorkspaceAccessTokenWithScope } from './getWorkspaceAccessTokenWithScope'; -import { Settings } from '../../../models'; -import { settings } from '../../../settings'; +import { Settings } from '../../../models/server'; +import { settings } from '../../../settings/server'; +/** + * @param {boolean} forceNew + * @param {string} scope + * @param {boolean} save + * @returns string + */ export function getWorkspaceAccessToken(forceNew = false, scope = '', save = true) { const { connectToCloud, workspaceRegistered } = retrieveRegistrationStatus(); diff --git a/apps/meteor/app/cloud/server/functions/getWorkspaceAccessTokenWithScope.js b/apps/meteor/app/cloud/server/functions/getWorkspaceAccessTokenWithScope.js index 03431fed2b64..7bcdb01c92d9 100644 --- a/apps/meteor/app/cloud/server/functions/getWorkspaceAccessTokenWithScope.js +++ b/apps/meteor/app/cloud/server/functions/getWorkspaceAccessTokenWithScope.js @@ -3,7 +3,7 @@ import { HTTP } from 'meteor/http'; import { getRedirectUri } from './getRedirectUri'; import { retrieveRegistrationStatus } from './retrieveRegistrationStatus'; import { unregisterWorkspace } from './unregisterWorkspace'; -import { settings } from '../../../settings'; +import { settings } from '../../../settings/server'; import { workspaceScopes } from '../oauthScopes'; import { SystemLogger } from '../../../../server/lib/logger/system'; diff --git a/apps/meteor/app/cloud/server/functions/getWorkspaceKey.js b/apps/meteor/app/cloud/server/functions/getWorkspaceKey.js index 912163ee02e5..1984dd462208 100644 --- a/apps/meteor/app/cloud/server/functions/getWorkspaceKey.js +++ b/apps/meteor/app/cloud/server/functions/getWorkspaceKey.js @@ -1,5 +1,5 @@ import { retrieveRegistrationStatus } from './retrieveRegistrationStatus'; -import { settings } from '../../../settings'; +import { settings } from '../../../settings/server'; export function getWorkspaceKey() { const { connectToCloud, workspaceRegistered } = retrieveRegistrationStatus(); diff --git a/apps/meteor/app/cloud/server/functions/getWorkspaceLicense.js b/apps/meteor/app/cloud/server/functions/getWorkspaceLicense.js index 5940f495c37a..6e2e8300d2e5 100644 --- a/apps/meteor/app/cloud/server/functions/getWorkspaceLicense.js +++ b/apps/meteor/app/cloud/server/functions/getWorkspaceLicense.js @@ -1,8 +1,8 @@ import { HTTP } from 'meteor/http'; import { getWorkspaceAccessToken } from './getWorkspaceAccessToken'; -import { settings } from '../../../settings'; -import { Settings } from '../../../models'; +import { settings } from '../../../settings/server'; +import { Settings } from '../../../models/server'; import { callbacks } from '../../../../lib/callbacks'; import { LICENSE_VERSION } from '../license'; import { SystemLogger } from '../../../../server/lib/logger/system'; diff --git a/apps/meteor/app/cloud/server/functions/retrieveRegistrationStatus.js b/apps/meteor/app/cloud/server/functions/retrieveRegistrationStatus.js deleted file mode 100644 index 4a6134e264ab..000000000000 --- a/apps/meteor/app/cloud/server/functions/retrieveRegistrationStatus.js +++ /dev/null @@ -1,20 +0,0 @@ -import { settings } from '../../../settings'; -import { Users } from '../../../models'; - -export function retrieveRegistrationStatus() { - const info = { - connectToCloud: settings.get('Register_Server'), - workspaceRegistered: !!settings.get('Cloud_Workspace_Client_Id'), - workspaceId: settings.get('Cloud_Workspace_Id'), - uniqueId: settings.get('uniqueID'), - token: '', - email: settings.get('Organization_Email'), - }; - - if (!info.email) { - const firstUser = Users.getOldest({ emails: 1 }); - info.email = firstUser && firstUser.emails && firstUser.emails[0].address; - } - - return info; -} diff --git a/apps/meteor/app/cloud/server/functions/retrieveRegistrationStatus.ts b/apps/meteor/app/cloud/server/functions/retrieveRegistrationStatus.ts new file mode 100644 index 000000000000..d7761b0f067e --- /dev/null +++ b/apps/meteor/app/cloud/server/functions/retrieveRegistrationStatus.ts @@ -0,0 +1,27 @@ +import { settings } from '../../../settings/server'; +import { Users } from '../../../models/server'; + +export function retrieveRegistrationStatus(): { + connectToCloud: boolean; + workspaceRegistered: boolean; + workspaceId: string; + uniqueId: string; + token: string; + email: string; +} { + const info = { + connectToCloud: settings.get('Register_Server'), + workspaceRegistered: !!settings.get('Cloud_Workspace_Client_Id'), + workspaceId: settings.get('Cloud_Workspace_Id'), + uniqueId: settings.get('uniqueID'), + token: '', + email: settings.get('Organization_Email'), + }; + + if (!info.email) { + const firstUser = Users.getOldest({ emails: 1 }); + info.email = firstUser?.emails?.[0]?.address; + } + + return info; +} diff --git a/apps/meteor/app/cloud/server/functions/saveRegistrationData.js b/apps/meteor/app/cloud/server/functions/saveRegistrationData.js index 1bec537f8952..f9f5e3c05a9d 100644 --- a/apps/meteor/app/cloud/server/functions/saveRegistrationData.js +++ b/apps/meteor/app/cloud/server/functions/saveRegistrationData.js @@ -1,4 +1,5 @@ -import { Settings } from '../../../models/server/raw'; +import { Settings } from '@rocket.chat/models'; + import { callbacks } from '../../../../lib/callbacks'; export function saveRegistrationData({ diff --git a/apps/meteor/app/cloud/server/functions/startRegisterWorkspace.js b/apps/meteor/app/cloud/server/functions/startRegisterWorkspace.js index e512469248a0..9633a3835159 100644 --- a/apps/meteor/app/cloud/server/functions/startRegisterWorkspace.js +++ b/apps/meteor/app/cloud/server/functions/startRegisterWorkspace.js @@ -3,7 +3,7 @@ import { HTTP } from 'meteor/http'; import { retrieveRegistrationStatus } from './retrieveRegistrationStatus'; import { syncWorkspace } from './syncWorkspace'; import { settings } from '../../../settings/server'; -import { Settings } from '../../../models'; +import { Settings } from '../../../models/server'; import { buildWorkspaceRegistrationData } from './buildRegistrationData'; import { SystemLogger } from '../../../../server/lib/logger/system'; diff --git a/apps/meteor/app/cloud/server/functions/syncWorkspace.js b/apps/meteor/app/cloud/server/functions/syncWorkspace.js index 6424c5ea867e..ad8ec96faa49 100644 --- a/apps/meteor/app/cloud/server/functions/syncWorkspace.js +++ b/apps/meteor/app/cloud/server/functions/syncWorkspace.js @@ -4,8 +4,8 @@ import { buildWorkspaceRegistrationData } from './buildRegistrationData'; import { retrieveRegistrationStatus } from './retrieveRegistrationStatus'; import { getWorkspaceAccessToken } from './getWorkspaceAccessToken'; import { getWorkspaceLicense } from './getWorkspaceLicense'; -import { Settings } from '../../../models'; -import { settings } from '../../../settings'; +import { Settings } from '../../../models/server'; +import { settings } from '../../../settings/server'; import { getAndCreateNpsSurvey } from '../../../../server/services/nps/getAndCreateNpsSurvey'; import { NPS, Banner } from '../../../../server/sdk'; import { SystemLogger } from '../../../../server/lib/logger/system'; diff --git a/apps/meteor/app/cloud/server/functions/unregisterWorkspace.js b/apps/meteor/app/cloud/server/functions/unregisterWorkspace.js index f28a54a55153..37895e53e248 100644 --- a/apps/meteor/app/cloud/server/functions/unregisterWorkspace.js +++ b/apps/meteor/app/cloud/server/functions/unregisterWorkspace.js @@ -1,5 +1,5 @@ import { retrieveRegistrationStatus } from './retrieveRegistrationStatus'; -import { Settings } from '../../../models'; +import { Settings } from '../../../models/server'; export function unregisterWorkspace() { const { workspaceRegistered } = retrieveRegistrationStatus(); diff --git a/apps/meteor/app/cloud/server/functions/userLoggedOut.js b/apps/meteor/app/cloud/server/functions/userLoggedOut.js index 6e08b878eb6f..ce1e6c6ac17b 100644 --- a/apps/meteor/app/cloud/server/functions/userLoggedOut.js +++ b/apps/meteor/app/cloud/server/functions/userLoggedOut.js @@ -1,4 +1,4 @@ -import { Users } from '../../../models'; +import { Users } from '../../../models/server'; export function userLoggedOut(userId) { if (!userId) { diff --git a/apps/meteor/app/cloud/server/functions/userLogout.js b/apps/meteor/app/cloud/server/functions/userLogout.js index cada35f809fc..6d2e917f347d 100644 --- a/apps/meteor/app/cloud/server/functions/userLogout.js +++ b/apps/meteor/app/cloud/server/functions/userLogout.js @@ -2,8 +2,8 @@ import { HTTP } from 'meteor/http'; import { userLoggedOut } from './userLoggedOut'; import { retrieveRegistrationStatus } from './retrieveRegistrationStatus'; -import { Users } from '../../../models'; -import { settings } from '../../../settings'; +import { Users } from '../../../models/server'; +import { settings } from '../../../settings/server'; import { SystemLogger } from '../../../../server/lib/logger/system'; export function userLogout(userId) { diff --git a/apps/meteor/app/custom-oauth/server/custom_oauth_server.js b/apps/meteor/app/custom-oauth/server/custom_oauth_server.js index cb0e1ee0d3f5..25c5ef82ed88 100644 --- a/apps/meteor/app/custom-oauth/server/custom_oauth_server.js +++ b/apps/meteor/app/custom-oauth/server/custom_oauth_server.js @@ -8,7 +8,7 @@ import _ from 'underscore'; import { normalizers, fromTemplate, renameInvalidProperties } from './transform_helpers'; import { Logger } from '../../logger'; -import { Users } from '../../models'; +import { Users } from '../../models/server'; import { isURL } from '../../../lib/utils/isURL'; import { registerAccessTokenService } from '../../lib/server/oauth/oauth'; import { callbacks } from '../../../lib/callbacks'; diff --git a/apps/meteor/app/custom-sounds/server/methods/deleteCustomSound.js b/apps/meteor/app/custom-sounds/server/methods/deleteCustomSound.js index 9f935e1d3df4..1a51820ec6e8 100644 --- a/apps/meteor/app/custom-sounds/server/methods/deleteCustomSound.js +++ b/apps/meteor/app/custom-sounds/server/methods/deleteCustomSound.js @@ -1,6 +1,6 @@ import { Meteor } from 'meteor/meteor'; +import { CustomSounds } from '@rocket.chat/models'; -import { CustomSounds } from '../../../models/server/raw'; import { hasPermission } from '../../../authorization/server'; import { api } from '../../../../server/sdk/api'; import { RocketChatFileCustomSoundsInstance } from '../startup/custom-sounds'; diff --git a/apps/meteor/app/custom-sounds/server/methods/insertOrUpdateSound.js b/apps/meteor/app/custom-sounds/server/methods/insertOrUpdateSound.js index fa36d4165b2d..d5cf8ae377bc 100644 --- a/apps/meteor/app/custom-sounds/server/methods/insertOrUpdateSound.js +++ b/apps/meteor/app/custom-sounds/server/methods/insertOrUpdateSound.js @@ -1,9 +1,9 @@ import { Meteor } from 'meteor/meteor'; import s from 'underscore.string'; import { check } from 'meteor/check'; +import { CustomSounds } from '@rocket.chat/models'; import { hasPermission } from '../../../authorization/server'; -import { CustomSounds } from '../../../models/server/raw'; import { api } from '../../../../server/sdk/api'; import { RocketChatFileCustomSoundsInstance } from '../startup/custom-sounds'; diff --git a/apps/meteor/app/custom-sounds/server/methods/listCustomSounds.js b/apps/meteor/app/custom-sounds/server/methods/listCustomSounds.js index 475da52286be..c22506e42ed1 100644 --- a/apps/meteor/app/custom-sounds/server/methods/listCustomSounds.js +++ b/apps/meteor/app/custom-sounds/server/methods/listCustomSounds.js @@ -1,6 +1,5 @@ import { Meteor } from 'meteor/meteor'; - -import { CustomSounds } from '../../../models/server/raw'; +import { CustomSounds } from '@rocket.chat/models'; Meteor.methods({ async listCustomSounds() { diff --git a/apps/meteor/app/discussion/server/permissions.ts b/apps/meteor/app/discussion/server/permissions.ts index 260b2da71035..fcd2412a77ea 100644 --- a/apps/meteor/app/discussion/server/permissions.ts +++ b/apps/meteor/app/discussion/server/permissions.ts @@ -1,6 +1,5 @@ import { Meteor } from 'meteor/meteor'; - -import { Permissions } from '../../models/server/raw'; +import { Permissions } from '@rocket.chat/models'; Meteor.startup(() => { // Add permissions for discussion diff --git a/apps/meteor/app/e2e/server/methods/fetchMyKeys.js b/apps/meteor/app/e2e/server/methods/fetchMyKeys.js index f50e8578f815..744cb9cd9c62 100644 --- a/apps/meteor/app/e2e/server/methods/fetchMyKeys.js +++ b/apps/meteor/app/e2e/server/methods/fetchMyKeys.js @@ -1,6 +1,6 @@ import { Meteor } from 'meteor/meteor'; -import { Users } from '../../../models'; +import { Users } from '../../../models/server'; Meteor.methods({ 'e2e.fetchMyKeys'() { diff --git a/apps/meteor/app/e2e/server/methods/setUserPublicAndPrivateKeys.js b/apps/meteor/app/e2e/server/methods/setUserPublicAndPrivateKeys.js index ee8727794f0b..91c6f6b0fc7f 100644 --- a/apps/meteor/app/e2e/server/methods/setUserPublicAndPrivateKeys.js +++ b/apps/meteor/app/e2e/server/methods/setUserPublicAndPrivateKeys.js @@ -1,6 +1,6 @@ import { Meteor } from 'meteor/meteor'; -import { Users } from '../../../models'; +import { Users } from '../../../models/server'; Meteor.methods({ 'e2e.setUserPublicAndPrivateKeys'({ public_key, private_key }) { diff --git a/apps/meteor/app/e2e/server/methods/updateGroupKey.js b/apps/meteor/app/e2e/server/methods/updateGroupKey.js index e7276671c872..9aae29003ddf 100644 --- a/apps/meteor/app/e2e/server/methods/updateGroupKey.js +++ b/apps/meteor/app/e2e/server/methods/updateGroupKey.js @@ -1,6 +1,6 @@ import { Meteor } from 'meteor/meteor'; -import { Subscriptions } from '../../../models'; +import { Subscriptions } from '../../../models/server'; Meteor.methods({ 'e2e.updateGroupKey'(rid, uid, key) { diff --git a/apps/meteor/app/emoji-custom/server/methods/deleteEmojiCustom.js b/apps/meteor/app/emoji-custom/server/methods/deleteEmojiCustom.js index eceb0d933c31..4d26d9ca065a 100644 --- a/apps/meteor/app/emoji-custom/server/methods/deleteEmojiCustom.js +++ b/apps/meteor/app/emoji-custom/server/methods/deleteEmojiCustom.js @@ -1,8 +1,8 @@ import { Meteor } from 'meteor/meteor'; +import { EmojiCustom } from '@rocket.chat/models'; import { api } from '../../../../server/sdk/api'; import { hasPermission } from '../../../authorization'; -import { EmojiCustom } from '../../../models/server/raw'; import { RocketChatFileEmojiCustomInstance } from '../startup/emoji-custom'; Meteor.methods({ diff --git a/apps/meteor/app/emoji-custom/server/methods/insertOrUpdateEmoji.js b/apps/meteor/app/emoji-custom/server/methods/insertOrUpdateEmoji.js index b26953b1d266..96b95f3fbc6f 100644 --- a/apps/meteor/app/emoji-custom/server/methods/insertOrUpdateEmoji.js +++ b/apps/meteor/app/emoji-custom/server/methods/insertOrUpdateEmoji.js @@ -2,9 +2,9 @@ import { Meteor } from 'meteor/meteor'; import _ from 'underscore'; import s from 'underscore.string'; import limax from 'limax'; +import { EmojiCustom } from '@rocket.chat/models'; import { hasPermission } from '../../../authorization'; -import { EmojiCustom } from '../../../models/server/raw'; import { RocketChatFileEmojiCustomInstance } from '../startup/emoji-custom'; import { api } from '../../../../server/sdk/api'; diff --git a/apps/meteor/app/emoji-custom/server/methods/listEmojiCustom.js b/apps/meteor/app/emoji-custom/server/methods/listEmojiCustom.js index d66aeee1a6ad..a4fd124abe91 100644 --- a/apps/meteor/app/emoji-custom/server/methods/listEmojiCustom.js +++ b/apps/meteor/app/emoji-custom/server/methods/listEmojiCustom.js @@ -1,6 +1,5 @@ import { Meteor } from 'meteor/meteor'; - -import { EmojiCustom } from '../../../models/server/raw'; +import { EmojiCustom } from '@rocket.chat/models'; Meteor.methods({ async listEmojiCustom(options = {}) { diff --git a/apps/meteor/app/error-handler/server/lib/RocketChat.ErrorHandler.js b/apps/meteor/app/error-handler/server/lib/RocketChat.ErrorHandler.js index ac0f31e29679..d8edfd156d9d 100644 --- a/apps/meteor/app/error-handler/server/lib/RocketChat.ErrorHandler.js +++ b/apps/meteor/app/error-handler/server/lib/RocketChat.ErrorHandler.js @@ -1,7 +1,7 @@ import { Meteor } from 'meteor/meteor'; import { settings } from '../../../settings/server'; -import { Users, Rooms } from '../../../models'; +import { Users, Rooms } from '../../../models/server'; import { sendMessage } from '../../../lib'; class ErrorHandler { diff --git a/apps/meteor/app/federation-v2/server/infrastructure/rocket-chat/adapters/Room.ts b/apps/meteor/app/federation-v2/server/infrastructure/rocket-chat/adapters/Room.ts index 44ec3ee5e5ad..b948ba7234ce 100644 --- a/apps/meteor/app/federation-v2/server/infrastructure/rocket-chat/adapters/Room.ts +++ b/apps/meteor/app/federation-v2/server/infrastructure/rocket-chat/adapters/Room.ts @@ -1,9 +1,9 @@ import { ICreatedRoom, IRoom } from '@rocket.chat/core-typings'; +import { Rooms, Subscriptions } from '@rocket.chat/models'; import { MatrixBridgedRoom } from '../../../../../models/server'; import { FederatedRoom } from '../../../domain/FederatedRoom'; import { createRoom, addUserToRoom, removeUserFromRoom } from '../../../../../lib/server'; -import { Rooms, Subscriptions } from '../../../../../models/server/raw'; import { FederatedUser } from '../../../domain/FederatedUser'; export class RocketChatRoomAdapter { @@ -13,8 +13,9 @@ export class RocketChatRoomAdapter { return; } const room = await Rooms.findOneById(internalBridgedRoomId); - - return this.createFederatedRoomInstance(externalRoomId, room); + if (room) { + return this.createFederatedRoomInstance(externalRoomId, room); + } } public async getFederatedRoomByInternalId(internalRoomId: string): Promise { @@ -24,10 +25,12 @@ export class RocketChatRoomAdapter { } const room = await Rooms.findOneById(internalRoomId); - return this.createFederatedRoomInstance(externalRoomId, room); + if (room) { + return this.createFederatedRoomInstance(externalRoomId, room); + } } - public async getInternalRoomById(internalRoomId: string): Promise { + public async getInternalRoomById(internalRoomId: string): Promise { return Rooms.findOneById(internalRoomId); } diff --git a/apps/meteor/app/federation-v2/server/infrastructure/rocket-chat/adapters/Settings.ts b/apps/meteor/app/federation-v2/server/infrastructure/rocket-chat/adapters/Settings.ts index 71ff9af73461..e8432da5e742 100644 --- a/apps/meteor/app/federation-v2/server/infrastructure/rocket-chat/adapters/Settings.ts +++ b/apps/meteor/app/federation-v2/server/infrastructure/rocket-chat/adapters/Settings.ts @@ -1,7 +1,7 @@ import yaml from 'js-yaml'; import { SHA256 } from 'meteor/sha'; +import { Settings } from '@rocket.chat/models'; -import { Settings } from '../../../../../models/server/raw'; import { settings, settingsRegistry } from '../../../../../settings/server'; const EVERYTHING_REGEX = '.*'; diff --git a/apps/meteor/app/federation/server/endpoints/dispatch.js b/apps/meteor/app/federation/server/endpoints/dispatch.js index 3c841ca577a6..3e1f478ad39d 100644 --- a/apps/meteor/app/federation/server/endpoints/dispatch.js +++ b/apps/meteor/app/federation/server/endpoints/dispatch.js @@ -1,10 +1,10 @@ import { EJSON } from 'meteor/ejson'; +import { FederationServers } from '@rocket.chat/models'; import { API } from '../../../api/server'; import { serverLogger } from '../lib/logger'; import { contextDefinitions, eventTypes } from '../../../models/server/models/FederationEvents'; import { FederationRoomEvents, Messages, Rooms, Subscriptions, Users } from '../../../models/server'; -import { FederationServers } from '../../../models/server/raw'; import { normalizers } from '../normalizers'; import { deleteRoom } from '../../../lib/server/functions'; import { api } from '../../../../server/sdk/api'; diff --git a/apps/meteor/app/federation/server/endpoints/uploads.js b/apps/meteor/app/federation/server/endpoints/uploads.js index 146ac27517a4..2edbbbdb2e62 100644 --- a/apps/meteor/app/federation/server/endpoints/uploads.js +++ b/apps/meteor/app/federation/server/endpoints/uploads.js @@ -1,5 +1,6 @@ +import { Uploads } from '@rocket.chat/models'; + import { API } from '../../../api/server'; -import { Uploads } from '../../../models/server/raw'; import { FileUpload } from '../../../file-upload/server'; import { isFederationEnabled } from '../lib/isFederationEnabled'; diff --git a/apps/meteor/app/federation/server/functions/addUser.js b/apps/meteor/app/federation/server/functions/addUser.js index 314b7893fbc1..866185354d6a 100644 --- a/apps/meteor/app/federation/server/functions/addUser.js +++ b/apps/meteor/app/federation/server/functions/addUser.js @@ -1,8 +1,8 @@ import { Meteor } from 'meteor/meteor'; +import { FederationServers } from '@rocket.chat/models'; import * as federationErrors from './errors'; import { Users } from '../../../models/server'; -import { FederationServers } from '../../../models/server/raw'; import { getUserByUsername } from '../handler'; export async function addUser(query) { diff --git a/apps/meteor/app/federation/server/functions/dashboard.js b/apps/meteor/app/federation/server/functions/dashboard.js index 3868d98d821b..149e2215f73f 100644 --- a/apps/meteor/app/federation/server/functions/dashboard.js +++ b/apps/meteor/app/federation/server/functions/dashboard.js @@ -1,7 +1,7 @@ import { Meteor } from 'meteor/meteor'; +import { FederationServers } from '@rocket.chat/models'; import { FederationRoomEvents, Users } from '../../../models/server'; -import { FederationServers } from '../../../models/server/raw'; export async function getStatistics() { const numberOfEvents = FederationRoomEvents.find().count(); diff --git a/apps/meteor/app/federation/server/functions/helpers.ts b/apps/meteor/app/federation/server/functions/helpers.ts index 5d76fa4cd363..494934b6a18d 100644 --- a/apps/meteor/app/federation/server/functions/helpers.ts +++ b/apps/meteor/app/federation/server/functions/helpers.ts @@ -1,8 +1,8 @@ import { IRoom, isDirectMessageRoom } from '@rocket.chat/core-typings'; import type { ISubscription, IRegisterUser, IUser } from '@rocket.chat/core-typings'; +import { Settings } from '@rocket.chat/models'; import { Subscriptions, Users } from '../../../models/server'; -import { Settings } from '../../../models/server/raw'; import { STATUS_ENABLED, STATUS_REGISTERING } from '../constants'; export const getNameAndDomain = (fullyQualifiedName: string): string[] => fullyQualifiedName.split('@'); diff --git a/apps/meteor/app/federation/server/lib/crypt.js b/apps/meteor/app/federation/server/lib/crypt.js index 5a7685a2e9e0..4abe78248a8b 100644 --- a/apps/meteor/app/federation/server/lib/crypt.js +++ b/apps/meteor/app/federation/server/lib/crypt.js @@ -1,4 +1,5 @@ -import { FederationKeys } from '../../../models/server/raw'; +import { FederationKeys } from '@rocket.chat/models'; + import { getFederationDomain } from './getFederationDomain'; import { search } from './dns'; import { cryptLogger } from './logger'; diff --git a/apps/meteor/app/federation/server/startup/generateKeys.js b/apps/meteor/app/federation/server/startup/generateKeys.js index 5d5bbba64e00..da372335a662 100644 --- a/apps/meteor/app/federation/server/startup/generateKeys.js +++ b/apps/meteor/app/federation/server/startup/generateKeys.js @@ -1,4 +1,4 @@ -import { FederationKeys } from '../../../models/server/raw'; +import { FederationKeys } from '@rocket.chat/models'; // Create key pair if needed (async () => { diff --git a/apps/meteor/app/federation/server/startup/settings.ts b/apps/meteor/app/federation/server/startup/settings.ts index 04a9c6a49add..ee216054db04 100644 --- a/apps/meteor/app/federation/server/startup/settings.ts +++ b/apps/meteor/app/federation/server/startup/settings.ts @@ -1,3 +1,5 @@ +import { FederationKeys } from '@rocket.chat/models'; + import { settingsRegistry, settings } from '../../../settings/server'; import { updateStatus, updateEnabled, isRegisteringOrEnabled } from '../functions/helpers'; import { getFederationDomain } from '../lib/getFederationDomain'; @@ -5,7 +7,6 @@ import { getFederationDiscoveryMethod } from '../lib/getFederationDiscoveryMetho import { registerWithHub } from '../lib/dns'; import { enableCallbacks, disableCallbacks } from '../lib/callbacks'; import { setupLogger } from '../lib/logger'; -import { FederationKeys } from '../../../models/server/raw'; import { STATUS_ENABLED, STATUS_REGISTERING, STATUS_ERROR_REGISTERING, STATUS_DISABLED } from '../constants'; settingsRegistry.addGroup('Federation', function () { diff --git a/apps/meteor/app/file-upload/client/lib/fileUploadHandler.js b/apps/meteor/app/file-upload/client/lib/fileUploadHandler.js index 619cc70cb0aa..2764be6781dc 100644 --- a/apps/meteor/app/file-upload/client/lib/fileUploadHandler.js +++ b/apps/meteor/app/file-upload/client/lib/fileUploadHandler.js @@ -4,7 +4,7 @@ import { Tracker } from 'meteor/tracker'; import { UploadFS } from 'meteor/jalik:ufs'; import { FileUploadBase } from '../../lib/FileUploadBase'; -import { Uploads, Avatars } from '../../../models'; +import { Uploads, Avatars } from '../../../models/client'; new UploadFS.Store({ collection: Uploads.model, diff --git a/apps/meteor/app/file-upload/server/config/AmazonS3.js b/apps/meteor/app/file-upload/server/config/AmazonS3.js index 04f27c099da9..e265311786d6 100644 --- a/apps/meteor/app/file-upload/server/config/AmazonS3.js +++ b/apps/meteor/app/file-upload/server/config/AmazonS3.js @@ -3,7 +3,7 @@ import https from 'https'; import _ from 'underscore'; -import { settings } from '../../../settings'; +import { settings } from '../../../settings/server'; import { FileUploadClass, FileUpload } from '../lib/FileUpload'; import '../../ufs/AmazonS3/server.js'; import { SystemLogger } from '../../../../server/lib/logger/system'; diff --git a/apps/meteor/app/file-upload/server/config/GoogleStorage.js b/apps/meteor/app/file-upload/server/config/GoogleStorage.js index f3f0de3e29d8..ce900d9811aa 100644 --- a/apps/meteor/app/file-upload/server/config/GoogleStorage.js +++ b/apps/meteor/app/file-upload/server/config/GoogleStorage.js @@ -4,7 +4,7 @@ import https from 'https'; import _ from 'underscore'; import { FileUploadClass, FileUpload } from '../lib/FileUpload'; -import { settings } from '../../../settings'; +import { settings } from '../../../settings/server'; import '../../ufs/GoogleStorage/server.js'; import { SystemLogger } from '../../../../server/lib/logger/system'; diff --git a/apps/meteor/app/file-upload/server/config/Webdav.js b/apps/meteor/app/file-upload/server/config/Webdav.js index f3fe904ccc56..7ca78cad5da6 100644 --- a/apps/meteor/app/file-upload/server/config/Webdav.js +++ b/apps/meteor/app/file-upload/server/config/Webdav.js @@ -1,7 +1,7 @@ import _ from 'underscore'; import { FileUploadClass, FileUpload } from '../lib/FileUpload'; -import { settings } from '../../../settings'; +import { settings } from '../../../settings/server'; import '../../ufs/Webdav/server.js'; import { SystemLogger } from '../../../../server/lib/logger/system'; diff --git a/apps/meteor/app/file-upload/server/lib/FileUpload.js b/apps/meteor/app/file-upload/server/lib/FileUpload.js index 5bba041a6f2d..7d7afd4c8dc0 100644 --- a/apps/meteor/app/file-upload/server/lib/FileUpload.js +++ b/apps/meteor/app/file-upload/server/lib/FileUpload.js @@ -12,9 +12,9 @@ import { Match } from 'meteor/check'; import { TAPi18n } from 'meteor/rocketchat:tap-i18n'; import filesize from 'filesize'; import { AppsEngineException } from '@rocket.chat/apps-engine/definition/exceptions'; +import { Avatars, UserDataFiles, Uploads } from '@rocket.chat/models'; import { settings } from '../../../settings/server'; -import { Avatars, UserDataFiles, Uploads } from '../../../models/server/raw'; import Users from '../../../models/server/models/Users'; import Rooms from '../../../models/server/models/Rooms'; import Settings from '../../../models/server/models/Settings'; diff --git a/apps/meteor/app/file-upload/server/lib/requests.js b/apps/meteor/app/file-upload/server/lib/requests.js index e4d8bb2e36b4..87f934f4a4f3 100644 --- a/apps/meteor/app/file-upload/server/lib/requests.js +++ b/apps/meteor/app/file-upload/server/lib/requests.js @@ -1,7 +1,7 @@ import { WebApp } from 'meteor/webapp'; +import { Uploads } from '@rocket.chat/models'; import { FileUpload } from './FileUpload'; -import { Uploads } from '../../../models/server/raw'; WebApp.connectHandlers.use(FileUpload.getPath(), async function (req, res, next) { const match = /^\/([^\/]+)\/(.*)/.exec(req.url); diff --git a/apps/meteor/app/file-upload/server/methods/getS3FileUrl.js b/apps/meteor/app/file-upload/server/methods/getS3FileUrl.js index c2a05725ec72..d8780d0e9dde 100644 --- a/apps/meteor/app/file-upload/server/methods/getS3FileUrl.js +++ b/apps/meteor/app/file-upload/server/methods/getS3FileUrl.js @@ -1,8 +1,8 @@ import { Meteor } from 'meteor/meteor'; import { UploadFS } from 'meteor/jalik:ufs'; +import { Uploads } from '@rocket.chat/models'; import { settings } from '../../../settings/server'; -import { Uploads } from '../../../models/server/raw'; let protectedFiles; diff --git a/apps/meteor/app/file-upload/server/methods/sendFileMessage.ts b/apps/meteor/app/file-upload/server/methods/sendFileMessage.ts index 9bf8c0ea6129..90fc46587958 100644 --- a/apps/meteor/app/file-upload/server/methods/sendFileMessage.ts +++ b/apps/meteor/app/file-upload/server/methods/sendFileMessage.ts @@ -4,8 +4,8 @@ import { Match, check } from 'meteor/check'; import _ from 'underscore'; import { MessageAttachment, FileAttachmentProps } from '@rocket.chat/core-typings'; import type { IUser } from '@rocket.chat/core-typings'; +import { Rooms, Uploads } from '@rocket.chat/models'; -import { Rooms, Uploads } from '../../../models/server/raw'; import { callbacks } from '../../../../lib/callbacks'; import { FileUpload } from '../lib/FileUpload'; import { canAccessRoom } from '../../../authorization/server/functions/canAccessRoom'; @@ -21,6 +21,9 @@ Meteor.methods({ } const room = await Rooms.findOneById(roomId); + if (!room) { + return false; + } if (user?.type !== 'app' && !canAccessRoom(room, user)) { return false; diff --git a/apps/meteor/app/importer-pending-avatars/server/importer.js b/apps/meteor/app/importer-pending-avatars/server/importer.js index 2726cb35401b..39fb6fd8b6ae 100644 --- a/apps/meteor/app/importer-pending-avatars/server/importer.js +++ b/apps/meteor/app/importer-pending-avatars/server/importer.js @@ -1,7 +1,7 @@ import { Meteor } from 'meteor/meteor'; import { Base, ProgressStep, Selection } from '../../importer/server'; -import { Users } from '../../models'; +import { Users } from '../../models/server'; export class PendingAvatarImporter extends Base { prepareFileCount() { diff --git a/apps/meteor/app/importer-pending-files/server/importer.js b/apps/meteor/app/importer-pending-files/server/importer.js index a0f6899a3f9d..dd29caf8dc10 100644 --- a/apps/meteor/app/importer-pending-files/server/importer.js +++ b/apps/meteor/app/importer-pending-files/server/importer.js @@ -5,7 +5,7 @@ import { Meteor } from 'meteor/meteor'; import { Random } from 'meteor/random'; import { Base, ProgressStep, Selection } from '../../importer/server'; -import { Messages } from '../../models'; +import { Messages } from '../../models/server'; import { FileUpload } from '../../file-upload'; export class PendingFileImporter extends Base { diff --git a/apps/meteor/app/importer-slack-users/server/importer.js b/apps/meteor/app/importer-slack-users/server/importer.js index 9646ac79e7b3..da35a8d1bfc4 100644 --- a/apps/meteor/app/importer-slack-users/server/importer.js +++ b/apps/meteor/app/importer-slack-users/server/importer.js @@ -4,8 +4,7 @@ import { Random } from 'meteor/random'; import { RawImports, Base, ProgressStep, Selection, SelectionUser } from '../../importer/server'; import { RocketChatFile } from '../../file'; -import { Users } from '../../models'; -import { Settings as SettingsRaw } from '../../models/server'; +import { Users, Settings as SettingsRaw } from '../../models/server'; export class SlackUsersImporter extends Base { constructor(info, importRecord) { diff --git a/apps/meteor/app/importer/server/classes/ImportDataConverter.ts b/apps/meteor/app/importer/server/classes/ImportDataConverter.ts index 8c58b7a61f8d..7d44ddff18fd 100644 --- a/apps/meteor/app/importer/server/classes/ImportDataConverter.ts +++ b/apps/meteor/app/importer/server/classes/ImportDataConverter.ts @@ -13,8 +13,8 @@ import type { IUser, IUserEmail, } from '@rocket.chat/core-typings'; +import { ImportData as ImportDataRaw } from '@rocket.chat/models'; -import { ImportData as ImportDataRaw } from '../../../models/server/raw'; import { IConversionCallbacks } from '../definitions/IConversionCallbacks'; import { Users, Rooms, Subscriptions, ImportData } from '../../../models/server'; import { generateUsernameSuggestion, insertMessage, saveUserIdentity, addUserToDefaultChannels } from '../../../lib/server'; diff --git a/apps/meteor/app/importer/server/classes/ImporterBase.js b/apps/meteor/app/importer/server/classes/ImporterBase.js index fd4e7a9972c8..73ebfdd161a6 100644 --- a/apps/meteor/app/importer/server/classes/ImporterBase.js +++ b/apps/meteor/app/importer/server/classes/ImporterBase.js @@ -11,10 +11,9 @@ import { ImporterWebsocket } from './ImporterWebsocket'; import { ProgressStep } from '../../lib/ImporterProgressStep'; import { ImporterInfo } from '../../lib/ImporterInfo'; import { RawImports } from '../models/RawImports'; -import { Settings, Imports } from '../../../models'; +import { Settings, Imports, ImportData } from '../../../models/server'; import { Logger } from '../../../logger'; import { ImportDataConverter } from './ImportDataConverter'; -import { ImportData } from '../../../models/server'; import { t } from '../../../utils/server'; import { Selection, SelectionChannel, SelectionUser } from '..'; diff --git a/apps/meteor/app/importer/server/methods/getImportFileData.js b/apps/meteor/app/importer/server/methods/getImportFileData.js index 32c9aa6d0cd3..750729b39e76 100644 --- a/apps/meteor/app/importer/server/methods/getImportFileData.js +++ b/apps/meteor/app/importer/server/methods/getImportFileData.js @@ -5,7 +5,7 @@ import { Meteor } from 'meteor/meteor'; import { RocketChatImportFileInstance } from '../startup/store'; import { hasPermission } from '../../../authorization'; -import { Imports } from '../../../models'; +import { Imports } from '../../../models/server'; import { ProgressStep } from '../../lib/ImporterProgressStep'; import { Importers } from '..'; diff --git a/apps/meteor/app/importer/server/methods/getImportProgress.js b/apps/meteor/app/importer/server/methods/getImportProgress.js index 31c9b2d4a5d5..b6a157ad37f0 100644 --- a/apps/meteor/app/importer/server/methods/getImportProgress.js +++ b/apps/meteor/app/importer/server/methods/getImportProgress.js @@ -1,7 +1,7 @@ import { Meteor } from 'meteor/meteor'; import { hasPermission } from '../../../authorization'; -import { Imports } from '../../../models'; +import { Imports } from '../../../models/server'; import { Importers } from '..'; Meteor.methods({ diff --git a/apps/meteor/app/importer/server/methods/startImport.js b/apps/meteor/app/importer/server/methods/startImport.js index 45abfe5988f0..c9ef7e0a04c3 100644 --- a/apps/meteor/app/importer/server/methods/startImport.js +++ b/apps/meteor/app/importer/server/methods/startImport.js @@ -1,7 +1,7 @@ import { Meteor } from 'meteor/meteor'; import { hasPermission } from '../../../authorization'; -import { Imports } from '../../../models'; +import { Imports } from '../../../models/server'; import { Importers, Selection, SelectionChannel, SelectionUser } from '..'; Meteor.methods({ diff --git a/apps/meteor/app/importer/server/models/RawImports.js b/apps/meteor/app/importer/server/models/RawImports.js index 168b73b3e07b..470c1a4ff7cc 100644 --- a/apps/meteor/app/importer/server/models/RawImports.js +++ b/apps/meteor/app/importer/server/models/RawImports.js @@ -1,4 +1,4 @@ -import { Base } from '../../../models'; +import { Base } from '../../../models/server'; class RawImportsModel extends Base { constructor() { diff --git a/apps/meteor/app/importer/server/startup/store.js b/apps/meteor/app/importer/server/startup/store.js index 2026945ba3f2..22ba5eadce34 100644 --- a/apps/meteor/app/importer/server/startup/store.js +++ b/apps/meteor/app/importer/server/startup/store.js @@ -1,7 +1,7 @@ import { Meteor } from 'meteor/meteor'; import { RocketChatFile } from '../../../file'; -import { settings } from '../../../settings'; +import { settings } from '../../../settings/server'; export let RocketChatImportFileInstance; diff --git a/apps/meteor/app/integrations/server/api/api.js b/apps/meteor/app/integrations/server/api/api.js index 57a4c2b132bd..61ae7fe3c8cd 100644 --- a/apps/meteor/app/integrations/server/api/api.js +++ b/apps/meteor/app/integrations/server/api/api.js @@ -8,12 +8,12 @@ import Future from 'fibers/future'; import _ from 'underscore'; import s from 'underscore.string'; import moment from 'moment'; +import { Integrations } from '@rocket.chat/models'; import { incomingLogger } from '../logger'; import { processWebhookMessage } from '../../../lib/server'; import { API, APIClass, defaultRateLimiterOptions } from '../../../api/server'; import * as Models from '../../../models/server'; -import { Integrations } from '../../../models/server/raw'; import { settings } from '../../../settings/server'; const compiledScripts = {}; diff --git a/apps/meteor/app/integrations/server/lib/triggerHandler.js b/apps/meteor/app/integrations/server/lib/triggerHandler.js index bc78c8595b83..95f367621658 100644 --- a/apps/meteor/app/integrations/server/lib/triggerHandler.js +++ b/apps/meteor/app/integrations/server/lib/triggerHandler.js @@ -7,9 +7,9 @@ import s from 'underscore.string'; import moment from 'moment'; import Fiber from 'fibers'; import Future from 'fibers/future'; +import { Integrations, IntegrationHistory } from '@rocket.chat/models'; import * as Models from '../../../models/server'; -import { Integrations, IntegrationHistory } from '../../../models/server/raw'; import { settings } from '../../../settings/server'; import { getRoomByNameOrIdWithOptionToJoin, processWebhookMessage } from '../../../lib/server'; import { outgoingLogger } from '../logger'; diff --git a/apps/meteor/app/integrations/server/methods/clearIntegrationHistory.ts b/apps/meteor/app/integrations/server/methods/clearIntegrationHistory.ts index 499c8b806ac3..0c9564ea5027 100644 --- a/apps/meteor/app/integrations/server/methods/clearIntegrationHistory.ts +++ b/apps/meteor/app/integrations/server/methods/clearIntegrationHistory.ts @@ -1,7 +1,7 @@ import { Meteor } from 'meteor/meteor'; +import { Integrations, IntegrationHistory } from '@rocket.chat/models'; import { hasPermission } from '../../../authorization/server'; -import { IntegrationHistory, Integrations } from '../../../models/server/raw'; import notifications from '../../../notifications/server/lib/Notifications'; Meteor.methods({ diff --git a/apps/meteor/app/integrations/server/methods/incoming/addIncomingIntegration.ts b/apps/meteor/app/integrations/server/methods/incoming/addIncomingIntegration.ts index 43e063876a2e..c7bbdc649bff 100644 --- a/apps/meteor/app/integrations/server/methods/incoming/addIncomingIntegration.ts +++ b/apps/meteor/app/integrations/server/methods/incoming/addIncomingIntegration.ts @@ -5,10 +5,10 @@ import { Babel } from 'meteor/babel-compiler'; import _ from 'underscore'; import s from 'underscore.string'; import type { INewIncomingIntegration, IIncomingIntegration } from '@rocket.chat/core-typings'; +import { Integrations, Roles } from '@rocket.chat/models'; import { hasPermission, hasAllPermission } from '../../../../authorization/server'; import { Users, Rooms, Subscriptions } from '../../../../models/server'; -import { Integrations, Roles } from '../../../../models/server/raw'; const validChannelChars = ['@', '#']; diff --git a/apps/meteor/app/integrations/server/methods/incoming/deleteIncomingIntegration.ts b/apps/meteor/app/integrations/server/methods/incoming/deleteIncomingIntegration.ts index 81b1e719e40b..ef90340167be 100644 --- a/apps/meteor/app/integrations/server/methods/incoming/deleteIncomingIntegration.ts +++ b/apps/meteor/app/integrations/server/methods/incoming/deleteIncomingIntegration.ts @@ -1,7 +1,7 @@ import { Meteor } from 'meteor/meteor'; +import { Integrations } from '@rocket.chat/models'; import { hasPermission } from '../../../../authorization/server'; -import { Integrations } from '../../../../models/server/raw'; Meteor.methods({ async deleteIncomingIntegration(integrationId) { diff --git a/apps/meteor/app/integrations/server/methods/incoming/updateIncomingIntegration.js b/apps/meteor/app/integrations/server/methods/incoming/updateIncomingIntegration.js index 49ea3faf54ce..f3d161f53976 100644 --- a/apps/meteor/app/integrations/server/methods/incoming/updateIncomingIntegration.js +++ b/apps/meteor/app/integrations/server/methods/incoming/updateIncomingIntegration.js @@ -2,9 +2,9 @@ import { Meteor } from 'meteor/meteor'; import { Babel } from 'meteor/babel-compiler'; import _ from 'underscore'; import s from 'underscore.string'; +import { Integrations, Roles } from '@rocket.chat/models'; import { Rooms, Users, Subscriptions } from '../../../../models/server'; -import { Integrations, Roles } from '../../../../models/server/raw'; import { hasAllPermission, hasPermission } from '../../../../authorization/server'; const validChannelChars = ['@', '#']; diff --git a/apps/meteor/app/integrations/server/methods/outgoing/addOutgoingIntegration.ts b/apps/meteor/app/integrations/server/methods/outgoing/addOutgoingIntegration.ts index 8514793d9213..ee670807e3aa 100644 --- a/apps/meteor/app/integrations/server/methods/outgoing/addOutgoingIntegration.ts +++ b/apps/meteor/app/integrations/server/methods/outgoing/addOutgoingIntegration.ts @@ -1,9 +1,9 @@ import { Meteor } from 'meteor/meteor'; import { Match, check } from 'meteor/check'; import type { INewOutgoingIntegration, IOutgoingIntegration } from '@rocket.chat/core-typings'; +import { Integrations } from '@rocket.chat/models'; import { hasPermission } from '../../../../authorization/server'; -import { Integrations } from '../../../../models/server/raw'; import { validateOutgoingIntegration } from '../../lib/validateOutgoingIntegration'; Meteor.methods({ diff --git a/apps/meteor/app/integrations/server/methods/outgoing/deleteOutgoingIntegration.ts b/apps/meteor/app/integrations/server/methods/outgoing/deleteOutgoingIntegration.ts index 6926e18b1c7c..7209ae909c74 100644 --- a/apps/meteor/app/integrations/server/methods/outgoing/deleteOutgoingIntegration.ts +++ b/apps/meteor/app/integrations/server/methods/outgoing/deleteOutgoingIntegration.ts @@ -1,7 +1,7 @@ import { Meteor } from 'meteor/meteor'; +import { Integrations, IntegrationHistory } from '@rocket.chat/models'; import { hasPermission } from '../../../../authorization/server'; -import { IntegrationHistory, Integrations } from '../../../../models/server/raw'; Meteor.methods({ async deleteOutgoingIntegration(integrationId) { diff --git a/apps/meteor/app/integrations/server/methods/outgoing/replayOutgoingIntegration.ts b/apps/meteor/app/integrations/server/methods/outgoing/replayOutgoingIntegration.ts index 07e47bbf4ca5..00617c5d392b 100644 --- a/apps/meteor/app/integrations/server/methods/outgoing/replayOutgoingIntegration.ts +++ b/apps/meteor/app/integrations/server/methods/outgoing/replayOutgoingIntegration.ts @@ -1,7 +1,7 @@ import { Meteor } from 'meteor/meteor'; +import { Integrations, IntegrationHistory } from '@rocket.chat/models'; import { hasPermission } from '../../../../authorization/server'; -import { Integrations, IntegrationHistory } from '../../../../models/server/raw'; import { triggerHandler } from '../../lib/triggerHandler'; Meteor.methods({ diff --git a/apps/meteor/app/integrations/server/methods/outgoing/updateOutgoingIntegration.js b/apps/meteor/app/integrations/server/methods/outgoing/updateOutgoingIntegration.js index b357063cac9a..8ddae4b48cab 100644 --- a/apps/meteor/app/integrations/server/methods/outgoing/updateOutgoingIntegration.js +++ b/apps/meteor/app/integrations/server/methods/outgoing/updateOutgoingIntegration.js @@ -1,8 +1,8 @@ import { Meteor } from 'meteor/meteor'; +import { Integrations } from '@rocket.chat/models'; import { hasPermission } from '../../../../authorization/server'; import { Users } from '../../../../models/server'; -import { Integrations } from '../../../../models/server/raw'; import { validateOutgoingIntegration } from '../../lib/validateOutgoingIntegration'; Meteor.methods({ diff --git a/apps/meteor/app/invites/server/functions/findOrCreateInvite.js b/apps/meteor/app/invites/server/functions/findOrCreateInvite.js index 3af45671cf7d..7d17dfae9c24 100644 --- a/apps/meteor/app/invites/server/functions/findOrCreateInvite.js +++ b/apps/meteor/app/invites/server/functions/findOrCreateInvite.js @@ -1,10 +1,10 @@ import { Meteor } from 'meteor/meteor'; import { Random } from 'meteor/random'; +import { Invites } from '@rocket.chat/models'; import { hasPermission } from '../../../authorization/server'; import { api } from '../../../../server/sdk/api'; import { Subscriptions, Rooms } from '../../../models/server'; -import { Invites } from '../../../models/server/raw'; import { settings } from '../../../settings/server'; import { getURL } from '../../../utils/lib/getURL'; import { roomCoordinator } from '../../../../server/lib/rooms/roomCoordinator'; diff --git a/apps/meteor/app/invites/server/functions/listInvites.js b/apps/meteor/app/invites/server/functions/listInvites.js index 10d67435237d..9ee3fb979204 100644 --- a/apps/meteor/app/invites/server/functions/listInvites.js +++ b/apps/meteor/app/invites/server/functions/listInvites.js @@ -1,7 +1,7 @@ import { Meteor } from 'meteor/meteor'; +import { Invites } from '@rocket.chat/models'; import { hasPermission } from '../../../authorization/server'; -import { Invites } from '../../../models/server/raw'; export const listInvites = async (userId) => { if (!userId) { diff --git a/apps/meteor/app/invites/server/functions/removeInvite.js b/apps/meteor/app/invites/server/functions/removeInvite.js index 3e51ded42e4b..d79f0c644bfa 100644 --- a/apps/meteor/app/invites/server/functions/removeInvite.js +++ b/apps/meteor/app/invites/server/functions/removeInvite.js @@ -1,7 +1,7 @@ import { Meteor } from 'meteor/meteor'; +import { Invites } from '@rocket.chat/models'; import { hasPermission } from '../../../authorization'; -import { Invites } from '../../../models/server/raw'; export const removeInvite = async (userId, invite) => { if (!userId || !invite) { diff --git a/apps/meteor/app/invites/server/functions/useInviteToken.js b/apps/meteor/app/invites/server/functions/useInviteToken.js index ad020b9db251..6514ebe4e92f 100644 --- a/apps/meteor/app/invites/server/functions/useInviteToken.js +++ b/apps/meteor/app/invites/server/functions/useInviteToken.js @@ -1,7 +1,7 @@ import { Meteor } from 'meteor/meteor'; +import { Invites } from '@rocket.chat/models'; import { Users, Subscriptions } from '../../../models/server'; -import { Invites } from '../../../models/server/raw'; import { validateInviteToken } from './validateInviteToken'; import { addUserToRoom } from '../../../lib/server/functions/addUserToRoom'; import { roomCoordinator } from '../../../../server/lib/rooms/roomCoordinator'; diff --git a/apps/meteor/app/invites/server/functions/validateInviteToken.js b/apps/meteor/app/invites/server/functions/validateInviteToken.js index 99603999f5ae..623761324b30 100644 --- a/apps/meteor/app/invites/server/functions/validateInviteToken.js +++ b/apps/meteor/app/invites/server/functions/validateInviteToken.js @@ -1,6 +1,5 @@ import { Meteor } from 'meteor/meteor'; - -import { Rooms, Invites } from '../../../models/server/raw'; +import { Invites, Rooms } from '@rocket.chat/models'; export const validateInviteToken = async (token) => { if (!token || typeof token !== 'string') { diff --git a/apps/meteor/app/irc/server/irc-bridge/localHandlers/onCreateRoom.js b/apps/meteor/app/irc/server/irc-bridge/localHandlers/onCreateRoom.js index 42e01bd78b9f..07caf87bd140 100644 --- a/apps/meteor/app/irc/server/irc-bridge/localHandlers/onCreateRoom.js +++ b/apps/meteor/app/irc/server/irc-bridge/localHandlers/onCreateRoom.js @@ -1,4 +1,4 @@ -import { Users } from '../../../../models'; +import { Users } from '../../../../models/server'; export default function handleOnCreateRoom(user, room) { const users = Users.findByRoomId(room._id); diff --git a/apps/meteor/app/irc/server/irc-bridge/localHandlers/onCreateUser.js b/apps/meteor/app/irc/server/irc-bridge/localHandlers/onCreateUser.js index 851c16c628ad..5e1e9442b0e5 100644 --- a/apps/meteor/app/irc/server/irc-bridge/localHandlers/onCreateUser.js +++ b/apps/meteor/app/irc/server/irc-bridge/localHandlers/onCreateUser.js @@ -1,6 +1,6 @@ import { Meteor } from 'meteor/meteor'; -import { Users, Rooms } from '../../../../models'; +import { Users, Rooms } from '../../../../models/server'; export default function handleOnCreateUser(newUser) { if (!newUser) { diff --git a/apps/meteor/app/irc/server/irc-bridge/localHandlers/onLogin.js b/apps/meteor/app/irc/server/irc-bridge/localHandlers/onLogin.js index a10ae0950f04..7d8d350dd99d 100644 --- a/apps/meteor/app/irc/server/irc-bridge/localHandlers/onLogin.js +++ b/apps/meteor/app/irc/server/irc-bridge/localHandlers/onLogin.js @@ -1,6 +1,6 @@ import { Meteor } from 'meteor/meteor'; -import { Users, Rooms } from '../../../../models'; +import { Users, Rooms } from '../../../../models/server'; export default function handleOnLogin(login) { if (login.user === null) { diff --git a/apps/meteor/app/irc/server/irc-bridge/localHandlers/onSaveMessage.js b/apps/meteor/app/irc/server/irc-bridge/localHandlers/onSaveMessage.js index e720091d630f..c9a1499a02d0 100644 --- a/apps/meteor/app/irc/server/irc-bridge/localHandlers/onSaveMessage.js +++ b/apps/meteor/app/irc/server/irc-bridge/localHandlers/onSaveMessage.js @@ -1,5 +1,5 @@ import { SystemLogger } from '../../../../../server/lib/logger/system'; -import { Subscriptions, Users } from '../../../../models'; +import { Subscriptions, Users } from '../../../../models/server'; export default function handleOnSaveMessage(message, to) { let toIdentification = ''; diff --git a/apps/meteor/app/irc/server/irc-bridge/peerHandlers/disconnected.js b/apps/meteor/app/irc/server/irc-bridge/peerHandlers/disconnected.js index e5ed2214f05d..fc432446b5fb 100644 --- a/apps/meteor/app/irc/server/irc-bridge/peerHandlers/disconnected.js +++ b/apps/meteor/app/irc/server/irc-bridge/peerHandlers/disconnected.js @@ -1,6 +1,6 @@ import { Meteor } from 'meteor/meteor'; -import { Users } from '../../../../models'; +import { Users } from '../../../../models/server'; export default function handleQUIT(args) { const user = Users.findOne({ diff --git a/apps/meteor/app/irc/server/irc-bridge/peerHandlers/joinedChannel.js b/apps/meteor/app/irc/server/irc-bridge/peerHandlers/joinedChannel.js index 6555807b5a0b..b17009e54eb5 100644 --- a/apps/meteor/app/irc/server/irc-bridge/peerHandlers/joinedChannel.js +++ b/apps/meteor/app/irc/server/irc-bridge/peerHandlers/joinedChannel.js @@ -1,4 +1,4 @@ -import { Users, Rooms } from '../../../../models'; +import { Users, Rooms } from '../../../../models/server'; import { createRoom, addUserToRoom } from '../../../../lib'; export default function handleJoinedChannel(args) { diff --git a/apps/meteor/app/irc/server/irc-bridge/peerHandlers/leftChannel.js b/apps/meteor/app/irc/server/irc-bridge/peerHandlers/leftChannel.js index 13c29e828c46..e6b8f46f6301 100644 --- a/apps/meteor/app/irc/server/irc-bridge/peerHandlers/leftChannel.js +++ b/apps/meteor/app/irc/server/irc-bridge/peerHandlers/leftChannel.js @@ -1,4 +1,4 @@ -import { Users, Rooms } from '../../../../models'; +import { Users, Rooms } from '../../../../models/server'; import { removeUserFromRoom } from '../../../../lib'; export default function handleLeftChannel(args) { diff --git a/apps/meteor/app/irc/server/irc-bridge/peerHandlers/nickChanged.js b/apps/meteor/app/irc/server/irc-bridge/peerHandlers/nickChanged.js index 9ebc16057f3c..de2956e3302d 100644 --- a/apps/meteor/app/irc/server/irc-bridge/peerHandlers/nickChanged.js +++ b/apps/meteor/app/irc/server/irc-bridge/peerHandlers/nickChanged.js @@ -1,4 +1,4 @@ -import { Users } from '../../../../models'; +import { Users } from '../../../../models/server'; export default function handleNickChanged(args) { const user = Users.findOne({ diff --git a/apps/meteor/app/irc/server/irc-bridge/peerHandlers/sentMessage.js b/apps/meteor/app/irc/server/irc-bridge/peerHandlers/sentMessage.js index d4f4bb8ae5d6..cfad046fd725 100644 --- a/apps/meteor/app/irc/server/irc-bridge/peerHandlers/sentMessage.js +++ b/apps/meteor/app/irc/server/irc-bridge/peerHandlers/sentMessage.js @@ -1,4 +1,4 @@ -import { Users, Rooms } from '../../../../models'; +import { Users, Rooms } from '../../../../models/server'; import { sendMessage, createDirectRoom } from '../../../../lib'; /* * diff --git a/apps/meteor/app/irc/server/irc-bridge/peerHandlers/userRegistered.js b/apps/meteor/app/irc/server/irc-bridge/peerHandlers/userRegistered.js index 2f42f790e8f5..29c0dad9019d 100644 --- a/apps/meteor/app/irc/server/irc-bridge/peerHandlers/userRegistered.js +++ b/apps/meteor/app/irc/server/irc-bridge/peerHandlers/userRegistered.js @@ -1,6 +1,6 @@ import { Meteor } from 'meteor/meteor'; -import { Users } from '../../../../models'; +import { Users } from '../../../../models/server'; export default async function handleUserRegistered(args) { // Check if there is an user with the given username diff --git a/apps/meteor/app/irc/server/irc.js b/apps/meteor/app/irc/server/irc.js index dd6c4449ab01..de3638169607 100644 --- a/apps/meteor/app/irc/server/irc.js +++ b/apps/meteor/app/irc/server/irc.js @@ -1,7 +1,7 @@ import { Meteor } from 'meteor/meteor'; import Bridge from './irc-bridge'; -import { settings } from '../../settings'; +import { settings } from '../../settings/server'; if (!!settings.get('IRC_Enabled') === true) { // Normalize the config values diff --git a/apps/meteor/app/irc/server/methods/resetIrcConnection.js b/apps/meteor/app/irc/server/methods/resetIrcConnection.js index cef9299c84d8..9c033c27017f 100644 --- a/apps/meteor/app/irc/server/methods/resetIrcConnection.js +++ b/apps/meteor/app/irc/server/methods/resetIrcConnection.js @@ -1,7 +1,7 @@ import { Meteor } from 'meteor/meteor'; import { Settings } from '../../../models/server'; -import { settings } from '../../../settings'; +import { settings } from '../../../settings/server'; import Bridge from '../irc-bridge'; Meteor.methods({ diff --git a/apps/meteor/app/lib/client/methods/sendMessage.js b/apps/meteor/app/lib/client/methods/sendMessage.js index 8d3d9bd9532e..5019c6ec34a5 100644 --- a/apps/meteor/app/lib/client/methods/sendMessage.js +++ b/apps/meteor/app/lib/client/methods/sendMessage.js @@ -2,7 +2,7 @@ import { Meteor } from 'meteor/meteor'; import { TimeSync } from 'meteor/mizzao:timesync'; import s from 'underscore.string'; -import { ChatMessage, Rooms } from '../../../models'; +import { ChatMessage, Rooms } from '../../../models/client'; import { settings } from '../../../settings'; import { callbacks } from '../../../../lib/callbacks'; import { t } from '../../../utils/client'; diff --git a/apps/meteor/app/lib/server/functions/createDirectRoom.ts b/apps/meteor/app/lib/server/functions/createDirectRoom.ts index b5ad346eb9b6..1f2f454f9a7d 100644 --- a/apps/meteor/app/lib/server/functions/createDirectRoom.ts +++ b/apps/meteor/app/lib/server/functions/createDirectRoom.ts @@ -2,13 +2,13 @@ import { AppsEngineException } from '@rocket.chat/apps-engine/definition/excepti import { Meteor } from 'meteor/meteor'; import { Random } from 'meteor/random'; import type { IUser } from '@rocket.chat/core-typings'; +import { Users, Subscriptions } from '@rocket.chat/models'; import { Apps } from '../../../apps/server'; import { callbacks } from '../../../../lib/callbacks'; import { Rooms } from '../../../models/server'; import { settings } from '../../../settings/server'; import { getDefaultSubscriptionPref } from '../../../utils/server'; -import { Users, Subscriptions } from '../../../models/server/raw'; import { ICreateRoomParams } from '../../../../server/sdk/types/IRoomService'; const generateSubscription = (fname: string, name: string, user: IUser, extra: {}): any => ({ diff --git a/apps/meteor/app/lib/server/functions/deleteMessage.ts b/apps/meteor/app/lib/server/functions/deleteMessage.ts index dfb7f473a0ae..fb900d5793c7 100644 --- a/apps/meteor/app/lib/server/functions/deleteMessage.ts +++ b/apps/meteor/app/lib/server/functions/deleteMessage.ts @@ -1,10 +1,10 @@ import { Meteor } from 'meteor/meteor'; import type { IMessage, IUser } from '@rocket.chat/core-typings'; +import { Uploads } from '@rocket.chat/models'; import { FileUpload } from '../../../file-upload/server'; import { settings } from '../../../settings/server'; import { Messages, Rooms } from '../../../models/server'; -import { Uploads } from '../../../models/server/raw'; import { api } from '../../../../server/sdk/api'; import { callbacks } from '../../../../lib/callbacks'; import { Apps } from '../../../apps/server'; diff --git a/apps/meteor/app/lib/server/functions/deleteUser.ts b/apps/meteor/app/lib/server/functions/deleteUser.ts index 056b3750a2d5..568cfd370924 100644 --- a/apps/meteor/app/lib/server/functions/deleteUser.ts +++ b/apps/meteor/app/lib/server/functions/deleteUser.ts @@ -1,10 +1,10 @@ import { Meteor } from 'meteor/meteor'; import { TAPi18n } from 'meteor/rocketchat:tap-i18n'; import { FileProp } from '@rocket.chat/core-typings'; +import { Integrations, FederationServers, LivechatVisitors } from '@rocket.chat/models'; import { FileUpload } from '../../../file-upload/server'; import { Users, Subscriptions, Messages, Rooms, LivechatDepartmentAgents } from '../../../models/server'; -import { FederationServers, Integrations, LivechatVisitors } from '../../../models/server/raw'; import { settings } from '../../../settings/server'; import { updateGroupDMsName } from './updateGroupDMsName'; import { relinquishRoomOwnerships } from './relinquishRoomOwnerships'; diff --git a/apps/meteor/app/lib/server/functions/notifications/index.js b/apps/meteor/app/lib/server/functions/notifications/index.js index 16d45582614f..80ad6378df2d 100644 --- a/apps/meteor/app/lib/server/functions/notifications/index.js +++ b/apps/meteor/app/lib/server/functions/notifications/index.js @@ -3,7 +3,7 @@ import { TAPi18n } from 'meteor/rocketchat:tap-i18n'; import { escapeRegExp } from '@rocket.chat/string-helpers'; import { callbacks } from '../../../../../lib/callbacks'; -import { settings } from '../../../../settings'; +import { settings } from '../../../../settings/server'; /** * This function returns a string ready to be shown in the notification diff --git a/apps/meteor/app/lib/server/functions/notifications/mobile.js b/apps/meteor/app/lib/server/functions/notifications/mobile.js index 9c3b75cdfb28..88d125473639 100644 --- a/apps/meteor/app/lib/server/functions/notifications/mobile.js +++ b/apps/meteor/app/lib/server/functions/notifications/mobile.js @@ -1,7 +1,7 @@ import { TAPi18n } from 'meteor/rocketchat:tap-i18n'; +import { Subscriptions } from '@rocket.chat/models'; -import { settings } from '../../../../settings'; -import { Subscriptions } from '../../../../models/server/raw'; +import { settings } from '../../../../settings/server'; import { roomCoordinator } from '../../../../../server/lib/rooms/roomCoordinator'; const CATEGORY_MESSAGE = 'MESSAGE'; diff --git a/apps/meteor/app/lib/server/functions/relinquishRoomOwnerships.ts b/apps/meteor/app/lib/server/functions/relinquishRoomOwnerships.ts index 9c68ac5f9c5d..fd113c836563 100644 --- a/apps/meteor/app/lib/server/functions/relinquishRoomOwnerships.ts +++ b/apps/meteor/app/lib/server/functions/relinquishRoomOwnerships.ts @@ -1,6 +1,7 @@ +import { Roles } from '@rocket.chat/models'; + import { FileUpload } from '../../../file-upload/server'; import { Subscriptions, Messages, Rooms } from '../../../models/server'; -import { Roles } from '../../../models/server/raw'; import { SubscribedRoomsForUserWithDetails } from './getRoomsWithSingleOwner'; const bulkRoomCleanUp = (rids: string[]): unknown => { diff --git a/apps/meteor/app/lib/server/functions/saveCustomFieldsWithoutValidation.js b/apps/meteor/app/lib/server/functions/saveCustomFieldsWithoutValidation.js index aaacb5062499..17fcbbb90f45 100644 --- a/apps/meteor/app/lib/server/functions/saveCustomFieldsWithoutValidation.js +++ b/apps/meteor/app/lib/server/functions/saveCustomFieldsWithoutValidation.js @@ -1,8 +1,8 @@ import { Meteor } from 'meteor/meteor'; import s from 'underscore.string'; -import { settings } from '../../../settings'; -import { Users, Subscriptions } from '../../../models'; +import { settings } from '../../../settings/server'; +import { Users, Subscriptions } from '../../../models/server'; export const saveCustomFieldsWithoutValidation = function (userId, formData) { if (s.trim(settings.get('Accounts_CustomFields')) !== '') { diff --git a/apps/meteor/app/lib/server/functions/saveUser.js b/apps/meteor/app/lib/server/functions/saveUser.js index 771f22d4d536..5b4ca2f43c2b 100644 --- a/apps/meteor/app/lib/server/functions/saveUser.js +++ b/apps/meteor/app/lib/server/functions/saveUser.js @@ -6,7 +6,7 @@ import { Gravatar } from 'meteor/jparker:gravatar'; import * as Mailer from '../../../mailer'; import { getRoles, hasPermission } from '../../../authorization'; -import { settings } from '../../../settings'; +import { settings } from '../../../settings/server'; import { passwordPolicy } from '../lib/passwordPolicy'; import { validateEmailDomain } from '../lib'; import { getNewUserRoles } from '../../../../server/services/user/lib/getNewUserRoles'; diff --git a/apps/meteor/app/lib/server/functions/sendMessage.js b/apps/meteor/app/lib/server/functions/sendMessage.js index 9c906439ab52..e80b527573f3 100644 --- a/apps/meteor/app/lib/server/functions/sendMessage.js +++ b/apps/meteor/app/lib/server/functions/sendMessage.js @@ -1,8 +1,8 @@ import { Match, check } from 'meteor/check'; -import { settings } from '../../../settings'; +import { settings } from '../../../settings/server'; import { callbacks } from '../../../../lib/callbacks'; -import { Messages } from '../../../models'; +import { Messages } from '../../../models/server'; import { Apps } from '../../../apps/server'; import { isURL } from '../../../../lib/utils/isURL'; import { FileUpload } from '../../../file-upload/server'; diff --git a/apps/meteor/app/lib/server/functions/setRoomAvatar.ts b/apps/meteor/app/lib/server/functions/setRoomAvatar.ts index 1cd2a2442b75..d67eafd1c51c 100644 --- a/apps/meteor/app/lib/server/functions/setRoomAvatar.ts +++ b/apps/meteor/app/lib/server/functions/setRoomAvatar.ts @@ -1,10 +1,10 @@ import { Meteor } from 'meteor/meteor'; import type { IUser } from '@rocket.chat/core-typings'; +import { Avatars } from '@rocket.chat/models'; import { RocketChatFile } from '../../../file'; import { FileUpload } from '../../../file-upload/server'; import { Rooms, Messages } from '../../../models/server'; -import { Avatars } from '../../../models/server/raw'; import { api } from '../../../../server/sdk/api'; export const setRoomAvatar = async function (rid: string, dataURI: string, user: IUser): Promise { diff --git a/apps/meteor/app/lib/server/functions/setStatusText.ts b/apps/meteor/app/lib/server/functions/setStatusText.ts index 23bda1463602..3077061f48b7 100644 --- a/apps/meteor/app/lib/server/functions/setStatusText.ts +++ b/apps/meteor/app/lib/server/functions/setStatusText.ts @@ -1,9 +1,9 @@ import { Meteor } from 'meteor/meteor'; import s from 'underscore.string'; import type { IUser } from '@rocket.chat/core-typings'; +import { Users as UsersRaw } from '@rocket.chat/models'; import { Users } from '../../../models/server'; -import { Users as UsersRaw } from '../../../models/server/raw'; import { hasPermission } from '../../../authorization/server'; import { RateLimiter } from '../lib'; import { api } from '../../../../server/sdk/api'; diff --git a/apps/meteor/app/lib/server/functions/setUsername.ts b/apps/meteor/app/lib/server/functions/setUsername.ts index 71cbc2afd557..6dc5eb4b0fb1 100644 --- a/apps/meteor/app/lib/server/functions/setUsername.ts +++ b/apps/meteor/app/lib/server/functions/setUsername.ts @@ -2,10 +2,10 @@ import { Meteor } from 'meteor/meteor'; import s from 'underscore.string'; import { Accounts } from 'meteor/accounts-base'; import type { IUser } from '@rocket.chat/core-typings'; +import { Invites } from '@rocket.chat/models'; import { settings } from '../../../settings/server'; import { Users } from '../../../models/server'; -import { Invites } from '../../../models/server/raw'; import { hasPermission } from '../../../authorization/server'; import { RateLimiter } from '../lib'; import { addUserToRoom } from './addUserToRoom'; diff --git a/apps/meteor/app/lib/server/functions/validateCustomFields.js b/apps/meteor/app/lib/server/functions/validateCustomFields.js index 37e953497134..b9580ce559d6 100644 --- a/apps/meteor/app/lib/server/functions/validateCustomFields.js +++ b/apps/meteor/app/lib/server/functions/validateCustomFields.js @@ -1,7 +1,7 @@ import { Meteor } from 'meteor/meteor'; import s from 'underscore.string'; -import { settings } from '../../../settings'; +import { settings } from '../../../settings/server'; export const validateCustomFields = function (fields) { // Special Case: diff --git a/apps/meteor/app/lib/server/lib/interceptDirectReplyEmails.js b/apps/meteor/app/lib/server/lib/interceptDirectReplyEmails.js index f00b0fc5762f..8a38f73289d1 100644 --- a/apps/meteor/app/lib/server/lib/interceptDirectReplyEmails.js +++ b/apps/meteor/app/lib/server/lib/interceptDirectReplyEmails.js @@ -1,5 +1,5 @@ import { Meteor } from 'meteor/meteor'; -import POP3Lib from 'poplib'; +import POP3Lib from '@rocket.chat/poplib'; import { simpleParser } from 'mailparser'; import { settings } from '../../../settings/server'; diff --git a/apps/meteor/app/lib/server/methods/addUsersToRoom.js b/apps/meteor/app/lib/server/methods/addUsersToRoom.js index bdec86a80db5..0fd3fab71681 100644 --- a/apps/meteor/app/lib/server/methods/addUsersToRoom.js +++ b/apps/meteor/app/lib/server/methods/addUsersToRoom.js @@ -2,7 +2,7 @@ import { Meteor } from 'meteor/meteor'; import { Match } from 'meteor/check'; import { TAPi18n } from 'meteor/rocketchat:tap-i18n'; -import { Rooms, Subscriptions, Users } from '../../../models'; +import { Rooms, Subscriptions, Users } from '../../../models/server'; import { hasPermission } from '../../../authorization'; import { addUserToRoom } from '../functions'; import { api } from '../../../../server/sdk/api'; diff --git a/apps/meteor/app/lib/server/methods/filterATAllTag.js b/apps/meteor/app/lib/server/methods/filterATAllTag.js index 67ae6da78a2c..2c1d52a95093 100644 --- a/apps/meteor/app/lib/server/methods/filterATAllTag.js +++ b/apps/meteor/app/lib/server/methods/filterATAllTag.js @@ -5,7 +5,7 @@ import moment from 'moment'; import { hasPermission } from '../../../authorization'; import { callbacks } from '../../../../lib/callbacks'; -import { Users } from '../../../models'; +import { Users } from '../../../models/server'; import { api } from '../../../../server/sdk/api'; callbacks.add( diff --git a/apps/meteor/app/lib/server/methods/filterATHereTag.js b/apps/meteor/app/lib/server/methods/filterATHereTag.js index 9691c416cb82..0978520e1cdd 100644 --- a/apps/meteor/app/lib/server/methods/filterATHereTag.js +++ b/apps/meteor/app/lib/server/methods/filterATHereTag.js @@ -5,7 +5,7 @@ import moment from 'moment'; import { hasPermission } from '../../../authorization'; import { callbacks } from '../../../../lib/callbacks'; -import { Users } from '../../../models'; +import { Users } from '../../../models/server'; import { api } from '../../../../server/sdk/api'; callbacks.add( diff --git a/apps/meteor/app/lib/server/methods/leaveRoom.ts b/apps/meteor/app/lib/server/methods/leaveRoom.ts index 9db1d228e1d0..28cd11e5ad0b 100644 --- a/apps/meteor/app/lib/server/methods/leaveRoom.ts +++ b/apps/meteor/app/lib/server/methods/leaveRoom.ts @@ -1,11 +1,11 @@ import { Meteor } from 'meteor/meteor'; import { check } from 'meteor/check'; import type { IUser } from '@rocket.chat/core-typings'; +import { Roles } from '@rocket.chat/models'; import { hasPermission, hasRole } from '../../../authorization/server'; import { Subscriptions, Rooms } from '../../../models/server'; import { removeUserFromRoom } from '../functions'; -import { Roles } from '../../../models/server/raw'; import { roomCoordinator } from '../../../../server/lib/rooms/roomCoordinator'; import { RoomMemberActions } from '../../../../definition/IRoomTypeConfig'; diff --git a/apps/meteor/app/lib/server/methods/refreshOAuthService.ts b/apps/meteor/app/lib/server/methods/refreshOAuthService.ts index 466316f4ba76..b77b3e213c86 100644 --- a/apps/meteor/app/lib/server/methods/refreshOAuthService.ts +++ b/apps/meteor/app/lib/server/methods/refreshOAuthService.ts @@ -1,8 +1,8 @@ import { Meteor } from 'meteor/meteor'; import { ServiceConfiguration } from 'meteor/service-configuration'; +import { Settings } from '@rocket.chat/models'; import { hasPermission } from '../../../authorization/server'; -import { Settings } from '../../../models/server/raw'; Meteor.methods({ async refreshOAuthService() { diff --git a/apps/meteor/app/lib/server/methods/removeOAuthService.ts b/apps/meteor/app/lib/server/methods/removeOAuthService.ts index 419992e2b0e5..9ef34bf59088 100644 --- a/apps/meteor/app/lib/server/methods/removeOAuthService.ts +++ b/apps/meteor/app/lib/server/methods/removeOAuthService.ts @@ -1,9 +1,9 @@ import { capitalize } from '@rocket.chat/string-helpers'; import { Meteor } from 'meteor/meteor'; import { check } from 'meteor/check'; +import { Settings } from '@rocket.chat/models'; import { hasPermission } from '../../../authorization/server'; -import { Settings } from '../../../models/server/raw'; Meteor.methods({ async removeOAuthService(name) { diff --git a/apps/meteor/app/lib/server/methods/saveSetting.js b/apps/meteor/app/lib/server/methods/saveSetting.js index 5c24bd377bdc..4e8829fb07bc 100644 --- a/apps/meteor/app/lib/server/methods/saveSetting.js +++ b/apps/meteor/app/lib/server/methods/saveSetting.js @@ -1,10 +1,10 @@ import { Meteor } from 'meteor/meteor'; import { Match, check } from 'meteor/check'; +import { Settings } from '@rocket.chat/models'; import { hasPermission, hasAllPermission } from '../../../authorization/server'; import { getSettingPermissionId } from '../../../authorization/lib'; import { twoFactorRequired } from '../../../2fa/server/twoFactorRequired'; -import { Settings } from '../../../models/server/raw'; Meteor.methods({ saveSetting: twoFactorRequired(async function (_id, value, editor) { diff --git a/apps/meteor/app/lib/server/methods/saveSettings.js b/apps/meteor/app/lib/server/methods/saveSettings.js index 137ca376a53e..5bbfd4d2cfea 100644 --- a/apps/meteor/app/lib/server/methods/saveSettings.js +++ b/apps/meteor/app/lib/server/methods/saveSettings.js @@ -1,10 +1,10 @@ import { Meteor } from 'meteor/meteor'; import { Match, check } from 'meteor/check'; +import { Settings } from '@rocket.chat/models'; import { hasPermission } from '../../../authorization/server'; import { getSettingPermissionId } from '../../../authorization/lib'; import { twoFactorRequired } from '../../../2fa/server/twoFactorRequired'; -import { Settings } from '../../../models/server/raw'; Meteor.methods({ saveSettings: twoFactorRequired(async function (params = []) { diff --git a/apps/meteor/app/lib/server/methods/sendInvitationEmail.js b/apps/meteor/app/lib/server/methods/sendInvitationEmail.js index 89cbdce9eb97..fe33f73fe323 100644 --- a/apps/meteor/app/lib/server/methods/sendInvitationEmail.js +++ b/apps/meteor/app/lib/server/methods/sendInvitationEmail.js @@ -3,7 +3,7 @@ import { check } from 'meteor/check'; import * as Mailer from '../../../mailer'; import { hasPermission } from '../../../authorization'; -import { settings } from '../../../settings'; +import { settings } from '../../../settings/server'; import { Settings as SettingsRaw } from '../../../models/server'; let html = ''; diff --git a/apps/meteor/app/lib/server/methods/sendMessage.js b/apps/meteor/app/lib/server/methods/sendMessage.js index 3cf002ba4e0b..e5c7f4e99f13 100644 --- a/apps/meteor/app/lib/server/methods/sendMessage.js +++ b/apps/meteor/app/lib/server/methods/sendMessage.js @@ -5,7 +5,7 @@ import moment from 'moment'; import { hasPermission } from '../../../authorization'; import { metrics } from '../../../metrics'; -import { settings } from '../../../settings'; +import { settings } from '../../../settings/server'; import { messageProperties } from '../../../ui-utils'; import { Users, Messages } from '../../../models'; import { sendMessage } from '../functions'; diff --git a/apps/meteor/app/lib/server/methods/sendSMTPTestEmail.js b/apps/meteor/app/lib/server/methods/sendSMTPTestEmail.js index 56432497522d..da8648a2bce5 100644 --- a/apps/meteor/app/lib/server/methods/sendSMTPTestEmail.js +++ b/apps/meteor/app/lib/server/methods/sendSMTPTestEmail.js @@ -2,7 +2,7 @@ import { Meteor } from 'meteor/meteor'; import { DDPRateLimiter } from 'meteor/ddp-rate-limiter'; import * as Mailer from '../../../mailer'; -import { settings } from '../../../settings'; +import { settings } from '../../../settings/server'; Meteor.methods({ sendSMTPTestEmail() { diff --git a/apps/meteor/app/lib/server/methods/updateMessage.js b/apps/meteor/app/lib/server/methods/updateMessage.js index 34fec260eefc..6cbfbb34588e 100644 --- a/apps/meteor/app/lib/server/methods/updateMessage.js +++ b/apps/meteor/app/lib/server/methods/updateMessage.js @@ -2,8 +2,8 @@ import { Meteor } from 'meteor/meteor'; import { Match, check } from 'meteor/check'; import moment from 'moment'; -import { Messages } from '../../../models'; -import { settings } from '../../../settings'; +import { Messages } from '../../../models/server'; +import { settings } from '../../../settings/server'; import { hasPermission, canSendMessage } from '../../../authorization/server'; import { updateMessage } from '../functions'; diff --git a/apps/meteor/app/lib/server/oauth/proxy.js b/apps/meteor/app/lib/server/oauth/proxy.js index ef0b12c39301..1ea4db77f257 100644 --- a/apps/meteor/app/lib/server/oauth/proxy.js +++ b/apps/meteor/app/lib/server/oauth/proxy.js @@ -1,7 +1,7 @@ import _ from 'underscore'; import { OAuth } from 'meteor/oauth'; -import { settings } from '../../../settings'; +import { settings } from '../../../settings/server'; OAuth._redirectUri = _.wrap(OAuth._redirectUri, function (func, serviceName, ...args) { const proxy = settings.get('Accounts_OAuth_Proxy_services').replace(/\s/g, '').split(','); diff --git a/apps/meteor/app/lib/server/startup/robots.js b/apps/meteor/app/lib/server/startup/robots.js index 2ec4e3c19b4e..c7dbfb442462 100644 --- a/apps/meteor/app/lib/server/startup/robots.js +++ b/apps/meteor/app/lib/server/startup/robots.js @@ -1,7 +1,7 @@ import { Meteor } from 'meteor/meteor'; import { WebApp } from 'meteor/webapp'; -import { settings } from '../../../settings'; +import { settings } from '../../../settings/server'; Meteor.startup(function () { return WebApp.connectHandlers.use( diff --git a/apps/meteor/app/livechat/client/startup/notifyUnreadRooms.js b/apps/meteor/app/livechat/client/startup/notifyUnreadRooms.js index 0449754bbd18..8fe8c82ee95c 100644 --- a/apps/meteor/app/livechat/client/startup/notifyUnreadRooms.js +++ b/apps/meteor/app/livechat/client/startup/notifyUnreadRooms.js @@ -3,7 +3,7 @@ import { Tracker } from 'meteor/tracker'; import { settings } from '../../../settings'; import { getUserPreference } from '../../../utils'; -import { Subscriptions, Users } from '../../../models'; +import { Subscriptions, Users } from '../../../models/client'; import { CustomSounds } from '../../../custom-sounds/client'; let audio = null; diff --git a/apps/meteor/app/livechat/client/views/app/livechatReadOnly.js b/apps/meteor/app/livechat/client/views/app/livechatReadOnly.js index e860e67869a6..aee6b90f7ef4 100644 --- a/apps/meteor/app/livechat/client/views/app/livechatReadOnly.js +++ b/apps/meteor/app/livechat/client/views/app/livechatReadOnly.js @@ -3,7 +3,7 @@ import { Template } from 'meteor/templating'; import { ReactiveVar } from 'meteor/reactive-var'; import { FlowRouter } from 'meteor/kadira:flow-router'; -import { ChatRoom, CachedChatRoom } from '../../../../models'; +import { ChatRoom, CachedChatRoom } from '../../../../models/client'; import { callWithErrorHandling } from '../../../../../client/lib/utils/callWithErrorHandling'; import './livechatReadOnly.html'; import { APIClient } from '../../../../utils/client'; diff --git a/apps/meteor/app/livechat/client/views/app/tabbar/visitorForward.js b/apps/meteor/app/livechat/client/views/app/tabbar/visitorForward.js index 8e6c407bc03a..2c58cc34bf04 100644 --- a/apps/meteor/app/livechat/client/views/app/tabbar/visitorForward.js +++ b/apps/meteor/app/livechat/client/views/app/tabbar/visitorForward.js @@ -3,7 +3,7 @@ import { ReactiveVar } from 'meteor/reactive-var'; import { FlowRouter } from 'meteor/kadira:flow-router'; import { Template } from 'meteor/templating'; -import { ChatRoom } from '../../../../../models'; +import { ChatRoom } from '../../../../../models/client'; import { t } from '../../../../../utils'; import './visitorForward.html'; import { APIClient } from '../../../../../utils/client'; diff --git a/apps/meteor/app/livechat/client/views/app/tabbar/visitorInfo.js b/apps/meteor/app/livechat/client/views/app/tabbar/visitorInfo.js index 475987d158b2..c755006acff8 100644 --- a/apps/meteor/app/livechat/client/views/app/tabbar/visitorInfo.js +++ b/apps/meteor/app/livechat/client/views/app/tabbar/visitorInfo.js @@ -9,7 +9,7 @@ import moment from 'moment'; import UAParser from 'ua-parser-js'; import { modal } from '../../../../../ui-utils'; -import { Subscriptions } from '../../../../../models'; +import { Subscriptions } from '../../../../../models/client'; import { settings } from '../../../../../settings'; import { t } from '../../../../../utils'; import { hasRole, hasPermission, hasAtLeastOnePermission } from '../../../../../authorization'; diff --git a/apps/meteor/app/livechat/client/views/app/tabbar/visitorNavigation.js b/apps/meteor/app/livechat/client/views/app/tabbar/visitorNavigation.js index 3f5a9a77d55e..2c290f267aa1 100644 --- a/apps/meteor/app/livechat/client/views/app/tabbar/visitorNavigation.js +++ b/apps/meteor/app/livechat/client/views/app/tabbar/visitorNavigation.js @@ -3,7 +3,7 @@ import { Template } from 'meteor/templating'; import moment from 'moment'; import _ from 'underscore'; -import { ChatRoom } from '../../../../../models'; +import { ChatRoom } from '../../../../../models/client'; import { t } from '../../../../../utils'; import './visitorNavigation.html'; import { APIClient } from '../../../../../utils/client'; diff --git a/apps/meteor/app/livechat/imports/server/rest/dashboards.js b/apps/meteor/app/livechat/imports/server/rest/dashboards.js index f60ef581d42a..84ebf4f9dd04 100644 --- a/apps/meteor/app/livechat/imports/server/rest/dashboards.js +++ b/apps/meteor/app/livechat/imports/server/rest/dashboards.js @@ -13,7 +13,7 @@ import { getAgentsProductivityMetrics, getChatsMetrics, } from '../../../server/lib/analytics/dashboards'; -import { Users } from '../../../../models'; +import { Users } from '../../../../models/server'; API.v1.addRoute( 'livechat/analytics/dashboards/conversation-totalizers', diff --git a/apps/meteor/app/livechat/imports/server/rest/facebook.js b/apps/meteor/app/livechat/imports/server/rest/facebook.js index 342d99d96bf4..db8f74ea264c 100644 --- a/apps/meteor/app/livechat/imports/server/rest/facebook.js +++ b/apps/meteor/app/livechat/imports/server/rest/facebook.js @@ -1,10 +1,11 @@ import crypto from 'crypto'; import { Random } from 'meteor/random'; +import { LivechatVisitors } from '@rocket.chat/models'; import { API } from '../../../../api/server'; -import { LivechatRooms, LivechatVisitors } from '../../../../models'; -import { settings } from '../../../../settings'; +import { LivechatRooms } from '../../../../models/server'; +import { settings } from '../../../../settings/server'; import { Livechat } from '../../../server/lib/Livechat'; /** @@ -21,7 +22,7 @@ import { Livechat } from '../../../server/lib/Livechat'; * @apiParam {String} [attachments] Facebook message attachments */ API.v1.addRoute('livechat/facebook', { - post() { + async post() { if (!this.bodyParams.text && !this.bodyParams.attachments) { return { success: false, @@ -63,7 +64,7 @@ API.v1.addRoute('livechat/facebook', { }, }, }; - let visitor = LivechatVisitors.getVisitorByToken(this.bodyParams.token); + let visitor = await LivechatVisitors.getVisitorByToken(this.bodyParams.token); if (visitor) { const rooms = LivechatRooms.findOpenByVisitorToken(visitor.token).fetch(); if (rooms && rooms.length > 0) { @@ -76,12 +77,12 @@ API.v1.addRoute('livechat/facebook', { sendMessage.message.rid = Random.id(); sendMessage.message.token = this.bodyParams.token; - const userId = Livechat.registerGuest({ + const userId = await Livechat.registerGuest({ token: sendMessage.message.token, name: `${this.bodyParams.first_name} ${this.bodyParams.last_name}`, }); - visitor = LivechatVisitors.findOneById(userId); + visitor = await LivechatVisitors.findOneById(userId); } sendMessage.message.msg = this.bodyParams.text; diff --git a/apps/meteor/app/livechat/imports/server/rest/inquiries.js b/apps/meteor/app/livechat/imports/server/rest/inquiries.js index 72b077f556a3..f45542909645 100644 --- a/apps/meteor/app/livechat/imports/server/rest/inquiries.js +++ b/apps/meteor/app/livechat/imports/server/rest/inquiries.js @@ -4,7 +4,7 @@ import { LivechatInquiryStatus } from '@rocket.chat/core-typings'; import { API } from '../../../../api/server'; import { hasPermission } from '../../../../authorization'; -import { Users, LivechatDepartment, LivechatInquiry } from '../../../../models'; +import { Users, LivechatDepartment, LivechatInquiry } from '../../../../models/server'; import { findInquiries, findOneInquiryByRoomId } from '../../../server/api/lib/inquiries'; API.v1.addRoute( diff --git a/apps/meteor/app/livechat/imports/server/rest/sms.js b/apps/meteor/app/livechat/imports/server/rest/sms.js index 3447870082b8..1756325757df 100644 --- a/apps/meteor/app/livechat/imports/server/rest/sms.js +++ b/apps/meteor/app/livechat/imports/server/rest/sms.js @@ -1,9 +1,10 @@ import { Meteor } from 'meteor/meteor'; import { Random } from 'meteor/random'; import { OmnichannelSourceType } from '@rocket.chat/core-typings'; +import { LivechatVisitors } from '@rocket.chat/models'; import { FileUpload } from '../../../../file-upload/server'; -import { LivechatRooms, LivechatVisitors, LivechatDepartment } from '../../../../models/server'; +import { LivechatRooms, LivechatDepartment } from '../../../../models/server'; import { API } from '../../../../api/server'; import { fetch } from '../../../../../server/lib/http/fetch'; import { SMS } from '../../../../sms'; @@ -34,7 +35,7 @@ const defineDepartment = (idOrName) => { return department && department._id; }; -const defineVisitor = (smsNumber, targetDepartment) => { +const defineVisitor = async (smsNumber, targetDepartment) => { const visitor = LivechatVisitors.findOneVisitorByPhone(smsNumber); let data = { token: (visitor && visitor.token) || Random.id(), @@ -53,7 +54,7 @@ const defineVisitor = (smsNumber, targetDepartment) => { data.department = targetDepartment; } - const id = Livechat.registerGuest(data); + const id = await Livechat.registerGuest(data); return LivechatVisitors.findOneById(id); }; @@ -79,7 +80,7 @@ API.v1.addRoute('livechat/sms-incoming/:service', { targetDepartment = defineDepartment(SMS.department); } - const visitor = defineVisitor(sms.from, targetDepartment); + const visitor = await defineVisitor(sms.from, targetDepartment); const { token } = visitor; const room = LivechatRooms.findOneOpenByVisitorTokenAndDepartmentId(token, targetDepartment); const roomExists = !!room; diff --git a/apps/meteor/app/livechat/imports/server/rest/upload.js b/apps/meteor/app/livechat/imports/server/rest/upload.js index f6d4f1485a32..5057c5e7e006 100644 --- a/apps/meteor/app/livechat/imports/server/rest/upload.js +++ b/apps/meteor/app/livechat/imports/server/rest/upload.js @@ -1,8 +1,9 @@ import { Meteor } from 'meteor/meteor'; import filesize from 'filesize'; +import { LivechatVisitors } from '@rocket.chat/models'; import { settings } from '../../../../settings/server'; -import { Settings, LivechatRooms, LivechatVisitors } from '../../../../models'; +import { Settings, LivechatRooms } from '../../../../models/server'; import { fileUploadIsValidContentType } from '../../../../utils/server'; import { FileUpload } from '../../../../file-upload'; import { API } from '../../../../api/server'; @@ -19,13 +20,13 @@ settings.watch('FileUpload_MaxFileSize', function (value) { }); API.v1.addRoute('livechat/upload/:rid', { - post() { + async post() { if (!this.request.headers['x-visitor-token']) { return API.v1.unauthorized(); } const visitorToken = this.request.headers['x-visitor-token']; - const visitor = LivechatVisitors.getVisitorByToken(visitorToken); + const visitor = await LivechatVisitors.getVisitorByToken(visitorToken); if (!visitor) { return API.v1.unauthorized(); @@ -36,13 +37,11 @@ API.v1.addRoute('livechat/upload/:rid', { return API.v1.unauthorized(); } - const [file, fields] = Promise.await( - getUploadFormData( - { - request: this.request, - }, - { field: 'file' }, - ), + const [file, fields] = await getUploadFormData( + { + request: this.request, + }, + { field: 'file' }, ); if (!fileUploadIsValidContentType(file.mimetype)) { diff --git a/apps/meteor/app/livechat/imports/server/rest/users.js b/apps/meteor/app/livechat/imports/server/rest/users.js index 0118d8fc6551..11e3b15ac6f8 100644 --- a/apps/meteor/app/livechat/imports/server/rest/users.js +++ b/apps/meteor/app/livechat/imports/server/rest/users.js @@ -3,7 +3,7 @@ import _ from 'underscore'; import { hasPermission } from '../../../../authorization'; import { API } from '../../../../api/server'; -import { Users } from '../../../../models'; +import { Users } from '../../../../models/server'; import { Livechat } from '../../../server/lib/Livechat'; import { findAgents, findManagers } from '../../../server/api/lib/users'; diff --git a/apps/meteor/app/livechat/imports/server/rest/visitors.ts b/apps/meteor/app/livechat/imports/server/rest/visitors.ts index 1c76ff876ac7..82535e644887 100644 --- a/apps/meteor/app/livechat/imports/server/rest/visitors.ts +++ b/apps/meteor/app/livechat/imports/server/rest/visitors.ts @@ -1,9 +1,9 @@ import { check } from 'meteor/check'; import type { IMessage } from '@rocket.chat/core-typings'; +import { Messages } from '@rocket.chat/models'; import { API } from '../../../../api/server'; import { LivechatRooms } from '../../../../models/server'; -import { Messages } from '../../../../models/server/raw'; import { normalizeMessagesForUser } from '../../../../utils/server/lib/normalizeMessagesForUser'; import { canAccessRoom } from '../../../../authorization/server'; diff --git a/apps/meteor/app/livechat/server/api/lib/agents.js b/apps/meteor/app/livechat/server/api/lib/agents.js index ded51c4f8eab..15d331552d16 100644 --- a/apps/meteor/app/livechat/server/api/lib/agents.js +++ b/apps/meteor/app/livechat/server/api/lib/agents.js @@ -1,5 +1,6 @@ +import { LivechatDepartmentAgents } from '@rocket.chat/models'; + import { hasPermissionAsync } from '../../../../authorization/server/functions/hasPermission'; -import { LivechatDepartmentAgents } from '../../../../models/server/raw'; export async function findAgentDepartments({ userId, enabledDepartmentsOnly, agentId }) { if (!(await hasPermissionAsync(userId, 'view-l-room'))) { diff --git a/apps/meteor/app/livechat/server/api/lib/appearance.js b/apps/meteor/app/livechat/server/api/lib/appearance.js index 6af8612b32c1..94e6d36cef5d 100644 --- a/apps/meteor/app/livechat/server/api/lib/appearance.js +++ b/apps/meteor/app/livechat/server/api/lib/appearance.js @@ -1,5 +1,6 @@ +import { Settings } from '@rocket.chat/models'; + import { hasPermissionAsync } from '../../../../authorization/server/functions/hasPermission'; -import { Settings } from '../../../../models/server/raw'; export async function findAppearance({ userId }) { if (!(await hasPermissionAsync(userId, 'view-livechat-manager'))) { diff --git a/apps/meteor/app/livechat/server/api/lib/customFields.js b/apps/meteor/app/livechat/server/api/lib/customFields.js index ee76b6c1a91d..75397fa50a83 100644 --- a/apps/meteor/app/livechat/server/api/lib/customFields.js +++ b/apps/meteor/app/livechat/server/api/lib/customFields.js @@ -1,7 +1,7 @@ import { escapeRegExp } from '@rocket.chat/string-helpers'; +import { LivechatCustomField } from '@rocket.chat/models'; import { hasPermissionAsync } from '../../../../authorization/server/functions/hasPermission'; -import { LivechatCustomField } from '../../../../models/server/raw'; export async function findLivechatCustomFields({ userId, text, pagination: { offset, count, sort } }) { if (!(await hasPermissionAsync(userId, 'view-l-room'))) { diff --git a/apps/meteor/app/livechat/server/api/lib/departments.ts b/apps/meteor/app/livechat/server/api/lib/departments.ts index ffa00fe64d3b..39c53bad0394 100644 --- a/apps/meteor/app/livechat/server/api/lib/departments.ts +++ b/apps/meteor/app/livechat/server/api/lib/departments.ts @@ -2,9 +2,9 @@ import { FilterQuery, SortOptionObject } from 'mongodb'; import { escapeRegExp } from '@rocket.chat/string-helpers'; import type { PaginatedResult } from '@rocket.chat/rest-typings'; import type { ILivechatDepartmentRecord, ILivechatDepartmentAgents } from '@rocket.chat/core-typings'; +import { LivechatDepartment, LivechatDepartmentAgents } from '@rocket.chat/models'; import { hasPermissionAsync } from '../../../../authorization/server/functions/hasPermission'; -import { LivechatDepartment, LivechatDepartmentAgents } from '../../../../models/server/raw'; import { callbacks } from '../../../../../lib/callbacks'; type Pagination = { pagination: { offset: number; count: number; sort: SortOptionObject } }; diff --git a/apps/meteor/app/livechat/server/api/lib/inquiries.js b/apps/meteor/app/livechat/server/api/lib/inquiries.js index 2b113433fe0c..179660383342 100644 --- a/apps/meteor/app/livechat/server/api/lib/inquiries.js +++ b/apps/meteor/app/livechat/server/api/lib/inquiries.js @@ -1,5 +1,6 @@ +import { LivechatDepartmentAgents, LivechatDepartment, LivechatInquiry } from '@rocket.chat/models'; + import { hasPermissionAsync } from '../../../../authorization/server/functions/hasPermission'; -import { LivechatDepartmentAgents, LivechatDepartment, LivechatInquiry } from '../../../../models/server/raw'; const agentDepartments = async (userId) => { const agentDepartments = (await LivechatDepartmentAgents.findByAgentId(userId).toArray()).map(({ departmentId }) => departmentId); diff --git a/apps/meteor/app/livechat/server/api/lib/integrations.js b/apps/meteor/app/livechat/server/api/lib/integrations.js index 46bb09c3571c..8b90dad373e9 100644 --- a/apps/meteor/app/livechat/server/api/lib/integrations.js +++ b/apps/meteor/app/livechat/server/api/lib/integrations.js @@ -1,5 +1,6 @@ +import { Settings } from '@rocket.chat/models'; + import { hasPermissionAsync } from '../../../../authorization/server/functions/hasPermission'; -import { Settings } from '../../../../models/server/raw'; export async function findIntegrationSettings({ userId }) { if (!(await hasPermissionAsync(userId, 'view-livechat-manager'))) { diff --git a/apps/meteor/app/livechat/server/api/lib/livechat.js b/apps/meteor/app/livechat/server/api/lib/livechat.js index d324da67fe37..92de8a4ffa9b 100644 --- a/apps/meteor/app/livechat/server/api/lib/livechat.js +++ b/apps/meteor/app/livechat/server/api/lib/livechat.js @@ -1,9 +1,9 @@ import { Meteor } from 'meteor/meteor'; import { Random } from 'meteor/random'; import { TAPi18n } from 'meteor/rocketchat:tap-i18n'; +import { EmojiCustom, LivechatTrigger, LivechatVisitors } from '@rocket.chat/models'; -import { LivechatRooms, LivechatVisitors, LivechatDepartment } from '../../../../models/server'; -import { EmojiCustom, LivechatTrigger } from '../../../../models/server/raw'; +import { LivechatRooms, LivechatDepartment } from '../../../../models/server'; import { Livechat } from '../../lib/Livechat'; import { callbacks } from '../../../../../lib/callbacks'; import { normalizeAgent } from '../../lib/Helper'; @@ -40,7 +40,7 @@ export function findDepartments(businessUnit) { export function findGuest(token) { return LivechatVisitors.getVisitorByToken(token, { - fields: { + projection: { name: 1, username: 1, token: 1, diff --git a/apps/meteor/app/livechat/server/api/lib/officeHour.js b/apps/meteor/app/livechat/server/api/lib/officeHour.js index dbdadd48fe22..18512eec1df7 100644 --- a/apps/meteor/app/livechat/server/api/lib/officeHour.js +++ b/apps/meteor/app/livechat/server/api/lib/officeHour.js @@ -1,5 +1,6 @@ +import { LivechatBusinessHours } from '@rocket.chat/models'; + import { hasPermissionAsync } from '../../../../authorization/server/functions/hasPermission'; -import { LivechatBusinessHours } from '../../../../models/server/raw'; export async function findLivechatOfficeHours({ userId }) { if (!(await hasPermissionAsync(userId, 'view-livechat-business-hours'))) { diff --git a/apps/meteor/app/livechat/server/api/lib/queue.js b/apps/meteor/app/livechat/server/api/lib/queue.js index 730a8e99cc8c..8098c61ed723 100644 --- a/apps/meteor/app/livechat/server/api/lib/queue.js +++ b/apps/meteor/app/livechat/server/api/lib/queue.js @@ -1,5 +1,6 @@ +import { LivechatRooms } from '@rocket.chat/models'; + import { hasPermissionAsync } from '../../../../authorization/server/functions/hasPermission'; -import { LivechatRooms } from '../../../../models/server/raw'; export async function findQueueMetrics({ userId, agentId, includeOfflineAgents, departmentId, pagination: { offset, count, sort } }) { if (!(await hasPermissionAsync(userId, 'view-l-room'))) { diff --git a/apps/meteor/app/livechat/server/api/lib/rooms.js b/apps/meteor/app/livechat/server/api/lib/rooms.js index 3ff91ba8b257..39a8c9d0d7d3 100644 --- a/apps/meteor/app/livechat/server/api/lib/rooms.js +++ b/apps/meteor/app/livechat/server/api/lib/rooms.js @@ -1,4 +1,4 @@ -import { LivechatRooms, LivechatDepartment } from '../../../../models/server/raw'; +import { LivechatRooms, LivechatDepartment } from '@rocket.chat/models'; export async function findRooms({ agents, diff --git a/apps/meteor/app/livechat/server/api/lib/transfer.js b/apps/meteor/app/livechat/server/api/lib/transfer.js index f9f41a001b5d..e118e05e6dfb 100644 --- a/apps/meteor/app/livechat/server/api/lib/transfer.js +++ b/apps/meteor/app/livechat/server/api/lib/transfer.js @@ -1,5 +1,6 @@ +import { Messages } from '@rocket.chat/models'; + import { hasPermissionAsync } from '../../../../authorization/server/functions/hasPermission'; -import { Messages } from '../../../../models/server/raw'; const normalizeTransferHistory = ({ transferData }) => transferData; export async function findLivechatTransferHistory({ userId, rid, pagination: { offset, count, sort } }) { diff --git a/apps/meteor/app/livechat/server/api/lib/triggers.js b/apps/meteor/app/livechat/server/api/lib/triggers.js index 06d46d578cd8..9b7d94f6a892 100644 --- a/apps/meteor/app/livechat/server/api/lib/triggers.js +++ b/apps/meteor/app/livechat/server/api/lib/triggers.js @@ -1,5 +1,6 @@ +import { LivechatTrigger } from '@rocket.chat/models'; + import { hasPermissionAsync } from '../../../../authorization/server/functions/hasPermission'; -import { LivechatTrigger } from '../../../../models/server/raw'; export async function findTriggers({ userId, pagination: { offset, count, sort } }) { if (!(await hasPermissionAsync(userId, 'view-livechat-manager'))) { diff --git a/apps/meteor/app/livechat/server/api/lib/users.js b/apps/meteor/app/livechat/server/api/lib/users.js index b7c5e1e11bd7..407cf3fc5fc8 100644 --- a/apps/meteor/app/livechat/server/api/lib/users.js +++ b/apps/meteor/app/livechat/server/api/lib/users.js @@ -1,7 +1,7 @@ import { escapeRegExp } from '@rocket.chat/string-helpers'; +import { Users } from '@rocket.chat/models'; import { hasAllPermissionAsync } from '../../../../authorization/server/functions/hasPermission'; -import { Users } from '../../../../models/server/raw'; /** * @param {IRole['_id']} role the role id diff --git a/apps/meteor/app/livechat/server/api/lib/visitors.js b/apps/meteor/app/livechat/server/api/lib/visitors.js index 3fbda7c7705b..747f8858a903 100644 --- a/apps/meteor/app/livechat/server/api/lib/visitors.js +++ b/apps/meteor/app/livechat/server/api/lib/visitors.js @@ -1,5 +1,6 @@ +import { LivechatVisitors, Messages, LivechatRooms } from '@rocket.chat/models'; + import { hasPermissionAsync } from '../../../../authorization/server/functions/hasPermission'; -import { LivechatVisitors, Messages, LivechatRooms } from '../../../../models/server/raw'; import { canAccessRoomAsync } from '../../../../authorization/server/functions/canAccessRoom'; export async function findVisitorInfo({ userId, visitorId }) { diff --git a/apps/meteor/app/livechat/server/api/v1/agent.js b/apps/meteor/app/livechat/server/api/v1/agent.js index 7e2329058542..104f0bc012e3 100644 --- a/apps/meteor/app/livechat/server/api/v1/agent.js +++ b/apps/meteor/app/livechat/server/api/v1/agent.js @@ -6,14 +6,14 @@ import { findRoom, findGuest, findAgent, findOpenRoom } from '../lib/livechat'; import { Livechat } from '../../lib/Livechat'; API.v1.addRoute('livechat/agent.info/:rid/:token', { - get() { + async get() { try { check(this.urlParams, { rid: String, token: String, }); - const visitor = findGuest(this.urlParams.token); + const visitor = await findGuest(this.urlParams.token); if (!visitor) { throw new Meteor.Error('invalid-token'); } diff --git a/apps/meteor/app/livechat/server/api/v1/contact.js b/apps/meteor/app/livechat/server/api/v1/contact.js index 41a2ee9ec6d3..af43442bdcf7 100644 --- a/apps/meteor/app/livechat/server/api/v1/contact.js +++ b/apps/meteor/app/livechat/server/api/v1/contact.js @@ -1,15 +1,15 @@ import { Match, check } from 'meteor/check'; import { Meteor } from 'meteor/meteor'; +import { LivechatVisitors } from '@rocket.chat/models'; import { API } from '../../../../api/server'; import { Contacts } from '../../lib/Contacts'; -import { LivechatVisitors } from '../../../../models'; API.v1.addRoute( 'omnichannel/contact', { authRequired: true }, { - post() { + async post() { try { check(this.bodyParams, { _id: Match.Maybe(String), @@ -23,19 +23,19 @@ API.v1.addRoute( }), }); - const contact = Contacts.registerContact(this.bodyParams); + const contact = await Contacts.registerContact(this.bodyParams); return API.v1.success({ contact }); } catch (e) { return API.v1.failure(e); } }, - get() { + async get() { check(this.queryParams, { contactId: String, }); - const contact = Promise.await(LivechatVisitors.findOneById(this.queryParams.contactId)); + const contact = await LivechatVisitors.findOneById(this.queryParams.contactId); return API.v1.success({ contact }); }, @@ -46,7 +46,7 @@ API.v1.addRoute( 'omnichannel/contact.search', { authRequired: true }, { - get() { + async get() { try { check(this.queryParams, { email: Match.Maybe(String), @@ -67,7 +67,7 @@ API.v1.addRoute( }, ); - const contact = Promise.await(LivechatVisitors.findOne(query)); + const contact = await LivechatVisitors.findOne(query); return API.v1.success({ contact }); } catch (e) { return API.v1.failure(e); diff --git a/apps/meteor/app/livechat/server/api/v1/customField.js b/apps/meteor/app/livechat/server/api/v1/customField.js index b15ded04a5d0..5d242f3d00ad 100644 --- a/apps/meteor/app/livechat/server/api/v1/customField.js +++ b/apps/meteor/app/livechat/server/api/v1/customField.js @@ -7,7 +7,7 @@ import { Livechat } from '../../lib/Livechat'; import { findLivechatCustomFields, findCustomFieldById } from '../lib/customFields'; API.v1.addRoute('livechat/custom.field', { - post() { + async post() { try { check(this.bodyParams, { token: String, @@ -18,12 +18,12 @@ API.v1.addRoute('livechat/custom.field', { const { token, key, value, overwrite } = this.bodyParams; - const guest = findGuest(token); + const guest = await findGuest(token); if (!guest) { throw new Meteor.Error('invalid-token'); } - if (!Livechat.setCustomFields({ token, key, value, overwrite })) { + if (!(await Livechat.setCustomFields({ token, key, value, overwrite }))) { return API.v1.failure(); } @@ -35,7 +35,7 @@ API.v1.addRoute('livechat/custom.field', { }); API.v1.addRoute('livechat/custom.fields', { - post() { + async post() { check(this.bodyParams, { token: String, customFields: [ @@ -48,19 +48,21 @@ API.v1.addRoute('livechat/custom.fields', { }); const { token } = this.bodyParams; - const guest = findGuest(token); + const guest = await findGuest(token); if (!guest) { throw new Meteor.Error('invalid-token'); } - const fields = this.bodyParams.customFields.map((customField) => { - const data = Object.assign({ token }, customField); - if (!Livechat.setCustomFields(data)) { - return API.v1.failure(); - } + const fields = await Promise.all( + this.bodyParams.customFields.map(async (customField) => { + const data = Object.assign({ token }, customField); + if (!(await Livechat.setCustomFields(data))) { + return API.v1.failure(); + } - return { Key: customField.key, value: customField.value, overwrite: customField.overwrite }; - }); + return { Key: customField.key, value: customField.value, overwrite: customField.overwrite }; + }), + ); return API.v1.success({ fields }); }, diff --git a/apps/meteor/app/livechat/server/api/v1/message.js b/apps/meteor/app/livechat/server/api/v1/message.js index b0827d4748d7..2d57ca7f5724 100644 --- a/apps/meteor/app/livechat/server/api/v1/message.js +++ b/apps/meteor/app/livechat/server/api/v1/message.js @@ -2,8 +2,9 @@ import { Meteor } from 'meteor/meteor'; import { Match, check } from 'meteor/check'; import { Random } from 'meteor/random'; import { OmnichannelSourceType } from '@rocket.chat/core-typings'; +import { LivechatVisitors } from '@rocket.chat/models'; -import { Messages, LivechatRooms, LivechatVisitors } from '../../../../models'; +import { Messages, LivechatRooms } from '../../../../models/server'; import { hasPermission } from '../../../../authorization'; import { API } from '../../../../api/server'; import { loadMessageHistory } from '../../../../lib'; @@ -13,7 +14,7 @@ import { normalizeMessageFileUpload } from '../../../../utils/server/functions/n import { settings } from '../../../../settings/server'; API.v1.addRoute('livechat/message', { - post() { + async post() { try { check(this.bodyParams, { _id: Match.Maybe(String), @@ -28,7 +29,7 @@ API.v1.addRoute('livechat/message', { const { token, rid, agent, msg } = this.bodyParams; - const guest = findGuest(token); + const guest = await findGuest(token); if (!guest) { throw new Meteor.Error('invalid-token'); } @@ -67,7 +68,7 @@ API.v1.addRoute('livechat/message', { }, }; - const result = Promise.await(Livechat.sendMessage(sendMessage)); + const result = await Livechat.sendMessage(sendMessage); if (result) { const message = Messages.findOneById(_id); return API.v1.success({ message }); @@ -81,7 +82,7 @@ API.v1.addRoute('livechat/message', { }); API.v1.addRoute('livechat/message/:_id', { - get() { + async get() { try { check(this.urlParams, { _id: String, @@ -95,7 +96,7 @@ API.v1.addRoute('livechat/message/:_id', { const { token, rid } = this.queryParams; const { _id } = this.urlParams; - const guest = findGuest(token); + const guest = await findGuest(token); if (!guest) { throw new Meteor.Error('invalid-token'); } @@ -111,7 +112,7 @@ API.v1.addRoute('livechat/message/:_id', { } if (message.file) { - message = Promise.await(normalizeMessageFileUpload(message)); + message = await normalizeMessageFileUpload(message); } return API.v1.success({ message }); @@ -120,7 +121,7 @@ API.v1.addRoute('livechat/message/:_id', { } }, - put() { + async put() { try { check(this.urlParams, { _id: String, @@ -135,7 +136,7 @@ API.v1.addRoute('livechat/message/:_id', { const { token, rid } = this.bodyParams; const { _id } = this.urlParams; - const guest = findGuest(token); + const guest = await findGuest(token); if (!guest) { throw new Meteor.Error('invalid-token'); } @@ -157,7 +158,7 @@ API.v1.addRoute('livechat/message/:_id', { if (result) { let message = Messages.findOneById(_id); if (message.file) { - message = Promise.await(normalizeMessageFileUpload(message)); + message = await normalizeMessageFileUpload(message); } return API.v1.success({ message }); @@ -168,7 +169,7 @@ API.v1.addRoute('livechat/message/:_id', { return API.v1.failure(e); } }, - delete() { + async delete() { try { check(this.urlParams, { _id: String, @@ -182,7 +183,7 @@ API.v1.addRoute('livechat/message/:_id', { const { token, rid } = this.bodyParams; const { _id } = this.urlParams; - const guest = findGuest(token); + const guest = await findGuest(token); if (!guest) { throw new Meteor.Error('invalid-token'); } @@ -197,7 +198,7 @@ API.v1.addRoute('livechat/message/:_id', { throw new Meteor.Error('invalid-message'); } - const result = Promise.await(Livechat.deleteMessage({ guest, message })); + const result = await Livechat.deleteMessage({ guest, message }); if (result) { return API.v1.success({ message: { @@ -215,7 +216,7 @@ API.v1.addRoute('livechat/message/:_id', { }); API.v1.addRoute('livechat/messages.history/:rid', { - get() { + async get() { try { check(this.urlParams, { rid: String, @@ -230,7 +231,7 @@ API.v1.addRoute('livechat/messages.history/:rid', { throw new Meteor.Error('error-token-param-not-provided', 'The required "token" query param is missing.'); } - const guest = findGuest(token); + const guest = await findGuest(token); if (!guest) { throw new Meteor.Error('invalid-token'); } @@ -276,7 +277,7 @@ API.v1.addRoute( 'livechat/messages', { authRequired: true }, { - post() { + async post() { if (!hasPermission(this.userId, 'view-livechat-manager')) { return API.v1.unauthorized(); } @@ -299,7 +300,7 @@ API.v1.addRoute( const visitorToken = this.bodyParams.visitor.token; - let visitor = LivechatVisitors.getVisitorByToken(visitorToken); + let visitor = await LivechatVisitors.getVisitorByToken(visitorToken); let rid; if (visitor) { const rooms = LivechatRooms.findOpenByVisitorToken(visitorToken).fetch(); @@ -314,8 +315,8 @@ API.v1.addRoute( const guest = this.bodyParams.visitor; guest.connectionData = normalizeHttpHeaderData(this.request.headers); - const visitorId = Livechat.registerGuest(guest); - visitor = LivechatVisitors.findOneById(visitorId); + const visitorId = await Livechat.registerGuest(guest); + visitor = await LivechatVisitors.findOneById(visitorId); } const sentMessages = this.bodyParams.messages.map((message) => { diff --git a/apps/meteor/app/livechat/server/api/v1/room.js b/apps/meteor/app/livechat/server/api/v1/room.js index 5e3bf4636a28..6a0f991795ae 100644 --- a/apps/meteor/app/livechat/server/api/v1/room.js +++ b/apps/meteor/app/livechat/server/api/v1/room.js @@ -4,8 +4,8 @@ import { Random } from 'meteor/random'; import { TAPi18n } from 'meteor/rocketchat:tap-i18n'; import { OmnichannelSourceType } from '@rocket.chat/core-typings'; -import { settings as rcSettings } from '../../../../settings'; -import { Messages, LivechatRooms } from '../../../../models'; +import { settings as rcSettings } from '../../../../settings/server'; +import { Messages, LivechatRooms } from '../../../../models/server'; import { API } from '../../../../api/server'; import { findGuest, findRoom, getRoom, settings, findAgent, onCheckRoomParams } from '../lib/livechat'; import { Livechat } from '../../lib/Livechat'; @@ -15,7 +15,7 @@ import { canAccessRoom } from '../../../../authorization/server'; import { addUserToRoom } from '../../../../lib/server/functions'; API.v1.addRoute('livechat/room', { - get() { + async get() { const defaultCheckParams = { token: String, rid: Match.Maybe(String), @@ -28,7 +28,7 @@ API.v1.addRoute('livechat/room', { const { token, rid: roomId, agentId, ...extraParams } = this.queryParams; - const guest = findGuest(token); + const guest = await findGuest(token); if (!guest) { throw new Meteor.Error('invalid-token'); } @@ -54,7 +54,7 @@ API.v1.addRoute('livechat/room', { }, }; - room = Promise.await(getRoom({ guest, rid, agent, roomInfo, extraParams })); + room = await getRoom({ guest, rid, agent, roomInfo, extraParams }); return API.v1.success(room); } @@ -68,7 +68,7 @@ API.v1.addRoute('livechat/room', { }); API.v1.addRoute('livechat/room.close', { - post() { + async post() { try { check(this.bodyParams, { rid: String, @@ -77,7 +77,7 @@ API.v1.addRoute('livechat/room.close', { const { rid, token } = this.bodyParams; - const visitor = findGuest(token); + const visitor = await findGuest(token); if (!visitor) { throw new Meteor.Error('invalid-token'); } @@ -106,7 +106,7 @@ API.v1.addRoute('livechat/room.close', { }); API.v1.addRoute('livechat/room.transfer', { - post() { + async post() { try { check(this.bodyParams, { rid: String, @@ -116,7 +116,7 @@ API.v1.addRoute('livechat/room.transfer', { const { rid, token, department } = this.bodyParams; - const guest = findGuest(token); + const guest = await findGuest(token); if (!guest) { throw new Meteor.Error('invalid-token'); } @@ -132,7 +132,7 @@ API.v1.addRoute('livechat/room.transfer', { const { _id, username, name } = guest; const transferredBy = normalizeTransferredByData({ _id, username, name, userType: 'visitor' }, room); - if (!Promise.await(Livechat.transfer(room, guest, { roomId: rid, departmentId: department, transferredBy }))) { + if (!(await Livechat.transfer(room, guest, { roomId: rid, departmentId: department, transferredBy }))) { return API.v1.failure(); } @@ -145,7 +145,7 @@ API.v1.addRoute('livechat/room.transfer', { }); API.v1.addRoute('livechat/room.survey', { - post() { + async post() { try { check(this.bodyParams, { rid: String, @@ -160,7 +160,7 @@ API.v1.addRoute('livechat/room.survey', { const { rid, token, data } = this.bodyParams; - const visitor = findGuest(token); + const visitor = await findGuest(token); if (!visitor) { throw new Meteor.Error('invalid-token'); } @@ -170,7 +170,7 @@ API.v1.addRoute('livechat/room.survey', { throw new Meteor.Error('invalid-room'); } - const config = Promise.await(settings()); + const config = await settings(); if (!config.survey || !config.survey.items || !config.survey.values) { throw new Meteor.Error('invalid-livechat-config'); } diff --git a/apps/meteor/app/livechat/server/api/v1/transcript.js b/apps/meteor/app/livechat/server/api/v1/transcript.js index f8f3c923d25e..040bb51a0f65 100644 --- a/apps/meteor/app/livechat/server/api/v1/transcript.js +++ b/apps/meteor/app/livechat/server/api/v1/transcript.js @@ -5,7 +5,7 @@ import { API } from '../../../../api/server'; import { Livechat } from '../../lib/Livechat'; API.v1.addRoute('livechat/transcript', { - post() { + async post() { try { check(this.bodyParams, { token: String, @@ -14,7 +14,7 @@ API.v1.addRoute('livechat/transcript', { }); const { token, rid, email } = this.bodyParams; - if (!Livechat.sendTranscript({ token, rid, email })) { + if (!(await Livechat.sendTranscript({ token, rid, email }))) { return API.v1.failure({ message: TAPi18n.__('Error_sending_livechat_transcript') }); } diff --git a/apps/meteor/app/livechat/server/api/v1/transfer.js b/apps/meteor/app/livechat/server/api/v1/transfer.js index 536884726a26..b1b65e0202e4 100644 --- a/apps/meteor/app/livechat/server/api/v1/transfer.js +++ b/apps/meteor/app/livechat/server/api/v1/transfer.js @@ -1,7 +1,7 @@ import { Meteor } from 'meteor/meteor'; import { check } from 'meteor/check'; -import { LivechatRooms } from '../../../../models'; +import { LivechatRooms } from '../../../../models/server'; import { API } from '../../../../api/server'; import { findLivechatTransferHistory } from '../lib/transfer'; diff --git a/apps/meteor/app/livechat/server/api/v1/videoCall.js b/apps/meteor/app/livechat/server/api/v1/videoCall.js index b7f3e299a09d..efca6c1a06ff 100644 --- a/apps/meteor/app/livechat/server/api/v1/videoCall.js +++ b/apps/meteor/app/livechat/server/api/v1/videoCall.js @@ -4,7 +4,7 @@ import { Random } from 'meteor/random'; import { TAPi18n } from 'meteor/rocketchat:tap-i18n'; import { OmnichannelSourceType } from '@rocket.chat/core-typings'; -import { Messages, Rooms } from '../../../../models'; +import { Messages, Rooms } from '../../../../models/server'; import { settings as rcSettings } from '../../../../settings/server'; import { API } from '../../../../api/server'; import { findGuest, getRoom, settings } from '../lib/livechat'; @@ -15,7 +15,7 @@ import { Logger } from '../../../../logger'; const logger = new Logger('LivechatVideoCallApi'); API.v1.addRoute('livechat/video.call/:token', { - get() { + async get() { try { check(this.urlParams, { token: String, @@ -27,7 +27,7 @@ API.v1.addRoute('livechat/video.call/:token', { const { token } = this.urlParams; - const guest = findGuest(token); + const guest = await findGuest(token); if (!guest) { throw new Meteor.Error('invalid-token'); } @@ -40,8 +40,8 @@ API.v1.addRoute('livechat/video.call/:token', { alias: 'video-call', }, }; - const { room } = getRoom({ guest, rid, roomInfo }); - const config = Promise.await(settings()); + const { room } = await getRoom({ guest, rid, roomInfo }); + const config = await settings(); if (!config.theme || !config.theme.actionLinks || !config.theme.actionLinks.jitsi) { throw new Meteor.Error('invalid-livechat-config'); } diff --git a/apps/meteor/app/livechat/server/api/v1/visitor.ts b/apps/meteor/app/livechat/server/api/v1/visitor.ts index 0c2a23cc2e21..9226926f94a9 100644 --- a/apps/meteor/app/livechat/server/api/v1/visitor.ts +++ b/apps/meteor/app/livechat/server/api/v1/visitor.ts @@ -1,9 +1,9 @@ import { Meteor } from 'meteor/meteor'; import { Match, check } from 'meteor/check'; import type { ILivechatVisitorDTO, IRoom } from '@rocket.chat/core-typings'; +import { LivechatVisitors as VisitorsRaw } from '@rocket.chat/models'; -import { LivechatRooms, LivechatVisitors, LivechatCustomField } from '../../../../models/server'; -import { LivechatVisitors as VisitorsRaw } from '../../../../models/server/raw'; +import { LivechatRooms, LivechatCustomField } from '../../../../models/server'; import { API } from '../../../../api/server'; import { findGuest, normalizeHttpHeaderData } from '../lib/livechat'; import { Livechat } from '../../lib/Livechat'; @@ -37,7 +37,7 @@ API.v1.addRoute('livechat/visitor', { } guest.connectionData = normalizeHttpHeaderData(this.request.headers); - const visitorId = Livechat.registerGuest(guest as any); // TODO: Rewrite Livechat to TS + const visitorId = await Livechat.registerGuest(guest as any); // TODO: Rewrite Livechat to TS let visitor = await VisitorsRaw.findOneById(visitorId, {}); // If it's updating an existing visitor, it must also update the roomInfo @@ -55,7 +55,8 @@ API.v1.addRoute('livechat/visitor', { return; } const { key, value, overwrite } = field; - if (customField.scope === 'visitor' && !LivechatVisitors.updateLivechatDataByToken(token, key, value, overwrite)) { + // TODO: refactor this to use normal await + if (customField.scope === 'visitor' && !Promise.await(VisitorsRaw.updateLivechatDataByToken(token, key, value, overwrite))) { return API.v1.failure(); } }); @@ -112,7 +113,7 @@ API.v1.addRoute('livechat/visitor/:token', { } const { _id } = visitor; - const result = Livechat.removeGuest(_id); + const result = await Livechat.removeGuest(_id); if (!result) { throw new Meteor.Error('error-removing-visitor', 'An error ocurred while deleting visitor'); } @@ -156,7 +157,7 @@ API.v1.addRoute('livechat/visitor.callStatus', { }); const { token, callStatus, rid, callId } = this.bodyParams; - const guest = findGuest(token); + const guest = await findGuest(token); if (!guest) { throw new Meteor.Error('invalid-token'); } @@ -174,7 +175,7 @@ API.v1.addRoute('livechat/visitor.status', { const { token, status } = this.bodyParams; - const guest = findGuest(token); + const guest = await findGuest(token); if (!guest) { throw new Meteor.Error('invalid-token'); } diff --git a/apps/meteor/app/livechat/server/business-hour/AbstractBusinessHour.ts b/apps/meteor/app/livechat/server/business-hour/AbstractBusinessHour.ts index 66024e005ae2..eca50a9ff8d2 100644 --- a/apps/meteor/app/livechat/server/business-hour/AbstractBusinessHour.ts +++ b/apps/meteor/app/livechat/server/business-hour/AbstractBusinessHour.ts @@ -1,9 +1,9 @@ import moment from 'moment'; import type { ILivechatBusinessHour, ILivechatDepartment } from '@rocket.chat/core-typings'; +import type { ILivechatBusinessHoursModel, IUsersModel } from '@rocket.chat/model-typings'; +import { LivechatBusinessHours, Users } from '@rocket.chat/models'; -import { IWorkHoursCronJobsWrapper, LivechatBusinessHoursRaw } from '../../../models/server/raw/LivechatBusinessHours'; -import { UsersRaw } from '../../../models/server/raw/Users'; -import { LivechatBusinessHours, Users } from '../../../models/server/raw'; +import { IWorkHoursCronJobsWrapper } from '../../../../server/models/raw/LivechatBusinessHours'; export interface IBusinessHourBehavior { findHoursToCreateJobs(): Promise; @@ -27,9 +27,9 @@ export interface IBusinessHourType { } export abstract class AbstractBusinessHourBehavior { - protected BusinessHourRepository: LivechatBusinessHoursRaw = LivechatBusinessHours; + protected BusinessHourRepository: ILivechatBusinessHoursModel = LivechatBusinessHours; - protected UsersRepository: UsersRaw = Users; + protected UsersRepository: IUsersModel = Users; async findHoursToCreateJobs(): Promise { return this.BusinessHourRepository.findHoursToScheduleJobs(); @@ -54,9 +54,9 @@ export abstract class AbstractBusinessHourBehavior { } export abstract class AbstractBusinessHourType { - protected BusinessHourRepository: LivechatBusinessHoursRaw = LivechatBusinessHours; + protected BusinessHourRepository: ILivechatBusinessHoursModel = LivechatBusinessHours; - protected UsersRepository: UsersRaw = Users; + protected UsersRepository: IUsersModel = Users; protected async baseSaveBusinessHour(businessHourData: ILivechatBusinessHour): Promise { businessHourData.active = Boolean(businessHourData.active); diff --git a/apps/meteor/app/livechat/server/business-hour/BusinessHourManager.ts b/apps/meteor/app/livechat/server/business-hour/BusinessHourManager.ts index 6ea2c8be5487..cf673dc0979e 100644 --- a/apps/meteor/app/livechat/server/business-hour/BusinessHourManager.ts +++ b/apps/meteor/app/livechat/server/business-hour/BusinessHourManager.ts @@ -1,11 +1,11 @@ import moment from 'moment'; import { ILivechatBusinessHour, LivechatBusinessHourTypes } from '@rocket.chat/core-typings'; import type { ICronJobs } from '@rocket.chat/core-typings'; +import { Users } from '@rocket.chat/models'; import { IBusinessHourBehavior, IBusinessHourType } from './AbstractBusinessHour'; import { settings } from '../../../settings/server'; import { callbacks } from '../../../../lib/callbacks'; -import { Users } from '../../../models/server/raw'; const cronJobDayDict: Record = { Sunday: 0, diff --git a/apps/meteor/app/livechat/server/business-hour/Helper.ts b/apps/meteor/app/livechat/server/business-hour/Helper.ts index 98369bf58d33..89c439606b0a 100644 --- a/apps/meteor/app/livechat/server/business-hour/Helper.ts +++ b/apps/meteor/app/livechat/server/business-hour/Helper.ts @@ -1,7 +1,7 @@ import moment from 'moment'; import { ILivechatBusinessHour, LivechatBusinessHourTypes } from '@rocket.chat/core-typings'; +import { LivechatBusinessHours, Users } from '@rocket.chat/models'; -import { LivechatBusinessHours, Users } from '../../../models/server/raw'; import { createDefaultBusinessHourRow } from '../../../models/server/models/LivechatBusinessHours'; export const filterBusinessHoursThatMustBeOpened = async ( diff --git a/apps/meteor/app/livechat/server/hooks/beforeCloseRoom.js b/apps/meteor/app/livechat/server/hooks/beforeCloseRoom.js index 4604c7c0fca3..641b2bbb7b96 100644 --- a/apps/meteor/app/livechat/server/hooks/beforeCloseRoom.js +++ b/apps/meteor/app/livechat/server/hooks/beforeCloseRoom.js @@ -1,7 +1,7 @@ import { Meteor } from 'meteor/meteor'; import { callbacks } from '../../../../lib/callbacks'; -import { LivechatDepartment } from '../../../models'; +import { LivechatDepartment } from '../../../models/server'; const concatUnique = (...arrays) => [...new Set([].concat(...arrays.filter(Array.isArray)))]; diff --git a/apps/meteor/app/livechat/server/hooks/beforeDelegateAgent.js b/apps/meteor/app/livechat/server/hooks/beforeDelegateAgent.js index e93c682ee175..d7c026ff069d 100644 --- a/apps/meteor/app/livechat/server/hooks/beforeDelegateAgent.js +++ b/apps/meteor/app/livechat/server/hooks/beforeDelegateAgent.js @@ -1,6 +1,6 @@ import { callbacks } from '../../../../lib/callbacks'; -import { settings } from '../../../settings'; -import { Users, LivechatDepartmentAgents } from '../../../models'; +import { settings } from '../../../settings/server'; +import { Users, LivechatDepartmentAgents } from '../../../models/server'; callbacks.add( 'livechat.beforeDelegateAgent', diff --git a/apps/meteor/app/livechat/server/hooks/leadCapture.js b/apps/meteor/app/livechat/server/hooks/leadCapture.js index 892bcf8aade0..6a1d3b5b67b9 100644 --- a/apps/meteor/app/livechat/server/hooks/leadCapture.js +++ b/apps/meteor/app/livechat/server/hooks/leadCapture.js @@ -1,6 +1,7 @@ +import { LivechatVisitors } from '@rocket.chat/models'; + import { callbacks } from '../../../../lib/callbacks'; -import { settings } from '../../../settings'; -import { LivechatVisitors } from '../../../models'; +import { settings } from '../../../settings/server'; function validateMessage(message, room) { // skips this callback if the message was edited @@ -40,7 +41,7 @@ callbacks.add( const msgEmails = message.msg.match(emailRegexp); if (msgEmails || msgPhones) { - LivechatVisitors.saveGuestEmailPhoneById(room.v._id, msgEmails, msgPhones); + Promise.await(LivechatVisitors.saveGuestEmailPhoneById(room.v._id, msgEmails, msgPhones)); callbacks.run('livechat.leadCapture', room); } diff --git a/apps/meteor/app/livechat/server/hooks/markRoomNotResponded.js b/apps/meteor/app/livechat/server/hooks/markRoomNotResponded.js index 2503b894280c..78bf971d2889 100644 --- a/apps/meteor/app/livechat/server/hooks/markRoomNotResponded.js +++ b/apps/meteor/app/livechat/server/hooks/markRoomNotResponded.js @@ -1,5 +1,5 @@ import { callbacks } from '../../../../lib/callbacks'; -import { LivechatRooms } from '../../../models'; +import { LivechatRooms } from '../../../models/server'; callbacks.add( 'afterSaveMessage', diff --git a/apps/meteor/app/livechat/server/hooks/markRoomResponded.js b/apps/meteor/app/livechat/server/hooks/markRoomResponded.js index 5b905cfb4fe7..78049d6d3ccd 100644 --- a/apps/meteor/app/livechat/server/hooks/markRoomResponded.js +++ b/apps/meteor/app/livechat/server/hooks/markRoomResponded.js @@ -1,5 +1,5 @@ import { callbacks } from '../../../../lib/callbacks'; -import { LivechatRooms } from '../../../models'; +import { LivechatRooms } from '../../../models/server'; callbacks.add( 'afterSaveMessage', diff --git a/apps/meteor/app/livechat/server/hooks/offlineMessage.js b/apps/meteor/app/livechat/server/hooks/offlineMessage.js index 51898a917d45..4b12e9edf854 100644 --- a/apps/meteor/app/livechat/server/hooks/offlineMessage.js +++ b/apps/meteor/app/livechat/server/hooks/offlineMessage.js @@ -1,5 +1,5 @@ import { callbacks } from '../../../../lib/callbacks'; -import { settings } from '../../../settings'; +import { settings } from '../../../settings/server'; import { Livechat } from '../lib/Livechat'; callbacks.add( diff --git a/apps/meteor/app/livechat/server/hooks/offlineMessageToChannel.js b/apps/meteor/app/livechat/server/hooks/offlineMessageToChannel.js index 5ea708c470d5..83a79c6b97af 100644 --- a/apps/meteor/app/livechat/server/hooks/offlineMessageToChannel.js +++ b/apps/meteor/app/livechat/server/hooks/offlineMessageToChannel.js @@ -1,9 +1,9 @@ import { TAPi18n } from 'meteor/rocketchat:tap-i18n'; import { callbacks } from '../../../../lib/callbacks'; -import { settings } from '../../../settings'; +import { settings } from '../../../settings/server'; import { sendMessage } from '../../../lib'; -import { LivechatDepartment, Rooms, Users } from '../../../models'; +import { LivechatDepartment, Rooms, Users } from '../../../models/server'; callbacks.add( 'livechat.offlineMessage', diff --git a/apps/meteor/app/livechat/server/hooks/processRoomAbandonment.js b/apps/meteor/app/livechat/server/hooks/processRoomAbandonment.js index ebc4a018144c..e3453f6e1451 100644 --- a/apps/meteor/app/livechat/server/hooks/processRoomAbandonment.js +++ b/apps/meteor/app/livechat/server/hooks/processRoomAbandonment.js @@ -1,10 +1,10 @@ import moment from 'moment'; +import { LivechatBusinessHours, LivechatDepartment } from '@rocket.chat/models'; -import { settings } from '../../../settings'; +import { settings } from '../../../settings/server'; import { callbacks } from '../../../../lib/callbacks'; import { LivechatRooms, Messages } from '../../../models/server'; import { businessHourManager } from '../business-hour'; -import { LivechatBusinessHours, LivechatDepartment } from '../../../models/server/raw'; const getSecondsWhenOfficeHoursIsDisabled = (room, agentLastMessage) => moment(new Date(room.closedAt)).diff(moment(new Date(agentLastMessage.ts)), 'seconds'); diff --git a/apps/meteor/app/livechat/server/hooks/saveAnalyticsData.js b/apps/meteor/app/livechat/server/hooks/saveAnalyticsData.js index f4f641a474ff..fbedddc12672 100644 --- a/apps/meteor/app/livechat/server/hooks/saveAnalyticsData.js +++ b/apps/meteor/app/livechat/server/hooks/saveAnalyticsData.js @@ -1,5 +1,5 @@ import { callbacks } from '../../../../lib/callbacks'; -import { LivechatRooms } from '../../../models'; +import { LivechatRooms } from '../../../models/server'; import { normalizeMessageFileUpload } from '../../../utils/server/functions/normalizeMessageFileUpload'; callbacks.add( diff --git a/apps/meteor/app/livechat/server/hooks/saveContactLastChat.js b/apps/meteor/app/livechat/server/hooks/saveContactLastChat.js index 0d87723b7079..9745b09930e3 100644 --- a/apps/meteor/app/livechat/server/hooks/saveContactLastChat.js +++ b/apps/meteor/app/livechat/server/hooks/saveContactLastChat.js @@ -13,7 +13,7 @@ callbacks.add( _id, ts: new Date(), }; - Livechat.updateLastChat(guestId, lastChat); + Promise.await(Livechat.updateLastChat(guestId, lastChat)); }, callbacks.priority.MEDIUM, 'livechat-save-last-chat', diff --git a/apps/meteor/app/livechat/server/hooks/saveLastMessageToInquiry.ts b/apps/meteor/app/livechat/server/hooks/saveLastMessageToInquiry.ts index a5c43e7397cb..fe726a73a410 100644 --- a/apps/meteor/app/livechat/server/hooks/saveLastMessageToInquiry.ts +++ b/apps/meteor/app/livechat/server/hooks/saveLastMessageToInquiry.ts @@ -1,7 +1,7 @@ import { isOmnichannelRoom, isEditedMessage } from '@rocket.chat/core-typings'; +import { LivechatInquiry } from '@rocket.chat/models'; import { callbacks } from '../../../../lib/callbacks'; -import { LivechatInquiry } from '../../../models/server/raw'; import { settings } from '../../../settings/server'; import { RoutingManager } from '../lib/RoutingManager'; diff --git a/apps/meteor/app/livechat/server/hooks/saveLastVisitorMessageTs.js b/apps/meteor/app/livechat/server/hooks/saveLastVisitorMessageTs.js index 0748ae13e47e..40d6bd4c68d8 100644 --- a/apps/meteor/app/livechat/server/hooks/saveLastVisitorMessageTs.js +++ b/apps/meteor/app/livechat/server/hooks/saveLastVisitorMessageTs.js @@ -1,5 +1,5 @@ import { callbacks } from '../../../../lib/callbacks'; -import { LivechatRooms } from '../../../models'; +import { LivechatRooms } from '../../../models/server'; callbacks.add( 'afterSaveMessage', diff --git a/apps/meteor/app/livechat/server/hooks/sendToCRM.js b/apps/meteor/app/livechat/server/hooks/sendToCRM.js index 0e63bb6c6393..c54b761717c9 100644 --- a/apps/meteor/app/livechat/server/hooks/sendToCRM.js +++ b/apps/meteor/app/livechat/server/hooks/sendToCRM.js @@ -1,6 +1,6 @@ import { settings } from '../../../settings/server'; import { callbacks } from '../../../../lib/callbacks'; -import { Messages, LivechatRooms } from '../../../models'; +import { Messages, LivechatRooms } from '../../../models/server'; import { Livechat } from '../lib/Livechat'; import { normalizeMessageFileUpload } from '../../../utils/server/functions/normalizeMessageFileUpload'; @@ -41,7 +41,7 @@ function sendToCRM(type, room, includeMessages = true) { return room; } - const postData = Livechat.getLivechatRoomGuestInfo(room); + const postData = Promise.await(Livechat.getLivechatRoomGuestInfo(room)); postData.type = type; diff --git a/apps/meteor/app/livechat/server/hooks/sendToFacebook.js b/apps/meteor/app/livechat/server/hooks/sendToFacebook.js index 334a68c8a22f..d45f56c2b366 100644 --- a/apps/meteor/app/livechat/server/hooks/sendToFacebook.js +++ b/apps/meteor/app/livechat/server/hooks/sendToFacebook.js @@ -1,5 +1,5 @@ import { callbacks } from '../../../../lib/callbacks'; -import { settings } from '../../../settings'; +import { settings } from '../../../settings/server'; import OmniChannel from '../lib/OmniChannel'; import { normalizeMessageFileUpload } from '../../../utils/server/functions/normalizeMessageFileUpload'; diff --git a/apps/meteor/app/livechat/server/hooks/sendTranscriptOnClose.js b/apps/meteor/app/livechat/server/hooks/sendTranscriptOnClose.js index 6744d4a71bb2..597d656b2f0e 100644 --- a/apps/meteor/app/livechat/server/hooks/sendTranscriptOnClose.js +++ b/apps/meteor/app/livechat/server/hooks/sendTranscriptOnClose.js @@ -1,6 +1,6 @@ import { callbacks } from '../../../../lib/callbacks'; import { Livechat } from '../lib/Livechat'; -import { LivechatRooms } from '../../../models'; +import { LivechatRooms } from '../../../models/server'; const sendTranscriptOnClose = (room) => { const { _id: rid, transcriptRequest, v: { token } = {} } = room; @@ -9,7 +9,8 @@ const sendTranscriptOnClose = (room) => { } const { email, subject, requestedBy: user } = transcriptRequest; - Livechat.sendTranscript({ token, rid, email, subject, user }); + // TODO: refactor this to use normal await + Promise.await(Livechat.sendTranscript({ token, rid, email, subject, user })); LivechatRooms.removeTranscriptRequestByRoomId(rid); diff --git a/apps/meteor/app/livechat/server/lib/Analytics.js b/apps/meteor/app/livechat/server/lib/Analytics.js index 1974a5be1985..bd02b8af9533 100644 --- a/apps/meteor/app/livechat/server/lib/Analytics.js +++ b/apps/meteor/app/livechat/server/lib/Analytics.js @@ -1,8 +1,8 @@ import { TAPi18n } from 'meteor/rocketchat:tap-i18n'; import moment from 'moment'; +import { LivechatRooms as LivechatRoomsRaw } from '@rocket.chat/models'; -import { LivechatRooms } from '../../../models'; -import { LivechatRooms as LivechatRoomsRaw } from '../../../models/server/raw'; +import { LivechatRooms } from '../../../models/server'; import { secondsToHHMMSS } from '../../../utils/server'; import { getTimezone } from '../../../utils/server/lib/getTimezone'; import { Logger } from '../../../logger'; diff --git a/apps/meteor/app/livechat/server/lib/Contacts.js b/apps/meteor/app/livechat/server/lib/Contacts.js index 24909685e6a9..df4b05a9904f 100644 --- a/apps/meteor/app/livechat/server/lib/Contacts.js +++ b/apps/meteor/app/livechat/server/lib/Contacts.js @@ -1,19 +1,19 @@ import { check } from 'meteor/check'; import { Meteor } from 'meteor/meteor'; import s from 'underscore.string'; +import { LivechatVisitors, Users } from '@rocket.chat/models'; -import { LivechatVisitors, LivechatCustomField, LivechatRooms, Rooms, LivechatInquiry, Subscriptions } from '../../../models'; -import { Users } from '../../../models/server/raw'; +import { LivechatCustomField, LivechatRooms, Rooms, LivechatInquiry, Subscriptions } from '../../../models/server'; export const Contacts = { - registerContact({ token, name, email, phone, username, customFields = {}, contactManager = {} } = {}) { + async registerContact({ token, name, email, phone, username, customFields = {}, contactManager = {} } = {}) { check(token, String); const visitorEmail = s.trim(email).toLowerCase(); if (contactManager?.username) { // verify if the user exists with this username and has a livechat-agent role - const user = Promise.await(Users.findOneByUsername(contactManager.username, { projection: { roles: 1 } })); + const user = await Users.findOneByUsername(contactManager.username, { projection: { roles: 1 } }); if (!user) { throw new Meteor.Error('error-contact-manager-not-found', `No user found with username ${contactManager.username}`); } @@ -29,18 +29,18 @@ export const Contacts = { }, }; - const user = LivechatVisitors.getVisitorByToken(token, { fields: { _id: 1 } }); + const user = await LivechatVisitors.getVisitorByToken(token, { projection: { _id: 1 } }); if (user) { contactId = user._id; } else { if (!username) { - username = LivechatVisitors.getNextVisitorUsername(); + username = await LivechatVisitors.getNextVisitorUsername(); } let existingUser = null; - if (visitorEmail !== '' && (existingUser = LivechatVisitors.findOneGuestByEmailAddress(visitorEmail))) { + if (visitorEmail !== '' && (existingUser = await LivechatVisitors.findOneGuestByEmailAddress(visitorEmail))) { contactId = existingUser._id; } else { const userData = { @@ -48,7 +48,7 @@ export const Contacts = { ts: new Date(), }; - contactId = LivechatVisitors.insert(userData); + contactId = await LivechatVisitors.insertOne(userData); } } @@ -68,7 +68,7 @@ export const Contacts = { updateUser.$set.livechatData = livechatData; updateUser.$set.contactManager = (contactManager?.username && { username: contactManager.username }) || null; - LivechatVisitors.updateById(contactId, updateUser); + await LivechatVisitors.updateById(contactId, updateUser); const rooms = LivechatRooms.findByVisitorId(contactId).fetch(); diff --git a/apps/meteor/app/livechat/server/lib/Helper.js b/apps/meteor/app/livechat/server/lib/Helper.js index cf43982f9242..3a51f2343d1e 100644 --- a/apps/meteor/app/livechat/server/lib/Helper.js +++ b/apps/meteor/app/livechat/server/lib/Helper.js @@ -19,7 +19,7 @@ import { Livechat } from './Livechat'; import { RoutingManager } from './RoutingManager'; import { callbacks } from '../../../../lib/callbacks'; import { Logger } from '../../../logger'; -import { settings } from '../../../settings'; +import { settings } from '../../../settings/server'; import { Apps, AppEvents } from '../../../apps/server'; import notifications from '../../../notifications/server/lib/Notifications'; import { sendNotification } from '../../../lib/server'; @@ -531,7 +531,7 @@ export const forwardRoomToDepartment = async (room, guest, transferData) => { } const { token } = guest; - Livechat.setDepartmentForGuest({ token, department: departmentId }); + await Livechat.setDepartmentForGuest({ token, department: departmentId }); logger.debug(`Department for visitor with token ${token} was updated to ${departmentId}`); return true; diff --git a/apps/meteor/app/livechat/server/lib/Livechat.js b/apps/meteor/app/livechat/server/lib/Livechat.js index d71d12a3e606..424847dddb70 100644 --- a/apps/meteor/app/livechat/server/lib/Livechat.js +++ b/apps/meteor/app/livechat/server/lib/Livechat.js @@ -9,6 +9,7 @@ import _ from 'underscore'; import s from 'underscore.string'; import moment from 'moment-timezone'; import UAParser from 'ua-parser-js'; +import { Users as UsersRaw, LivechatVisitors } from '@rocket.chat/models'; import { QueueManager } from './QueueManager'; import { RoutingManager } from './RoutingManager'; @@ -26,7 +27,6 @@ import { LivechatDepartmentAgents, LivechatDepartment, LivechatCustomField, - LivechatVisitors, LivechatInquiry, } from '../../../models/server'; import { Logger } from '../../../logger/server'; @@ -40,7 +40,6 @@ import { normalizeTransferredByData, parseAgentCustomFields, updateDepartmentAge import { Apps, AppEvents } from '../../../apps/server'; import { businessHourManager } from '../business-hour'; import notifications from '../../../notifications/server/lib/Notifications'; -import { Users as UsersRaw, LivechatVisitors as LivechatVisitorsRaw } from '../../../models/server/raw'; import { addUserRoles } from '../../../../server/lib/roles/addUserRoles'; import { removeUserFromRoles } from '../../../../server/lib/roles/removeUserFromRoles'; @@ -172,8 +171,8 @@ export const Livechat = { } if (guest.department && !LivechatDepartment.findOneById(guest.department)) { - LivechatVisitors.removeDepartmentById(guest._id); - guest = LivechatVisitors.findOneById(guest._id); + await LivechatVisitors.removeDepartmentById(guest._id); + guest = await LivechatVisitors.findOneById(guest._id); } if (room == null) { @@ -272,7 +271,7 @@ export const Livechat = { return true; }, - registerGuest({ id, token, name, email, department, phone, username, connectionData, status = 'online' } = {}) { + async registerGuest({ id, token, name, email, department, phone, username, connectionData, status = 'online' } = {}) { check(token, String); check(id, Match.Maybe(String)); @@ -307,24 +306,24 @@ export const Livechat = { updateUser.$set.department = dep._id; } - const user = LivechatVisitors.getVisitorByToken(token, { fields: { _id: 1 } }); + const user = await LivechatVisitors.getVisitorByToken(token, { projection: { _id: 1 } }); let existingUser = null; if (user) { Livechat.logger.debug('Found matching user by token'); userId = user._id; - } else if (phone?.number && (existingUser = LivechatVisitors.findOneVisitorByPhone(phone.number))) { + } else if (phone?.number && (existingUser = await LivechatVisitors.findOneVisitorByPhone(phone.number))) { Livechat.logger.debug('Found matching user by phone number'); userId = existingUser._id; // Don't change token when matching by phone number, use current visitor token updateUser.$set.token = existingUser.token; - } else if (email && (existingUser = LivechatVisitors.findOneGuestByEmailAddress(email))) { + } else if (email && (existingUser = await LivechatVisitors.findOneGuestByEmailAddress(email))) { Livechat.logger.debug('Found matching user by email'); userId = existingUser._id; } else { Livechat.logger.debug(`No matches found. Attempting to create new user with token ${token}`); if (!username) { - username = LivechatVisitors.getNextVisitorUsername(); + username = await LivechatVisitors.getNextVisitorUsername(); } const userData = { @@ -344,15 +343,15 @@ export const Livechat = { } } - userId = LivechatVisitors.insert(userData); + userId = (await LivechatVisitors.insertOne(userData)).insertedId; } - LivechatVisitors.updateById(userId, updateUser); + await LivechatVisitors.updateById(userId, updateUser); return userId; }, - setDepartmentForGuest({ token, department } = {}) { + async setDepartmentForGuest({ token, department } = {}) { check(token, String); check(department, String); @@ -371,14 +370,14 @@ export const Livechat = { }); } - const user = LivechatVisitors.getVisitorByToken(token, { fields: { _id: 1 } }); + const user = await LivechatVisitors.getVisitorByToken(token, { fields: { _id: 1 } }); if (user) { return LivechatVisitors.updateById(user._id, updateUser); } return false; }, - saveGuest({ _id, name, email, phone, livechatData = {} }, userId) { + async saveGuest({ _id, name, email, phone, livechatData = {} }, userId) { Livechat.logger.debug(`Saving data for visitor ${_id}`); const updateData = {}; @@ -411,7 +410,7 @@ export const Livechat = { }); updateData.livechatData = customFields; } - const ret = LivechatVisitors.saveGuestById(_id, updateData); + const ret = await LivechatVisitors.saveGuestById(_id, updateData); Meteor.defer(() => { Apps.triggerEvent(AppEvents.IPostLivechatGuestSaved, _id); @@ -506,7 +505,7 @@ export const Livechat = { return LivechatRooms.removeById(rid); }, - setCustomFields({ token, key, value, overwrite } = {}) { + async setCustomFields({ token, key, value, overwrite } = {}) { check(token, String); check(key, String); check(value, String); @@ -636,7 +635,8 @@ export const Livechat = { forwardOpenChats(userId) { Livechat.logger.debug(`Transferring open chats for user ${userId}`); LivechatRooms.findOpenByAgent(userId).forEach((room) => { - const guest = LivechatVisitors.findOneById(room.v._id); + // TODO: refactor to use normal await + const guest = Promise.await(LivechatVisitors.findOneById(room.v._id)); const user = Users.findOneById(userId); const { _id, username, name } = user; const transferredBy = normalizeTransferredByData({ _id, username, name }, room); @@ -811,8 +811,8 @@ export const Livechat = { } }, - getLivechatRoomGuestInfo(room) { - const visitor = LivechatVisitors.findOneById(room.v._id); + async getLivechatRoomGuestInfo(room) { + const visitor = await LivechatVisitors.findOneById(room.v._id); const agent = Users.findOneById(room.servedBy && room.servedBy._id); const ua = new UAParser(); @@ -925,7 +925,7 @@ export const Livechat = { Users.removeLivechatData(_id); this.setUserStatusLivechat(_id, 'not-available'); LivechatDepartmentAgents.removeByAgentId(_id); - Promise.await(LivechatVisitorsRaw.removeContactManagerByUsername(username)); + Promise.await(LivechatVisitors.removeContactManagerByUsername(username)); return true; } @@ -946,16 +946,16 @@ export const Livechat = { return removeUserFromRoles(user._id, ['livechat-manager']); }, - removeGuest(_id) { + async removeGuest(_id) { check(_id, String); - const guest = LivechatVisitors.findOneById(_id); + const guest = await LivechatVisitors.findOneById(_id, { projection: { _id: 1 } }); if (!guest) { throw new Meteor.Error('error-invalid-guest', 'Invalid guest', { method: 'livechat:removeGuest', }); } - this.cleanGuestHistory(_id); + await this.cleanGuestHistory(_id); return LivechatVisitors.removeById(_id); }, @@ -971,8 +971,8 @@ export const Livechat = { return user; }, - cleanGuestHistory(_id) { - const guest = LivechatVisitors.findOneById(_id); + async cleanGuestHistory(_id) { + const guest = await LivechatVisitors.findOneById(_id); if (!guest) { throw new Meteor.Error('error-invalid-guest', 'Invalid guest', { method: 'livechat:cleanGuestHistory', @@ -1144,15 +1144,15 @@ export const Livechat = { }); }, - sendTranscript({ token, rid, email, subject, user }) { + async sendTranscript({ token, rid, email, subject, user }) { check(rid, String); check(email, String); Livechat.logger.debug(`Sending conversation transcript of room ${rid} to user with token ${token}`); const room = LivechatRooms.findOneById(rid); - const visitor = LivechatVisitors.getVisitorByToken(token, { - fields: { _id: 1, token: 1, language: 1, username: 1, name: 1 }, + const visitor = await LivechatVisitors.getVisitorByToken(token, { + projection: { _id: 1, token: 1, language: 1, username: 1, name: 1 }, }); const userLanguage = (visitor && visitor.language) || settings.get('Language') || 'en'; const timezone = getTimezone(user); @@ -1402,13 +1402,13 @@ export const Livechat = { return LivechatRooms.findOneById(roomId); }, - updateLastChat(contactId, lastChat) { + async updateLastChat(contactId, lastChat) { const updateUser = { $set: { lastChat, }, }; - LivechatVisitors.updateById(contactId, updateUser); + await LivechatVisitors.updateById(contactId, updateUser); }, updateCallStatus(callId, rid, status, user) { Rooms.setCallStatus(rid, status); diff --git a/apps/meteor/app/livechat/server/lib/OmniChannel.js b/apps/meteor/app/livechat/server/lib/OmniChannel.js index 9b320364b12c..0a4651114890 100644 --- a/apps/meteor/app/livechat/server/lib/OmniChannel.js +++ b/apps/meteor/app/livechat/server/lib/OmniChannel.js @@ -1,6 +1,6 @@ import { HTTP } from 'meteor/http'; -import { settings } from '../../../settings'; +import { settings } from '../../../settings/server'; const gatewayURL = 'https://omni.rocket.chat'; diff --git a/apps/meteor/app/livechat/server/lib/analytics/agents.js b/apps/meteor/app/livechat/server/lib/analytics/agents.js index f23025cabeb6..1f1a39f85c5c 100644 --- a/apps/meteor/app/livechat/server/lib/analytics/agents.js +++ b/apps/meteor/app/livechat/server/lib/analytics/agents.js @@ -1,4 +1,4 @@ -import { LivechatRooms, LivechatAgentActivity } from '../../../../models/server/raw'; +import { LivechatRooms, LivechatAgentActivity } from '@rocket.chat/models'; const findAllAverageServiceTimeAsync = async ({ start, end, options = {} }) => { if (!start || !end) { diff --git a/apps/meteor/app/livechat/server/lib/analytics/dashboards.js b/apps/meteor/app/livechat/server/lib/analytics/dashboards.js index 7819499ea9e9..71781bfa81c4 100644 --- a/apps/meteor/app/livechat/server/lib/analytics/dashboards.js +++ b/apps/meteor/app/livechat/server/lib/analytics/dashboards.js @@ -1,7 +1,7 @@ import moment from 'moment'; +import { LivechatRooms, Users, LivechatVisitors, LivechatAgentActivity } from '@rocket.chat/models'; -import { LivechatRooms, Users, LivechatVisitors, LivechatAgentActivity } from '../../../../models/server/raw'; -import { settings } from '../../../../settings'; +import { settings } from '../../../../settings/server'; import { Livechat } from '../Livechat'; import { secondsToHHMMSS } from '../../../../utils/server'; import { diff --git a/apps/meteor/app/livechat/server/lib/analytics/departments.js b/apps/meteor/app/livechat/server/lib/analytics/departments.js index d1cd5904a869..bf7a01adf0b8 100644 --- a/apps/meteor/app/livechat/server/lib/analytics/departments.js +++ b/apps/meteor/app/livechat/server/lib/analytics/departments.js @@ -1,4 +1,4 @@ -import { LivechatRooms, Messages } from '../../../../models/server/raw'; +import { LivechatRooms, Messages } from '@rocket.chat/models'; export const findAllRoomsAsync = async ({ start, end, answered, departmentId, options = {} }) => { if (!start || !end) { diff --git a/apps/meteor/app/livechat/server/methods/closeByVisitor.js b/apps/meteor/app/livechat/server/methods/closeByVisitor.js index 03c415dbb448..022e614bb7f0 100644 --- a/apps/meteor/app/livechat/server/methods/closeByVisitor.js +++ b/apps/meteor/app/livechat/server/methods/closeByVisitor.js @@ -1,13 +1,14 @@ import { Meteor } from 'meteor/meteor'; import { TAPi18n } from 'meteor/rocketchat:tap-i18n'; +import { LivechatVisitors } from '@rocket.chat/models'; -import { settings } from '../../../settings'; -import { LivechatRooms, LivechatVisitors } from '../../../models'; +import { settings } from '../../../settings/server'; +import { LivechatRooms } from '../../../models/server'; import { Livechat } from '../lib/Livechat'; Meteor.methods({ - 'livechat:closeByVisitor'({ roomId, token }) { - const visitor = LivechatVisitors.getVisitorByToken(token); + async 'livechat:closeByVisitor'({ roomId, token }) { + const visitor = await LivechatVisitors.getVisitorByToken(token); const language = (visitor && visitor.language) || settings.get('Language') || 'en'; diff --git a/apps/meteor/app/livechat/server/methods/closeRoom.js b/apps/meteor/app/livechat/server/methods/closeRoom.js index 773b22b5cdd4..9eeccfac638a 100644 --- a/apps/meteor/app/livechat/server/methods/closeRoom.js +++ b/apps/meteor/app/livechat/server/methods/closeRoom.js @@ -1,7 +1,7 @@ import { Meteor } from 'meteor/meteor'; import { hasPermission } from '../../../authorization'; -import { Subscriptions, LivechatRooms } from '../../../models'; +import { Subscriptions, LivechatRooms } from '../../../models/server'; import { Livechat } from '../lib/Livechat'; Meteor.methods({ diff --git a/apps/meteor/app/livechat/server/methods/discardTranscript.js b/apps/meteor/app/livechat/server/methods/discardTranscript.js index 5943ebb56ba3..099c8ad002d8 100644 --- a/apps/meteor/app/livechat/server/methods/discardTranscript.js +++ b/apps/meteor/app/livechat/server/methods/discardTranscript.js @@ -2,7 +2,7 @@ import { Meteor } from 'meteor/meteor'; import { check } from 'meteor/check'; import { hasPermission } from '../../../authorization'; -import { LivechatRooms } from '../../../models'; +import { LivechatRooms } from '../../../models/server'; Meteor.methods({ 'livechat:discardTranscript'(rid) { diff --git a/apps/meteor/app/livechat/server/methods/facebook.js b/apps/meteor/app/livechat/server/methods/facebook.js index 90d27222aa2e..86cd7132cc1a 100644 --- a/apps/meteor/app/livechat/server/methods/facebook.js +++ b/apps/meteor/app/livechat/server/methods/facebook.js @@ -2,7 +2,7 @@ import { Meteor } from 'meteor/meteor'; import { hasPermission } from '../../../authorization'; import { SystemLogger } from '../../../../server/lib/logger/system'; -import { settings } from '../../../settings'; +import { settings } from '../../../settings/server'; import OmniChannel from '../lib/OmniChannel'; import { Settings } from '../../../models/server'; diff --git a/apps/meteor/app/livechat/server/methods/getAgentData.js b/apps/meteor/app/livechat/server/methods/getAgentData.js index dd2d6a3b235d..1cc6993974c6 100644 --- a/apps/meteor/app/livechat/server/methods/getAgentData.js +++ b/apps/meteor/app/livechat/server/methods/getAgentData.js @@ -1,15 +1,16 @@ import { Meteor } from 'meteor/meteor'; import { check } from 'meteor/check'; +import { LivechatVisitors } from '@rocket.chat/models'; -import { Users, LivechatRooms, LivechatVisitors } from '../../../models'; +import { Users, LivechatRooms } from '../../../models/server'; Meteor.methods({ - 'livechat:getAgentData'({ roomId, token }) { + async 'livechat:getAgentData'({ roomId, token }) { check(roomId, String); check(token, String); const room = LivechatRooms.findOneById(roomId); - const visitor = LivechatVisitors.getVisitorByToken(token); + const visitor = await LivechatVisitors.getVisitorByToken(token); if (!room || room.t !== 'l' || !room.v || room.v.token !== visitor.token) { throw new Meteor.Error('error-invalid-room', 'Invalid room'); diff --git a/apps/meteor/app/livechat/server/methods/getAgentOverviewData.js b/apps/meteor/app/livechat/server/methods/getAgentOverviewData.js index d60d36957530..8df403e421e1 100644 --- a/apps/meteor/app/livechat/server/methods/getAgentOverviewData.js +++ b/apps/meteor/app/livechat/server/methods/getAgentOverviewData.js @@ -2,7 +2,7 @@ import { Meteor } from 'meteor/meteor'; import { hasPermission } from '../../../authorization'; import { Livechat } from '../lib/Livechat'; -import { Users } from '../../../models'; +import { Users } from '../../../models/server'; Meteor.methods({ 'livechat:getAgentOverviewData'(options) { diff --git a/apps/meteor/app/livechat/server/methods/getAnalyticsChartData.js b/apps/meteor/app/livechat/server/methods/getAnalyticsChartData.js index caa86c650899..8f9706e93bf7 100644 --- a/apps/meteor/app/livechat/server/methods/getAnalyticsChartData.js +++ b/apps/meteor/app/livechat/server/methods/getAnalyticsChartData.js @@ -1,7 +1,7 @@ import { Meteor } from 'meteor/meteor'; import { hasPermission } from '../../../authorization'; -import { Users } from '../../../models'; +import { Users } from '../../../models/server'; import { Livechat } from '../lib/Livechat'; Meteor.methods({ diff --git a/apps/meteor/app/livechat/server/methods/getAnalyticsOverviewData.js b/apps/meteor/app/livechat/server/methods/getAnalyticsOverviewData.js index 1ff65fce8522..407be7c7596e 100644 --- a/apps/meteor/app/livechat/server/methods/getAnalyticsOverviewData.js +++ b/apps/meteor/app/livechat/server/methods/getAnalyticsOverviewData.js @@ -1,8 +1,8 @@ import { Meteor } from 'meteor/meteor'; import { hasPermission } from '../../../authorization'; -import { Users } from '../../../models'; -import { settings } from '../../../settings'; +import { Users } from '../../../models/server'; +import { settings } from '../../../settings/server'; import { Livechat } from '../lib/Livechat'; Meteor.methods({ diff --git a/apps/meteor/app/livechat/server/methods/getCustomFields.js b/apps/meteor/app/livechat/server/methods/getCustomFields.js index df39364bccee..f18f94b6df2d 100644 --- a/apps/meteor/app/livechat/server/methods/getCustomFields.js +++ b/apps/meteor/app/livechat/server/methods/getCustomFields.js @@ -1,6 +1,6 @@ import { Meteor } from 'meteor/meteor'; -import { LivechatCustomField } from '../../../models'; +import { LivechatCustomField } from '../../../models/server'; Meteor.methods({ 'livechat:getCustomFields'() { diff --git a/apps/meteor/app/livechat/server/methods/getFirstRoomMessage.js b/apps/meteor/app/livechat/server/methods/getFirstRoomMessage.js index 75665226b538..3c9cc0601577 100644 --- a/apps/meteor/app/livechat/server/methods/getFirstRoomMessage.js +++ b/apps/meteor/app/livechat/server/methods/getFirstRoomMessage.js @@ -1,7 +1,7 @@ import { Meteor } from 'meteor/meteor'; import { check } from 'meteor/check'; -import { LivechatRooms, Messages } from '../../../models'; +import { LivechatRooms, Messages } from '../../../models/server'; import { hasPermission } from '../../../authorization'; Meteor.methods({ diff --git a/apps/meteor/app/livechat/server/methods/getInitialData.js b/apps/meteor/app/livechat/server/methods/getInitialData.js index e46c66e042f7..b6eab00f57bd 100644 --- a/apps/meteor/app/livechat/server/methods/getInitialData.js +++ b/apps/meteor/app/livechat/server/methods/getInitialData.js @@ -1,8 +1,8 @@ import { Meteor } from 'meteor/meteor'; import _ from 'underscore'; +import { LivechatTrigger, LivechatVisitors } from '@rocket.chat/models'; -import { LivechatRooms, Users, LivechatDepartment, LivechatVisitors } from '../../../models/server'; -import { LivechatTrigger } from '../../../models/server/raw'; +import { LivechatRooms, Users, LivechatDepartment } from '../../../models/server'; import { Livechat } from '../lib/Livechat'; import { deprecationWarning } from '../../../api/server/helpers/deprecationWarning'; @@ -53,7 +53,7 @@ Meteor.methods({ info.room = room[0]; } - const visitor = LivechatVisitors.getVisitorByToken(visitorToken, { + const visitor = await LivechatVisitors.getVisitorByToken(visitorToken, { fields: { name: 1, username: 1, diff --git a/apps/meteor/app/livechat/server/methods/getNextAgent.js b/apps/meteor/app/livechat/server/methods/getNextAgent.js index 8cfe404c0435..d2f0074e2d1c 100644 --- a/apps/meteor/app/livechat/server/methods/getNextAgent.js +++ b/apps/meteor/app/livechat/server/methods/getNextAgent.js @@ -1,7 +1,7 @@ import { Meteor } from 'meteor/meteor'; import { check } from 'meteor/check'; -import { LivechatRooms, Users } from '../../../models'; +import { LivechatRooms, Users } from '../../../models/server'; import { Livechat } from '../lib/Livechat'; Meteor.methods({ diff --git a/apps/meteor/app/livechat/server/methods/loadHistory.js b/apps/meteor/app/livechat/server/methods/loadHistory.js index a9d59d42ccbd..7e2fd97d5329 100644 --- a/apps/meteor/app/livechat/server/methods/loadHistory.js +++ b/apps/meteor/app/livechat/server/methods/loadHistory.js @@ -1,15 +1,16 @@ import { Meteor } from 'meteor/meteor'; +import { LivechatVisitors } from '@rocket.chat/models'; import { loadMessageHistory } from '../../../lib'; -import { LivechatVisitors, LivechatRooms } from '../../../models'; +import { LivechatRooms } from '../../../models/server'; Meteor.methods({ - 'livechat:loadHistory'({ token, rid, end, limit = 20, ls }) { + async 'livechat:loadHistory'({ token, rid, end, limit = 20, ls }) { if (!token || typeof token !== 'string') { return; } - const visitor = LivechatVisitors.getVisitorByToken(token, { fields: { _id: 1 } }); + const visitor = await LivechatVisitors.getVisitorByToken(token, { projection: { _id: 1 } }); if (!visitor) { throw new Meteor.Error('invalid-visitor', 'Invalid Visitor', { diff --git a/apps/meteor/app/livechat/server/methods/loginByToken.js b/apps/meteor/app/livechat/server/methods/loginByToken.js index 9320b1f424d6..4c2c7c658365 100644 --- a/apps/meteor/app/livechat/server/methods/loginByToken.js +++ b/apps/meteor/app/livechat/server/methods/loginByToken.js @@ -1,10 +1,9 @@ import { Meteor } from 'meteor/meteor'; - -import { LivechatVisitors } from '../../../models'; +import { LivechatVisitors } from '@rocket.chat/models'; Meteor.methods({ - 'livechat:loginByToken'(token) { - const visitor = LivechatVisitors.getVisitorByToken(token, { fields: { _id: 1 } }); + async 'livechat:loginByToken'(token) { + const visitor = await LivechatVisitors.getVisitorByToken(token, { projection: { _id: 1 } }); if (!visitor) { return; diff --git a/apps/meteor/app/livechat/server/methods/registerGuest.js b/apps/meteor/app/livechat/server/methods/registerGuest.js index b2fd0c0e41d7..b6c7b7f14f32 100644 --- a/apps/meteor/app/livechat/server/methods/registerGuest.js +++ b/apps/meteor/app/livechat/server/methods/registerGuest.js @@ -1,11 +1,12 @@ import { Meteor } from 'meteor/meteor'; +import { LivechatVisitors } from '@rocket.chat/models'; -import { Messages, LivechatRooms, LivechatVisitors } from '../../../models'; +import { Messages, LivechatRooms } from '../../../models/server'; import { Livechat } from '../lib/Livechat'; Meteor.methods({ - 'livechat:registerGuest'({ token, name, email, department, customFields } = {}) { - const userId = Livechat.registerGuest.call(this, { + async 'livechat:registerGuest'({ token, name, email, department, customFields } = {}) { + const userId = await Livechat.registerGuest.call(this, { token, name, email, @@ -15,8 +16,8 @@ Meteor.methods({ // update visited page history to not expire Messages.keepHistoryForToken(token); - const visitor = LivechatVisitors.getVisitorByToken(token, { - fields: { + const visitor = await LivechatVisitors.getVisitorByToken(token, { + projection: { token: 1, name: 1, username: 1, @@ -32,6 +33,7 @@ Meteor.methods({ }); if (customFields && customFields instanceof Array) { + // TODO: refactor to use normal await customFields.forEach((customField) => { if (typeof customField !== 'object') { return; @@ -39,7 +41,7 @@ Meteor.methods({ if (!customField.scope || customField.scope !== 'room') { const { key, value, overwrite } = customField; - LivechatVisitors.updateLivechatDataByToken(token, key, value, overwrite); + Promise.await(LivechatVisitors.updateLivechatDataByToken(token, key, value, overwrite)); } }); } diff --git a/apps/meteor/app/livechat/server/methods/removeAllClosedRooms.js b/apps/meteor/app/livechat/server/methods/removeAllClosedRooms.js index da93127f73aa..c70a82a853bd 100644 --- a/apps/meteor/app/livechat/server/methods/removeAllClosedRooms.js +++ b/apps/meteor/app/livechat/server/methods/removeAllClosedRooms.js @@ -1,7 +1,7 @@ import { Meteor } from 'meteor/meteor'; import { hasPermission } from '../../../authorization'; -import { LivechatRooms } from '../../../models'; +import { LivechatRooms } from '../../../models/server'; import { Livechat } from '../lib/Livechat'; Meteor.methods({ diff --git a/apps/meteor/app/livechat/server/methods/removeCustomField.js b/apps/meteor/app/livechat/server/methods/removeCustomField.js index 5b6fd869d6bf..d0364716194e 100644 --- a/apps/meteor/app/livechat/server/methods/removeCustomField.js +++ b/apps/meteor/app/livechat/server/methods/removeCustomField.js @@ -2,7 +2,7 @@ import { Meteor } from 'meteor/meteor'; import { check } from 'meteor/check'; import { hasPermission } from '../../../authorization'; -import { LivechatCustomField } from '../../../models'; +import { LivechatCustomField } from '../../../models/server'; Meteor.methods({ 'livechat:removeCustomField'(_id) { diff --git a/apps/meteor/app/livechat/server/methods/removeRoom.js b/apps/meteor/app/livechat/server/methods/removeRoom.js index f8c251e28a36..a39a0abb4f02 100644 --- a/apps/meteor/app/livechat/server/methods/removeRoom.js +++ b/apps/meteor/app/livechat/server/methods/removeRoom.js @@ -1,7 +1,7 @@ import { Meteor } from 'meteor/meteor'; import { hasPermission } from '../../../authorization'; -import { LivechatRooms } from '../../../models'; +import { LivechatRooms } from '../../../models/server'; import { Livechat } from '../lib/Livechat'; Meteor.methods({ diff --git a/apps/meteor/app/livechat/server/methods/removeTrigger.js b/apps/meteor/app/livechat/server/methods/removeTrigger.js index d20a9816a6bb..946b5f68be6f 100644 --- a/apps/meteor/app/livechat/server/methods/removeTrigger.js +++ b/apps/meteor/app/livechat/server/methods/removeTrigger.js @@ -1,8 +1,8 @@ import { Meteor } from 'meteor/meteor'; import { check } from 'meteor/check'; +import { LivechatTrigger } from '@rocket.chat/models'; import { hasPermission } from '../../../authorization/server'; -import { LivechatTrigger } from '../../../models/server/raw'; Meteor.methods({ async 'livechat:removeTrigger'(triggerId) { diff --git a/apps/meteor/app/livechat/server/methods/requestTranscript.js b/apps/meteor/app/livechat/server/methods/requestTranscript.js index 98f85bd66de1..8e3424c8d00f 100644 --- a/apps/meteor/app/livechat/server/methods/requestTranscript.js +++ b/apps/meteor/app/livechat/server/methods/requestTranscript.js @@ -2,7 +2,7 @@ import { Meteor } from 'meteor/meteor'; import { check } from 'meteor/check'; import { hasPermission } from '../../../authorization'; -import { Users } from '../../../models'; +import { Users } from '../../../models/server'; import { Livechat } from '../lib/Livechat'; Meteor.methods({ diff --git a/apps/meteor/app/livechat/server/methods/returnAsInquiry.js b/apps/meteor/app/livechat/server/methods/returnAsInquiry.js index 86203317d393..7cedc7ee7499 100644 --- a/apps/meteor/app/livechat/server/methods/returnAsInquiry.js +++ b/apps/meteor/app/livechat/server/methods/returnAsInquiry.js @@ -1,7 +1,7 @@ import { Meteor } from 'meteor/meteor'; import { hasPermission } from '../../../authorization'; -import { LivechatRooms } from '../../../models'; +import { LivechatRooms } from '../../../models/server'; import { Livechat } from '../lib/Livechat'; Meteor.methods({ diff --git a/apps/meteor/app/livechat/server/methods/saveCustomField.js b/apps/meteor/app/livechat/server/methods/saveCustomField.js index 1f45ed936fff..f50ac18231cb 100644 --- a/apps/meteor/app/livechat/server/methods/saveCustomField.js +++ b/apps/meteor/app/livechat/server/methods/saveCustomField.js @@ -2,7 +2,7 @@ import { Meteor } from 'meteor/meteor'; import { Match, check } from 'meteor/check'; import { hasPermission } from '../../../authorization'; -import { LivechatCustomField } from '../../../models'; +import { LivechatCustomField } from '../../../models/server'; Meteor.methods({ 'livechat:saveCustomField'(_id, customFieldData) { diff --git a/apps/meteor/app/livechat/server/methods/saveInfo.js b/apps/meteor/app/livechat/server/methods/saveInfo.js index b00ffac58834..c5b4a164d6ca 100644 --- a/apps/meteor/app/livechat/server/methods/saveInfo.js +++ b/apps/meteor/app/livechat/server/methods/saveInfo.js @@ -2,12 +2,12 @@ import { Meteor } from 'meteor/meteor'; import { Match, check } from 'meteor/check'; import { hasPermission } from '../../../authorization'; -import { LivechatRooms } from '../../../models'; +import { LivechatRooms } from '../../../models/server'; import { callbacks } from '../../../../lib/callbacks'; import { Livechat } from '../lib/Livechat'; Meteor.methods({ - 'livechat:saveInfo'(guestData, roomData) { + async 'livechat:saveInfo'(guestData, roomData) { const userId = Meteor.userId(); if (!userId || !hasPermission(userId, 'view-l-room')) { @@ -49,7 +49,7 @@ Meteor.methods({ delete guestData.phone; } - const ret = Livechat.saveGuest(guestData, userId) && Livechat.saveRoomInfo(roomData, guestData, userId); + const ret = (await Livechat.saveGuest(guestData, userId)) && Livechat.saveRoomInfo(roomData, guestData, userId); const user = Meteor.users.findOne({ _id: userId }, { fields: { _id: 1, username: 1 } }); diff --git a/apps/meteor/app/livechat/server/methods/saveSurveyFeedback.js b/apps/meteor/app/livechat/server/methods/saveSurveyFeedback.js index 2f6b0b815167..7d908cdc7a90 100644 --- a/apps/meteor/app/livechat/server/methods/saveSurveyFeedback.js +++ b/apps/meteor/app/livechat/server/methods/saveSurveyFeedback.js @@ -1,17 +1,16 @@ import { Meteor } from 'meteor/meteor'; import { Match, check } from 'meteor/check'; import _ from 'underscore'; - -import { LivechatRooms, LivechatVisitors } from '../../../models'; +import { LivechatRooms, LivechatVisitors } from '@rocket.chat/models'; Meteor.methods({ - 'livechat:saveSurveyFeedback'(visitorToken, visitorRoom, formData) { + async 'livechat:saveSurveyFeedback'(visitorToken, visitorRoom, formData) { check(visitorToken, String); check(visitorRoom, String); check(formData, [Match.ObjectIncluding({ name: String, value: String })]); - const visitor = LivechatVisitors.getVisitorByToken(visitorToken); - const room = LivechatRooms.findOneById(visitorRoom); + const visitor = await LivechatVisitors.getVisitorByToken(visitorToken); + const room = await LivechatRooms.findOneById(visitorRoom); if (visitor !== undefined && room !== undefined && room.v !== undefined && room.v.token === visitor.token) { const updateData = {}; diff --git a/apps/meteor/app/livechat/server/methods/saveTrigger.js b/apps/meteor/app/livechat/server/methods/saveTrigger.js index 252d6c022397..66f1aa6be961 100644 --- a/apps/meteor/app/livechat/server/methods/saveTrigger.js +++ b/apps/meteor/app/livechat/server/methods/saveTrigger.js @@ -1,8 +1,8 @@ import { Meteor } from 'meteor/meteor'; import { Match, check } from 'meteor/check'; +import { LivechatTrigger } from '@rocket.chat/models'; import { hasPermission } from '../../../authorization'; -import { LivechatTrigger } from '../../../models/server/raw'; Meteor.methods({ async 'livechat:saveTrigger'(trigger) { diff --git a/apps/meteor/app/livechat/server/methods/searchAgent.js b/apps/meteor/app/livechat/server/methods/searchAgent.js index bfd8d7b67584..600a28150bad 100644 --- a/apps/meteor/app/livechat/server/methods/searchAgent.js +++ b/apps/meteor/app/livechat/server/methods/searchAgent.js @@ -2,7 +2,7 @@ import { Meteor } from 'meteor/meteor'; import _ from 'underscore'; import { hasPermission } from '../../../authorization'; -import { Users } from '../../../models'; +import { Users } from '../../../models/server'; Meteor.methods({ 'livechat:searchAgent'(username) { diff --git a/apps/meteor/app/livechat/server/methods/sendFileLivechatMessage.js b/apps/meteor/app/livechat/server/methods/sendFileLivechatMessage.js index 6f9a20d5d731..3f2a3e7c98bb 100644 --- a/apps/meteor/app/livechat/server/methods/sendFileLivechatMessage.js +++ b/apps/meteor/app/livechat/server/methods/sendFileLivechatMessage.js @@ -1,13 +1,14 @@ import { Meteor } from 'meteor/meteor'; import { Match, check } from 'meteor/check'; import { Random } from 'meteor/random'; +import { LivechatVisitors } from '@rocket.chat/models'; -import { LivechatRooms, LivechatVisitors } from '../../../models'; +import { LivechatRooms } from '../../../models/server'; import { FileUpload } from '../../../file-upload/server'; Meteor.methods({ async sendFileLivechatMessage(roomId, visitorToken, file, msgData = {}) { - const visitor = LivechatVisitors.getVisitorByToken(visitorToken); + const visitor = await LivechatVisitors.getVisitorByToken(visitorToken); if (!visitor) { return false; diff --git a/apps/meteor/app/livechat/server/methods/sendMessageLivechat.js b/apps/meteor/app/livechat/server/methods/sendMessageLivechat.js index df6861f7af4a..7b6d2d0608b9 100644 --- a/apps/meteor/app/livechat/server/methods/sendMessageLivechat.js +++ b/apps/meteor/app/livechat/server/methods/sendMessageLivechat.js @@ -1,13 +1,13 @@ import { Meteor } from 'meteor/meteor'; import { Match, check } from 'meteor/check'; import { OmnichannelSourceType } from '@rocket.chat/core-typings'; +import { LivechatVisitors } from '@rocket.chat/models'; -import { LivechatVisitors } from '../../../models'; import { Livechat } from '../lib/Livechat'; import { settings } from '../../../settings/server'; Meteor.methods({ - sendMessageLivechat({ token, _id, rid, msg, file, attachments }, agent) { + async sendMessageLivechat({ token, _id, rid, msg, file, attachments }, agent) { check(token, String); check(_id, String); check(rid, String); @@ -21,8 +21,8 @@ Meteor.methods({ }), ); - const guest = LivechatVisitors.getVisitorByToken(token, { - fields: { + const guest = await LivechatVisitors.getVisitorByToken(token, { + projection: { name: 1, username: 1, department: 1, diff --git a/apps/meteor/app/livechat/server/methods/sendTranscript.js b/apps/meteor/app/livechat/server/methods/sendTranscript.js index fb8fdc48863e..a29b73236533 100644 --- a/apps/meteor/app/livechat/server/methods/sendTranscript.js +++ b/apps/meteor/app/livechat/server/methods/sendTranscript.js @@ -2,7 +2,7 @@ import { Meteor } from 'meteor/meteor'; import { check } from 'meteor/check'; import { DDPRateLimiter } from 'meteor/ddp-rate-limiter'; -import { Users } from '../../../models'; +import { Users } from '../../../models/server'; import { hasPermission } from '../../../authorization'; import { Livechat } from '../lib/Livechat'; diff --git a/apps/meteor/app/livechat/server/methods/setCustomField.js b/apps/meteor/app/livechat/server/methods/setCustomField.js index 14601cbf8adf..cd8576bcd0aa 100644 --- a/apps/meteor/app/livechat/server/methods/setCustomField.js +++ b/apps/meteor/app/livechat/server/methods/setCustomField.js @@ -1,9 +1,10 @@ import { Meteor } from 'meteor/meteor'; +import { LivechatVisitors } from '@rocket.chat/models'; -import { LivechatRooms, LivechatVisitors, LivechatCustomField } from '../../../models'; +import { LivechatRooms, LivechatCustomField } from '../../../models/server'; Meteor.methods({ - 'livechat:setCustomField'(token, key, value, overwrite = true) { + async 'livechat:setCustomField'(token, key, value, overwrite = true) { const customField = LivechatCustomField.findOneById(key); if (customField) { if (customField.scope === 'room') { diff --git a/apps/meteor/app/livechat/server/methods/setDepartmentForVisitor.js b/apps/meteor/app/livechat/server/methods/setDepartmentForVisitor.js index 9d1f7abaccd9..ada1703b34c6 100644 --- a/apps/meteor/app/livechat/server/methods/setDepartmentForVisitor.js +++ b/apps/meteor/app/livechat/server/methods/setDepartmentForVisitor.js @@ -1,18 +1,19 @@ import { Meteor } from 'meteor/meteor'; import { check } from 'meteor/check'; +import { LivechatVisitors } from '@rocket.chat/models'; -import { LivechatRooms, Messages, LivechatVisitors } from '../../../models'; +import { LivechatRooms, Messages } from '../../../models/server'; import { Livechat } from '../lib/Livechat'; import { normalizeTransferredByData } from '../lib/Helper'; Meteor.methods({ - 'livechat:setDepartmentForVisitor'({ roomId, visitorToken, departmentId } = {}) { + async 'livechat:setDepartmentForVisitor'({ roomId, visitorToken, departmentId } = {}) { check(roomId, String); check(visitorToken, String); check(departmentId, String); const room = LivechatRooms.findOneById(roomId); - const visitor = LivechatVisitors.getVisitorByToken(visitorToken); + const visitor = await LivechatVisitors.getVisitorByToken(visitorToken); if (!room || room.t !== 'l' || !room.v || room.v.token !== visitor.token) { throw new Meteor.Error('error-invalid-room', 'Invalid room'); diff --git a/apps/meteor/app/livechat/server/methods/startFileUploadRoom.js b/apps/meteor/app/livechat/server/methods/startFileUploadRoom.js index f6a3691faeb1..5f8f6a7c8889 100644 --- a/apps/meteor/app/livechat/server/methods/startFileUploadRoom.js +++ b/apps/meteor/app/livechat/server/methods/startFileUploadRoom.js @@ -1,15 +1,16 @@ import { Meteor } from 'meteor/meteor'; import { Random } from 'meteor/random'; import { OmnichannelSourceType } from '@rocket.chat/core-typings'; +import { LivechatVisitors } from '@rocket.chat/models'; -import { LivechatVisitors } from '../../../models'; import { Livechat } from '../lib/Livechat'; import { methodDeprecationLogger } from '../../../lib/server/lib/deprecationWarningLogger'; +// TODO: check if this is still in use Meteor.methods({ - 'livechat:startFileUploadRoom'(roomId, token) { + async 'livechat:startFileUploadRoom'(roomId, token) { methodDeprecationLogger.warn('livechat:startFileUploadRoom will be deprecated in future versions of Rocket.Chat'); - const guest = LivechatVisitors.getVisitorByToken(token); + const guest = await LivechatVisitors.getVisitorByToken(token); const message = { _id: Random.id(), diff --git a/apps/meteor/app/livechat/server/methods/startVideoCall.js b/apps/meteor/app/livechat/server/methods/startVideoCall.js index 3319ca905cf3..b50e24729cf9 100644 --- a/apps/meteor/app/livechat/server/methods/startVideoCall.js +++ b/apps/meteor/app/livechat/server/methods/startVideoCall.js @@ -2,8 +2,8 @@ import { Meteor } from 'meteor/meteor'; import { Random } from 'meteor/random'; import { OmnichannelSourceType } from '@rocket.chat/core-typings'; -import { Messages } from '../../../models'; -import { settings } from '../../../settings'; +import { Messages } from '../../../models/server'; +import { settings } from '../../../settings/server'; import { Livechat } from '../lib/Livechat'; import { methodDeprecationLogger } from '../../../lib/server/lib/deprecationWarningLogger'; diff --git a/apps/meteor/app/livechat/server/methods/transfer.js b/apps/meteor/app/livechat/server/methods/transfer.js index 0e29de863aec..52a189c97e5c 100644 --- a/apps/meteor/app/livechat/server/methods/transfer.js +++ b/apps/meteor/app/livechat/server/methods/transfer.js @@ -1,13 +1,14 @@ import { Meteor } from 'meteor/meteor'; import { Match, check } from 'meteor/check'; +import { LivechatVisitors } from '@rocket.chat/models'; -import { hasPermission } from '../../../authorization'; -import { LivechatRooms, Subscriptions, LivechatVisitors, Users } from '../../../models'; +import { hasPermission } from '../../../authorization/server'; +import { LivechatRooms, Subscriptions, Users } from '../../../models/server'; import { Livechat } from '../lib/Livechat'; import { normalizeTransferredByData } from '../lib/Helper'; Meteor.methods({ - 'livechat:transfer'(transferData) { + async 'livechat:transfer'(transferData) { if (!Meteor.userId() || !hasPermission(Meteor.userId(), 'view-l-room')) { throw new Meteor.Error('error-not-allowed', 'Not allowed', { method: 'livechat:transfer' }); } @@ -38,7 +39,7 @@ Meteor.methods({ }); } - const guest = LivechatVisitors.findOneById(room.v && room.v._id); + const guest = await LivechatVisitors.findOneById(room.v && room.v._id); transferData.transferredBy = normalizeTransferredByData(Meteor.user() || {}, room); if (transferData.userId) { const userToTransfer = Users.findOneById(transferData.userId); diff --git a/apps/meteor/app/livechat/server/sendMessageBySMS.js b/apps/meteor/app/livechat/server/sendMessageBySMS.js index 72c36d158ce7..587dd2663a29 100644 --- a/apps/meteor/app/livechat/server/sendMessageBySMS.js +++ b/apps/meteor/app/livechat/server/sendMessageBySMS.js @@ -1,7 +1,8 @@ +import { LivechatVisitors } from '@rocket.chat/models'; + import { callbacks } from '../../../lib/callbacks'; -import { settings } from '../../settings'; +import { settings } from '../../settings/server'; import { SMS } from '../../sms'; -import { LivechatVisitors } from '../../models'; import { normalizeMessageFileUpload } from '../../utils/server/functions/normalizeMessageFileUpload'; callbacks.add( @@ -49,7 +50,7 @@ callbacks.add( return message; } - const visitor = LivechatVisitors.getVisitorByToken(room.v.token); + const visitor = Promise.await(LivechatVisitors.getVisitorByToken(room.v.token)); if (!visitor || !visitor.phone || visitor.phone.length === 0) { return message; diff --git a/apps/meteor/app/livechat/server/startup.js b/apps/meteor/app/livechat/server/startup.js index 14229e94948b..f9dcf3201f81 100644 --- a/apps/meteor/app/livechat/server/startup.js +++ b/apps/meteor/app/livechat/server/startup.js @@ -3,7 +3,7 @@ import { Accounts } from 'meteor/accounts-base'; import { TAPi18n } from 'meteor/rocketchat:tap-i18n'; import { roomCoordinator } from '../../../server/lib/rooms/roomCoordinator'; -import { LivechatRooms } from '../../models'; +import { LivechatRooms } from '../../models/server'; import { callbacks } from '../../../lib/callbacks'; import { settings } from '../../settings/server'; import { LivechatAgentActivityMonitor } from './statistics/LivechatAgentActivityMonitor'; diff --git a/apps/meteor/app/livechat/server/statistics/LivechatAgentActivityMonitor.ts b/apps/meteor/app/livechat/server/statistics/LivechatAgentActivityMonitor.ts index 5fbb8c9edd21..7379376a7a72 100644 --- a/apps/meteor/app/livechat/server/statistics/LivechatAgentActivityMonitor.ts +++ b/apps/meteor/app/livechat/server/statistics/LivechatAgentActivityMonitor.ts @@ -2,10 +2,10 @@ import moment from 'moment'; import { ISocketConnection } from '@rocket.chat/core-typings'; import { Meteor } from 'meteor/meteor'; import { SyncedCron } from 'meteor/littledata:synced-cron'; +import { LivechatAgentActivity, Sessions } from '@rocket.chat/models'; import { callbacks } from '../../../../lib/callbacks'; import { Users } from '../../../models/server'; -import { LivechatAgentActivity, Sessions } from '../../../models/server/raw'; const formatDate = (dateTime = new Date()): { date: number } => ({ date: parseInt(moment(dateTime).format('YYYYMMDD')), diff --git a/apps/meteor/app/livestream/client/views/liveStreamTab.js b/apps/meteor/app/livestream/client/views/liveStreamTab.js index 52fe8519ddc3..d819278cb121 100644 --- a/apps/meteor/app/livestream/client/views/liveStreamTab.js +++ b/apps/meteor/app/livestream/client/views/liveStreamTab.js @@ -12,7 +12,7 @@ import { t } from '../../../utils'; import { settings } from '../../../settings'; import { callbacks } from '../../../../lib/callbacks'; import { hasAllPermission } from '../../../authorization'; -import { Users, Rooms } from '../../../models'; +import { Users, Rooms } from '../../../models/client'; import { handleError } from '../../../../client/lib/utils/handleError'; import { dispatchToastMessage } from '../../../../client/lib/toast'; diff --git a/apps/meteor/app/livestream/server/methods.js b/apps/meteor/app/livestream/server/methods.js index ab8a91988ab2..f9942c3e7d8a 100644 --- a/apps/meteor/app/livestream/server/methods.js +++ b/apps/meteor/app/livestream/server/methods.js @@ -1,8 +1,8 @@ import { Meteor } from 'meteor/meteor'; import { createLiveStream, statusLiveStream, statusStreamLiveStream, getBroadcastStatus, setBroadcastStatus } from './functions/livestream'; -import { settings } from '../../settings'; -import { Rooms } from '../../models'; +import { settings } from '../../settings/server'; +import { Rooms } from '../../models/server'; const selectLivestreamSettings = (user) => user && user.settings && user.settings.livestream; diff --git a/apps/meteor/app/livestream/server/routes.js b/apps/meteor/app/livestream/server/routes.js index 3c63bac44c00..833058ea6bcb 100644 --- a/apps/meteor/app/livestream/server/routes.js +++ b/apps/meteor/app/livestream/server/routes.js @@ -1,7 +1,7 @@ import google from 'googleapis'; -import { settings } from '../../settings'; -import { Users } from '../../models'; +import { settings } from '../../settings/server'; +import { Users } from '../../models/server'; import { API } from '../../api/server'; const { OAuth2 } = google.auth; diff --git a/apps/meteor/app/markdown/server/index.js b/apps/meteor/app/markdown/server/index.js index 4a4a56a13f89..9b4f3084c58b 100644 --- a/apps/meteor/app/markdown/server/index.js +++ b/apps/meteor/app/markdown/server/index.js @@ -2,7 +2,7 @@ import { Meteor } from 'meteor/meteor'; import { Tracker } from 'meteor/tracker'; import { callbacks } from '../../../lib/callbacks'; -import { settings } from '../../settings'; +import { settings } from '../../settings/server'; import { createMarkdownMessageRenderer, createMarkdownNotificationRenderer } from '../lib/markdown'; import './settings'; diff --git a/apps/meteor/app/mentions/client/mentionLink.css b/apps/meteor/app/mentions/client/mentionLink.css index 4915ce792ab9..e338b20ea1f2 100644 --- a/apps/meteor/app/mentions/client/mentionLink.css +++ b/apps/meteor/app/mentions/client/mentionLink.css @@ -16,7 +16,6 @@ &:hover { opacity: 0.6; - color: var(--mention-link-text-color); } &--me { diff --git a/apps/meteor/app/mentions/server/methods/getUserMentionsByChannel.js b/apps/meteor/app/mentions/server/methods/getUserMentionsByChannel.js index 9c622e3d6581..8318c8a120aa 100644 --- a/apps/meteor/app/mentions/server/methods/getUserMentionsByChannel.js +++ b/apps/meteor/app/mentions/server/methods/getUserMentionsByChannel.js @@ -1,7 +1,7 @@ import { Meteor } from 'meteor/meteor'; import { check } from 'meteor/check'; -import { Rooms, Users, Messages } from '../../../models'; +import { Rooms, Users, Messages } from '../../../models/server'; import { canAccessRoom } from '../../../authorization/server'; Meteor.methods({ diff --git a/apps/meteor/app/mentions/server/server.js b/apps/meteor/app/mentions/server/server.js index 280211c9c7ba..c82a7c3449e8 100644 --- a/apps/meteor/app/mentions/server/server.js +++ b/apps/meteor/app/mentions/server/server.js @@ -2,9 +2,9 @@ import { Meteor } from 'meteor/meteor'; import { TAPi18n } from 'meteor/rocketchat:tap-i18n'; import MentionsServer from './Mentions'; -import { settings } from '../../settings'; +import { settings } from '../../settings/server'; import { callbacks } from '../../../lib/callbacks'; -import { Users, Subscriptions, Rooms } from '../../models'; +import { Users, Subscriptions, Rooms } from '../../models/server'; import { api } from '../../../server/sdk/api'; export class MentionQueries { diff --git a/apps/meteor/app/message-pin/client/pinMessage.js b/apps/meteor/app/message-pin/client/pinMessage.js index 9e2ec2da0caa..b45bed7839c3 100644 --- a/apps/meteor/app/message-pin/client/pinMessage.js +++ b/apps/meteor/app/message-pin/client/pinMessage.js @@ -2,7 +2,7 @@ import { Meteor } from 'meteor/meteor'; import { TAPi18n } from 'meteor/rocketchat:tap-i18n'; import { settings } from '../../settings'; -import { ChatMessage, Subscriptions } from '../../models'; +import { ChatMessage, Subscriptions } from '../../models/client'; import { dispatchToastMessage } from '../../../client/lib/toast'; Meteor.methods({ diff --git a/apps/meteor/app/message-pin/server/pinMessage.js b/apps/meteor/app/message-pin/server/pinMessage.js index 6f9c11d51589..c176d16acd45 100644 --- a/apps/meteor/app/message-pin/server/pinMessage.js +++ b/apps/meteor/app/message-pin/server/pinMessage.js @@ -6,7 +6,7 @@ import { callbacks } from '../../../lib/callbacks'; import { isTheLastMessage } from '../../lib/server'; import { getUserAvatarURL } from '../../utils/lib/getUserAvatarURL'; import { canAccessRoom, hasPermission, roomAccessAttributes } from '../../authorization/server'; -import { Subscriptions, Messages, Users, Rooms } from '../../models'; +import { Subscriptions, Messages, Users, Rooms } from '../../models/server'; import { Apps, AppEvents } from '../../apps/server/orchestrator'; const recursiveRemove = (msg, deep = 1) => { diff --git a/apps/meteor/app/message-pin/server/startup/indexes.js b/apps/meteor/app/message-pin/server/startup/indexes.js index c73616e0d1a0..c6556421c38a 100644 --- a/apps/meteor/app/message-pin/server/startup/indexes.js +++ b/apps/meteor/app/message-pin/server/startup/indexes.js @@ -1,6 +1,6 @@ import { Meteor } from 'meteor/meteor'; -import { Messages } from '../../../models'; +import { Messages } from '../../../models/server'; Meteor.startup(function () { return Meteor.defer(function () { diff --git a/apps/meteor/app/message-snippet/client/actionButton.js b/apps/meteor/app/message-snippet/client/actionButton.js deleted file mode 100644 index 342ff2b2854d..000000000000 --- a/apps/meteor/app/message-snippet/client/actionButton.js +++ /dev/null @@ -1,69 +0,0 @@ -// import { Meteor } from 'meteor/meteor'; -// import { MessageAction, modal } from '../../ui-utils'; -// import { messageArgs } from '../../ui-utils/client/lib/messageArgs'; -// import { t, handleError } from '../../utils'; -// import { settings } from '../../settings'; -// import { Subscriptions } from '../../models'; -// import { hasAtLeastOnePermission } from '../../authorization'; -// -// Meteor.startup(function() { -// MessageAction.addButton({ -// id: 'snippeted-message', -// icon: 'code', -// label: 'Snippet', -// context: [ -// 'snippeted', -// 'message', -// 'message-mobile', -// ], -// order: 10, -// group: 'menu', -// action() { -// const { msg: message } = messageArgs(this); -// -// modal.open({ -// title: 'Create a Snippet', -// text: 'The name of your snippet (with file extension):', -// type: 'input', -// showCancelButton: true, -// closeOnConfirm: false, -// inputPlaceholder: 'Snippet name', -// }, function(filename) { -// if (filename === false) { -// return false; -// } -// if (filename === '') { -// modal.showInputError('You need to write something!'); -// return false; -// } -// message.snippeted = true; -// Meteor.call('snippetMessage', message, filename, function(error) { -// if (error) { -// return handleError(error); -// } -// modal.open({ -// title: t('Nice'), -// text: `Snippet '${ filename }' created.`, -// type: 'success', -// timer: 2000, -// }); -// }); -// }); -// -// }, -// condition(message) { -// if (Subscriptions.findOne({ rid: message.rid, 'u._id': Meteor.userId() }) === undefined) { -// return false; -// } -// -// if (message.snippeted || ((settings.get('Message_AllowSnippeting') === undefined) || -// (settings.get('Message_AllowSnippeting') === null) || -// (settings.get('Message_AllowSnippeting')) === false)) { -// return false; -// } -// -// return hasAtLeastOnePermission('snippet-message', message.rid); -// }, -// }); -// -// }); diff --git a/apps/meteor/app/message-snippet/client/index.js b/apps/meteor/app/message-snippet/client/index.js index c3a4c091f880..d5b477773204 100644 --- a/apps/meteor/app/message-snippet/client/index.js +++ b/apps/meteor/app/message-snippet/client/index.js @@ -1,4 +1,3 @@ -import './actionButton'; import './messageType'; import './snippetMessage'; import './page/snippetPage.html'; diff --git a/apps/meteor/app/message-snippet/client/snippetMessage.js b/apps/meteor/app/message-snippet/client/snippetMessage.js index 5edefd30e423..3c8a35d6cfdc 100644 --- a/apps/meteor/app/message-snippet/client/snippetMessage.js +++ b/apps/meteor/app/message-snippet/client/snippetMessage.js @@ -1,7 +1,7 @@ import { Meteor } from 'meteor/meteor'; import { settings } from '../../settings'; -import { ChatMessage, Subscriptions } from '../../models'; +import { ChatMessage, Subscriptions } from '../../models/client'; Meteor.methods({ snippetMessage(message) { diff --git a/apps/meteor/app/message-snippet/server/methods/snippetMessage.js b/apps/meteor/app/message-snippet/server/methods/snippetMessage.js index b332e37b0fd3..987c3102c71d 100644 --- a/apps/meteor/app/message-snippet/server/methods/snippetMessage.js +++ b/apps/meteor/app/message-snippet/server/methods/snippetMessage.js @@ -1,7 +1,7 @@ import { Meteor } from 'meteor/meteor'; -import { Subscriptions, Messages, Users, Rooms } from '../../../models'; -import { settings } from '../../../settings'; +import { Subscriptions, Messages, Users, Rooms } from '../../../models/server'; +import { settings } from '../../../settings/server'; import { callbacks } from '../../../../lib/callbacks'; import { isTheLastMessage } from '../../../lib'; diff --git a/apps/meteor/app/message-snippet/server/requests.js b/apps/meteor/app/message-snippet/server/requests.js index d06fd06b075b..63f74bf59a00 100644 --- a/apps/meteor/app/message-snippet/server/requests.js +++ b/apps/meteor/app/message-snippet/server/requests.js @@ -1,7 +1,7 @@ import { WebApp } from 'meteor/webapp'; import { Cookies } from 'meteor/ostrio:cookies'; -import { Users, Rooms, Messages } from '../../models'; +import { Users, Rooms, Messages } from '../../models/server'; WebApp.connectHandlers.use('/snippet/download', function (req, res) { let rawCookies; diff --git a/apps/meteor/app/message-star/client/starMessage.js b/apps/meteor/app/message-star/client/starMessage.js index 17178341b894..41e2c7ac7775 100644 --- a/apps/meteor/app/message-star/client/starMessage.js +++ b/apps/meteor/app/message-star/client/starMessage.js @@ -2,7 +2,7 @@ import { Meteor } from 'meteor/meteor'; import { TAPi18n } from 'meteor/rocketchat:tap-i18n'; import { settings } from '../../settings'; -import { ChatMessage, Subscriptions } from '../../models'; +import { ChatMessage, Subscriptions } from '../../models/client'; import { dispatchToastMessage } from '../../../client/lib/toast'; Meteor.methods({ diff --git a/apps/meteor/app/message-star/server/startup/indexes.js b/apps/meteor/app/message-star/server/startup/indexes.js index 12350e64a67a..a39f821a3155 100644 --- a/apps/meteor/app/message-star/server/startup/indexes.js +++ b/apps/meteor/app/message-star/server/startup/indexes.js @@ -1,6 +1,6 @@ import { Meteor } from 'meteor/meteor'; -import { Messages } from '../../../models'; +import { Messages } from '../../../models/server'; Meteor.startup(function () { return Meteor.defer(function () { diff --git a/apps/meteor/app/meteor-accounts-saml/server/lib/SAML.ts b/apps/meteor/app/meteor-accounts-saml/server/lib/SAML.ts index 0e9933aa68af..a9c208c9e462 100644 --- a/apps/meteor/app/meteor-accounts-saml/server/lib/SAML.ts +++ b/apps/meteor/app/meteor-accounts-saml/server/lib/SAML.ts @@ -7,10 +7,10 @@ import { TAPi18n } from 'meteor/rocketchat:tap-i18n'; import fiber from 'fibers'; import { escapeRegExp, escapeHTML } from '@rocket.chat/string-helpers'; import { IUser, IIncomingMessage } from '@rocket.chat/core-typings'; +import { CredentialTokens } from '@rocket.chat/models'; import { settings } from '../../../settings/server'; import { Users, Rooms } from '../../../models/server'; -import { CredentialTokens } from '../../../models/server/raw'; import { saveUserIdentity, createRoom, generateUsernameSuggestion, addUserToRoom } from '../../../lib/server/functions'; import { SAMLServiceProvider } from './ServiceProvider'; import { IServiceProviderOptions } from '../definition/IServiceProviderOptions'; diff --git a/apps/meteor/app/metrics/server/lib/collectMetrics.ts b/apps/meteor/app/metrics/server/lib/collectMetrics.ts index 61eacebba057..81b5d7ceccd6 100644 --- a/apps/meteor/app/metrics/server/lib/collectMetrics.ts +++ b/apps/meteor/app/metrics/server/lib/collectMetrics.ts @@ -6,11 +6,11 @@ import _ from 'underscore'; import gcStats from 'prometheus-gc-stats'; import { Meteor } from 'meteor/meteor'; import { Facts } from 'meteor/facts-base'; +import { Statistics } from '@rocket.chat/models'; import { Info, getOplogInfo } from '../../../utils/server'; import { getControl } from '../../../../server/lib/migrations'; import { settings } from '../../../settings/server'; -import { Statistics } from '../../../models/server/raw'; import { SystemLogger } from '../../../../server/lib/logger/system'; import { metrics } from './metrics'; import { getAppsStatistics } from '../../../statistics/server/lib/getAppsStatistics'; diff --git a/apps/meteor/app/models/server/index.js b/apps/meteor/app/models/server/index.js index 24957884d25d..697bad8152da 100644 --- a/apps/meteor/app/models/server/index.js +++ b/apps/meteor/app/models/server/index.js @@ -10,10 +10,10 @@ import LivechatCustomField from './models/LivechatCustomField'; import LivechatDepartment from './models/LivechatDepartment'; import LivechatDepartmentAgents from './models/LivechatDepartmentAgents'; import LivechatRooms from './models/LivechatRooms'; -import LivechatVisitors from './models/LivechatVisitors'; import LivechatInquiry from './models/LivechatInquiry'; import OmnichannelQueue from './models/OmnichannelQueue'; import ImportData from './models/ImportData'; +import './lib/watchModels'; export { AppsLogsModel } from './models/apps-logs-model'; export { AppsPersistenceModel } from './models/apps-persistence-model'; @@ -22,7 +22,6 @@ export { FederationRoomEvents } from './models/FederationRoomEvents'; export { MatrixBridgedRoom } from './models/MatrixBridgedRoom'; export { MatrixBridgedUser } from './models/MatrixBridgedUser'; - export { Base, BaseDb, @@ -36,7 +35,6 @@ export { LivechatDepartment, LivechatDepartmentAgents, LivechatRooms, - LivechatVisitors, LivechatInquiry, OmnichannelQueue, ImportData, diff --git a/apps/meteor/app/models/server/lib/watchModels.ts b/apps/meteor/app/models/server/lib/watchModels.ts new file mode 100644 index 000000000000..0b9c50753126 --- /dev/null +++ b/apps/meteor/app/models/server/lib/watchModels.ts @@ -0,0 +1,73 @@ +import { + Messages, + Users, + Subscriptions, + Settings, + LivechatInquiry, + LivechatDepartmentAgents, + Rooms, + UsersSessions, + Roles, + LoginServiceConfiguration, + InstanceStatus, + IntegrationHistory, + Integrations, + EmailInbox, + PbxEvents, + Permissions, +} from '@rocket.chat/models'; + +import { api } from '../../../../server/sdk/api'; +import { BaseDbWatch } from '../models/_BaseDb'; +import { initWatchers } from '../../../../server/modules/watchers/watchers.module'; +import { isRunningMs } from '../../../../server/lib/isRunningMs'; +import { BaseRaw } from '../../../../server/models/raw/BaseRaw'; +import MessagesModel from '../models/Messages'; +import UsersModel from '../models/Users'; +import SubscriptionsModel from '../models/Subscriptions'; +import SettingsModel from '../models/Settings'; +import LivechatInquiryModel from '../models/LivechatInquiry'; +import LivechatDepartmentAgentsModel from '../models/LivechatDepartmentAgents'; +import RoomsModel from '../models/Rooms'; + +const map = { + [Messages.col.collectionName]: MessagesModel, + [Users.col.collectionName]: UsersModel, + [Subscriptions.col.collectionName]: SubscriptionsModel, + [Settings.col.collectionName]: SettingsModel, + [LivechatInquiry.col.collectionName]: LivechatInquiryModel, + [LivechatDepartmentAgents.col.collectionName]: LivechatDepartmentAgentsModel, + [Rooms.col.collectionName]: RoomsModel, +}; + +if (!isRunningMs()) { + const models = { + Messages, + Users, + Subscriptions, + Settings, + LivechatInquiry, + LivechatDepartmentAgents, + UsersSessions, + Permissions, + Roles, + Rooms, + LoginServiceConfiguration, + InstanceStatus, + IntegrationHistory, + Integrations, + EmailInbox, + PbxEvents, + }; + + initWatchers(models, api.broadcastLocal.bind(api), (model, fn) => { + const { collectionName } = (model as BaseRaw).col; + + const meteorModel = map[collectionName] || new BaseDbWatch(collectionName); + if (!meteorModel) { + return; + } + + meteorModel.on('change', fn); + }); +} diff --git a/apps/meteor/app/models/server/models/LivechatVisitors.js b/apps/meteor/app/models/server/models/LivechatVisitors.js deleted file mode 100644 index ffffe1095fcd..000000000000 --- a/apps/meteor/app/models/server/models/LivechatVisitors.js +++ /dev/null @@ -1,253 +0,0 @@ -import _ from 'underscore'; -import s from 'underscore.string'; - -import { Base } from './_Base'; -import Settings from './Settings'; - -export class LivechatVisitors extends Base { - constructor() { - super('livechat_visitor'); - - this.tryEnsureIndex({ token: 1 }); - this.tryEnsureIndex({ 'phone.phoneNumber': 1 }, { sparse: true }); - this.tryEnsureIndex({ 'visitorEmails.address': 1 }, { sparse: true }); - this.tryEnsureIndex({ name: 1 }, { sparse: true }); - this.tryEnsureIndex({ username: 1 }); - this.tryEnsureIndex({ 'contactManager.username': 1 }, { sparse: true }); - } - - /** - * Gets visitor by token - * @param {string} token - Visitor token - */ - getVisitorByToken(token, options) { - const query = { - token, - }; - - return this.findOne(query, options); - } - - /** - * Find visitors by _id - * @param {string} token - Visitor token - */ - findById(_id, options) { - const query = { - _id, - }; - - return this.find(query, options); - } - - /** - * Find One visitor by _id - */ - findOneById(_id, options) { - const query = { - _id, - }; - - return this.findOne(query, options); - } - - /** - * Gets visitor by token - * @param {string} token - Visitor token - */ - findVisitorByToken(token) { - const query = { - token, - }; - - return this.find(query); - } - - updateLivechatDataByToken(token, key, value, overwrite = true) { - const query = { - token, - }; - - if (!overwrite) { - const user = this.findOne(query, { fields: { livechatData: 1 } }); - if (user.livechatData && typeof user.livechatData[key] !== 'undefined') { - return true; - } - } - - const update = { - $set: { - [`livechatData.${key}`]: value, - }, - }; - - return this.update(query, update); - } - - updateLastAgentByToken(token, lastAgent) { - const query = { - token, - }; - - const update = { - $set: { - lastAgent, - }, - }; - - return this.update(query, update); - } - - /** - * Find a visitor by their phone number - * @return {object} User from db - */ - findOneVisitorByPhone(phone) { - const query = { - 'phone.phoneNumber': phone, - }; - - return this.findOne(query); - } - - getVisitorsBetweenDate(date) { - const query = { - _updatedAt: { - $gte: date.gte, // ISO Date, ts >= date.gte - $lt: date.lt, // ISODate, ts < date.lt - }, - }; - - return this.find(query, { fields: { _id: 1 } }); - } - - /** - * Get the next visitor name - * @return {string} The next visitor name - */ - getNextVisitorUsername() { - const query = { - _id: 'Livechat_guest_count', - }; - - const update = { - $inc: { - value: 1, - }, - }; - - const livechatCount = Settings.findAndModify(query, null, update); - - return `guest-${livechatCount.value.value + 1}`; - } - - updateById(_id, update) { - return this.update({ _id }, update); - } - - saveGuestById(_id, data) { - const setData = {}; - const unsetData = {}; - - if (data.name) { - if (!_.isEmpty(s.trim(data.name))) { - setData.name = s.trim(data.name); - } else { - unsetData.name = 1; - } - } - - if (data.email) { - if (!_.isEmpty(s.trim(data.email))) { - setData.visitorEmails = [{ address: s.trim(data.email) }]; - } else { - unsetData.visitorEmails = 1; - } - } - - if (data.phone) { - if (!_.isEmpty(s.trim(data.phone))) { - setData.phone = [{ phoneNumber: s.trim(data.phone) }]; - } else { - unsetData.phone = 1; - } - } - - if (data.livechatData) { - Object.keys(data.livechatData).forEach((key) => { - const value = s.trim(data.livechatData[key]); - if (value) { - setData[`livechatData.${key}`] = value; - } else { - unsetData[`livechatData.${key}`] = 1; - } - }); - } - - const update = {}; - - if (!_.isEmpty(setData)) { - update.$set = setData; - } - - if (!_.isEmpty(unsetData)) { - update.$unset = unsetData; - } - - if (_.isEmpty(update)) { - return true; - } - - return this.update({ _id }, update); - } - - findOneGuestByEmailAddress(emailAddress) { - const query = { - 'visitorEmails.address': String(emailAddress).toLowerCase(), - }; - - return this.findOne(query); - } - - saveGuestEmailPhoneById(_id, emails, phones) { - const update = { - $addToSet: {}, - }; - - const saveEmail = [] - .concat(emails) - .filter((email) => email && email.trim()) - .map((email) => ({ address: email })); - - if (saveEmail.length > 0) { - update.$addToSet.visitorEmails = { $each: saveEmail }; - } - - const savePhone = [] - .concat(phones) - .filter((phone) => phone && phone.trim().replace(/[^\d]/g, '')) - .map((phone) => ({ phoneNumber: phone })); - - if (savePhone.length > 0) { - update.$addToSet.phone = { $each: savePhone }; - } - - if (!update.$addToSet.visitorEmails && !update.$addToSet.phone) { - return; - } - - return this.update({ _id }, update); - } - - // REMOVE - removeDepartmentById(_id) { - return this.update({ _id }, { $unset: { department: 1 } }); - } - - removeById(_id) { - const query = { _id }; - return this.remove(query); - } -} - -export default new LivechatVisitors(); diff --git a/apps/meteor/app/models/server/models/Rooms.js b/apps/meteor/app/models/server/models/Rooms.js index e86f9fa054c0..7d6d4edbc772 100644 --- a/apps/meteor/app/models/server/models/Rooms.js +++ b/apps/meteor/app/models/server/models/Rooms.js @@ -329,7 +329,7 @@ export class Rooms extends Base { let channelName = s.trim(name); try { // TODO evaluate if this function call should be here - const { getValidRoomName } = Promise.await(import('../../../utils/lib/getValidRoomName')); + const { getValidRoomName } = Promise.await(import('../../../utils/server/lib/getValidRoomName')); channelName = getValidRoomName(channelName, null, { allowDuplicates: true }); } catch (e) { console.error(e); diff --git a/apps/meteor/app/models/server/models/_BaseDb.js b/apps/meteor/app/models/server/models/_BaseDb.js index 64bc40d081f8..b984ad02f2f9 100644 --- a/apps/meteor/app/models/server/models/_BaseDb.js +++ b/apps/meteor/app/models/server/models/_BaseDb.js @@ -7,21 +7,11 @@ import _ from 'underscore'; import { setUpdatedAt } from '../lib/setUpdatedAt'; import { metrics } from '../../../metrics/server/lib/metrics'; import { getOplogHandle } from './_oplogHandle'; -import { SystemLogger } from '../../../../server/lib/logger/system'; import { isRunningMs } from '../../../../server/lib/isRunningMs'; +import { trash } from '../../../../server/database/trash'; const baseName = 'rocketchat_'; -export const trash = new Mongo.Collection(`${baseName}_trash`); -try { - trash._ensureIndex({ __collection__: 1 }); - trash._ensureIndex({ _deletedAt: 1 }, { expireAfterSeconds: 60 * 60 * 24 * 30 }); - - trash._ensureIndex({ rid: 1, __collection__: 1, _deletedAt: 1 }); -} catch (e) { - SystemLogger.error(e); -} - const actions = { i: 'insert', u: 'update', diff --git a/apps/meteor/app/models/server/raw/CredentialTokens.ts b/apps/meteor/app/models/server/raw/CredentialTokens.ts deleted file mode 100644 index aad8ddd08d17..000000000000 --- a/apps/meteor/app/models/server/raw/CredentialTokens.ts +++ /dev/null @@ -1,30 +0,0 @@ -import { ICredentialToken as T } from '@rocket.chat/core-typings'; - -import { BaseRaw, IndexSpecification } from './BaseRaw'; - -export class CredentialTokensRaw extends BaseRaw { - protected modelIndexes(): IndexSpecification[] { - return [{ key: { expireAt: 1 }, sparse: true, expireAfterSeconds: 0 }]; - } - - async create(_id: string, userInfo: T['userInfo']): Promise { - const validForMilliseconds = 60000; // Valid for 60 seconds - const token = { - _id, - userInfo, - expireAt: new Date(Date.now() + validForMilliseconds), - }; - - await this.insertOne(token); - return token; - } - - findOneNotExpiredById(_id: string): Promise { - const query = { - _id, - expireAt: { $gt: new Date() }, - }; - - return this.findOne(query); - } -} diff --git a/apps/meteor/app/models/server/raw/CustomSounds.ts b/apps/meteor/app/models/server/raw/CustomSounds.ts deleted file mode 100644 index f83948d6cfa9..000000000000 --- a/apps/meteor/app/models/server/raw/CustomSounds.ts +++ /dev/null @@ -1,44 +0,0 @@ -import { Cursor, FindOneOptions, InsertOneWriteOpResult, UpdateWriteOpResult, WithId, WithoutProjection } from 'mongodb'; -import { ICustomSound as T } from '@rocket.chat/core-typings'; - -import { BaseRaw, IndexSpecification } from './BaseRaw'; - -export class CustomSoundsRaw extends BaseRaw { - protected modelIndexes(): IndexSpecification[] { - return [{ key: { name: 1 } }]; - } - - // find - findByName(name: string, options: WithoutProjection>): Cursor { - const query = { - name, - }; - - return this.find(query, options); - } - - findByNameExceptId(name: string, except: string, options: WithoutProjection>): Cursor { - const query = { - _id: { $nin: [except] }, - name, - }; - - return this.find(query, options); - } - - // update - setName(_id: string, name: string): Promise { - const update = { - $set: { - name, - }, - }; - - return this.updateOne({ _id }, update); - } - - // INSERT - create(data: T): Promise>> { - return this.insertOne(data); - } -} diff --git a/apps/meteor/app/models/server/raw/CustomUserStatus.ts b/apps/meteor/app/models/server/raw/CustomUserStatus.ts deleted file mode 100644 index d23dc8fd5a13..000000000000 --- a/apps/meteor/app/models/server/raw/CustomUserStatus.ts +++ /dev/null @@ -1,62 +0,0 @@ -import { Cursor, FindOneOptions, InsertOneWriteOpResult, UpdateWriteOpResult, WithId, WithoutProjection } from 'mongodb'; -import { ICustomUserStatus as T } from '@rocket.chat/core-typings'; - -import { BaseRaw, IndexSpecification } from './BaseRaw'; - -export class CustomUserStatusRaw extends BaseRaw { - protected modelIndexes(): IndexSpecification[] { - return [{ key: { name: 1 } }]; - } - - // find one by name - - async findOneByName(name: string, options?: undefined): Promise; - - async findOneByName(name: string, options?: WithoutProjection>): Promise { - return options ? this.findOne({ name }, options) : this.findOne({ name }); - } - - // find - findByName(name: string, options: WithoutProjection>): Cursor { - const query = { - name, - }; - - return this.find(query, options); - } - - findByNameExceptId(name: string, except: string, options: WithoutProjection>): Cursor { - const query = { - _id: { $nin: [except] }, - name, - }; - - return this.find(query, options); - } - - // update - setName(_id: string, name: string): Promise { - const update = { - $set: { - name, - }, - }; - - return this.updateOne({ _id }, update); - } - - setStatusType(_id: string, statusType: string): Promise { - const update = { - $set: { - statusType, - }, - }; - - return this.updateOne({ _id }, update); - } - - // INSERT - create(data: T): Promise>> { - return this.insertOne(data); - } -} diff --git a/apps/meteor/app/models/server/raw/EmailInbox.ts b/apps/meteor/app/models/server/raw/EmailInbox.ts deleted file mode 100644 index 73bd24cadfd2..000000000000 --- a/apps/meteor/app/models/server/raw/EmailInbox.ts +++ /dev/null @@ -1,9 +0,0 @@ -import type { IEmailInbox } from '@rocket.chat/core-typings'; - -import { BaseRaw, IndexSpecification } from './BaseRaw'; - -export class EmailInboxRaw extends BaseRaw { - protected modelIndexes(): IndexSpecification[] { - return [{ key: { email: 1 }, unique: true }]; - } -} diff --git a/apps/meteor/app/models/server/raw/EmailMessageHistory.ts b/apps/meteor/app/models/server/raw/EmailMessageHistory.ts deleted file mode 100644 index f2eefedffe94..000000000000 --- a/apps/meteor/app/models/server/raw/EmailMessageHistory.ts +++ /dev/null @@ -1,18 +0,0 @@ -import { InsertOneWriteOpResult, WithId } from 'mongodb'; -import { IEmailMessageHistory as T } from '@rocket.chat/core-typings'; - -import { BaseRaw, IndexSpecification } from './BaseRaw'; - -export class EmailMessageHistoryRaw extends BaseRaw { - protected modelIndexes(): IndexSpecification[] { - return [{ key: { createdAt: 1 }, expireAfterSeconds: 60 * 60 * 24 }]; - } - - async create({ _id, email }: T): Promise>> { - return this.insertOne({ - _id, - email, - createdAt: new Date(), - }); - } -} diff --git a/apps/meteor/app/models/server/raw/ImportData.ts b/apps/meteor/app/models/server/raw/ImportData.ts deleted file mode 100644 index 0873627a6309..000000000000 --- a/apps/meteor/app/models/server/raw/ImportData.ts +++ /dev/null @@ -1,18 +0,0 @@ -import { Cursor } from 'mongodb'; -import type { IImportRecord, IImportUserRecord, IImportMessageRecord, IImportChannelRecord } from '@rocket.chat/core-typings'; - -import { BaseRaw } from './BaseRaw'; - -export class ImportDataRaw extends BaseRaw { - getAllUsers(): Cursor { - return this.find({ dataType: 'user' }) as Cursor; - } - - getAllMessages(): Cursor { - return this.find({ dataType: 'message' }) as Cursor; - } - - getAllChannels(): Cursor { - return this.find({ dataType: 'channel' }) as Cursor; - } -} diff --git a/apps/meteor/app/models/server/raw/InstanceStatus.ts b/apps/meteor/app/models/server/raw/InstanceStatus.ts deleted file mode 100644 index 80974cf4c6d4..000000000000 --- a/apps/meteor/app/models/server/raw/InstanceStatus.ts +++ /dev/null @@ -1,5 +0,0 @@ -import type { IInstanceStatus } from '@rocket.chat/core-typings'; - -import { BaseRaw } from './BaseRaw'; - -export class InstanceStatusRaw extends BaseRaw {} diff --git a/apps/meteor/app/models/server/raw/LivechatCustomField.ts b/apps/meteor/app/models/server/raw/LivechatCustomField.ts deleted file mode 100644 index 60593e573eb9..000000000000 --- a/apps/meteor/app/models/server/raw/LivechatCustomField.ts +++ /dev/null @@ -1,5 +0,0 @@ -import type { ILivechatCustomField } from '@rocket.chat/core-typings'; - -import { BaseRaw } from './BaseRaw'; - -export class LivechatCustomFieldRaw extends BaseRaw {} diff --git a/apps/meteor/app/models/server/raw/LivechatTrigger.ts b/apps/meteor/app/models/server/raw/LivechatTrigger.ts deleted file mode 100644 index 813d13d7ca95..000000000000 --- a/apps/meteor/app/models/server/raw/LivechatTrigger.ts +++ /dev/null @@ -1,18 +0,0 @@ -import { Cursor, UpdateWriteOpResult } from 'mongodb'; -import type { ILivechatTrigger } from '@rocket.chat/core-typings'; - -import { BaseRaw, IndexSpecification } from './BaseRaw'; - -export class LivechatTriggerRaw extends BaseRaw { - protected modelIndexes(): IndexSpecification[] { - return [{ key: { enabled: 1 } }]; - } - - findEnabled(): Cursor { - return this.find({ enabled: true }); - } - - updateById(_id: string, data: ILivechatTrigger): Promise { - return this.updateOne({ _id }, { $set: data }); - } -} diff --git a/apps/meteor/app/models/server/raw/LivechatVisitors.ts b/apps/meteor/app/models/server/raw/LivechatVisitors.ts deleted file mode 100644 index 222b44918617..000000000000 --- a/apps/meteor/app/models/server/raw/LivechatVisitors.ts +++ /dev/null @@ -1,123 +0,0 @@ -import { escapeRegExp } from '@rocket.chat/string-helpers'; -import { AggregationCursor, Cursor, FilterQuery, FindOneOptions, UpdateWriteOpResult, WithoutProjection } from 'mongodb'; -import type { ILivechatVisitor } from '@rocket.chat/core-typings'; - -import { BaseRaw } from './BaseRaw'; - -export class LivechatVisitorsRaw extends BaseRaw { - findOneById(_id: string, options: WithoutProjection>): Promise { - const query = { - _id, - }; - - return this.findOne(query, options); - } - - getVisitorByToken(token: string, options: WithoutProjection>): Promise { - const query = { - token, - }; - - return this.findOne(query, options); - } - - getVisitorsBetweenDate({ start, end, department }: { start: Date; end: Date; department: string }): Cursor { - const query = { - _updatedAt: { - $gte: new Date(start), - $lt: new Date(end), - }, - ...(department && department !== 'undefined' && { department }), - }; - - return this.find(query, { projection: { _id: 1 } }); - } - - findByNameRegexWithExceptionsAndConditions

( - searchTerm: string, - exceptions: string[] = [], - conditions: FilterQuery = {}, - options: FindOneOptions

= {}, - ): AggregationCursor< - P & { - custom_name: string; - } - > { - if (!Array.isArray(exceptions)) { - exceptions = [exceptions]; - } - - const nameRegex = new RegExp(`^${escapeRegExp(searchTerm).trim()}`, 'i'); - - const match = { - $match: { - name: nameRegex, - _id: { - $nin: exceptions, - }, - ...conditions, - }, - }; - - const { projection, sort, skip, limit } = options; - const project = { - $project: { - // TODO: move this logic to client - // eslint-disable-next-line @typescript-eslint/camelcase - custom_name: { $concat: ['$username', ' - ', '$name'] }, - ...projection, - }, - }; - - const order = { $sort: sort || { name: 1 } }; - const params: Record[] = [match, order, skip && { $skip: skip }, limit && { $limit: limit }, project].filter( - Boolean, - ) as Record[]; - - return this.col.aggregate(params); - } - - /** - * Find visitors by their email or phone or username or name - * @return [{object}] List of Visitors from db - */ - findVisitorsByEmailOrPhoneOrNameOrUsername( - _emailOrPhoneOrNameOrUsername: string, - options: FindOneOptions, - ): Cursor { - const filter = new RegExp(_emailOrPhoneOrNameOrUsername, 'i'); - const query = { - $or: [ - { - 'visitorEmails.address': _emailOrPhoneOrNameOrUsername, - }, - { - 'phone.phoneNumber': _emailOrPhoneOrNameOrUsername, - }, - { - name: filter, - }, - { - username: filter, - }, - ], - }; - - return this.find(query, options); - } - - removeContactManagerByUsername(manager: string): Promise { - return this.updateMany( - { - contactManager: { - username: manager, - }, - }, - { - $unset: { - contactManager: true, - }, - }, - ); - } -} diff --git a/apps/meteor/app/models/server/raw/LoginServiceConfiguration.ts b/apps/meteor/app/models/server/raw/LoginServiceConfiguration.ts deleted file mode 100644 index edbe9b6e3681..000000000000 --- a/apps/meteor/app/models/server/raw/LoginServiceConfiguration.ts +++ /dev/null @@ -1,5 +0,0 @@ -import type { ILoginServiceConfiguration } from '@rocket.chat/core-typings'; - -import { BaseRaw } from './BaseRaw'; - -export class LoginServiceConfigurationRaw extends BaseRaw {} diff --git a/apps/meteor/app/models/server/raw/OAuthApps.ts b/apps/meteor/app/models/server/raw/OAuthApps.ts deleted file mode 100644 index 760aae203ac8..000000000000 --- a/apps/meteor/app/models/server/raw/OAuthApps.ts +++ /dev/null @@ -1,12 +0,0 @@ -import { IOAuthApps } from '@rocket.chat/core-typings'; - -import { BaseRaw } from './BaseRaw'; - -export class OAuthAppsRaw extends BaseRaw { - findOneAuthAppByIdOrClientId(props: { clientId: string } | { appId: string }): Promise { - return this.findOne({ - ...('appId' in props && { _id: props.appId }), - ...('clientId' in props && { _id: props.clientId }), - }); - } -} diff --git a/apps/meteor/app/models/server/raw/OEmbedCache.ts b/apps/meteor/app/models/server/raw/OEmbedCache.ts deleted file mode 100644 index c43b38c979d7..000000000000 --- a/apps/meteor/app/models/server/raw/OEmbedCache.ts +++ /dev/null @@ -1,31 +0,0 @@ -import { DeleteWriteOpResultObject } from 'mongodb'; -import type { IOEmbedCache } from '@rocket.chat/core-typings'; - -import { BaseRaw, IndexSpecification } from './BaseRaw'; - -type T = IOEmbedCache; - -export class OEmbedCacheRaw extends BaseRaw { - protected modelIndexes(): IndexSpecification[] { - return [{ key: { updatedAt: 1 } }]; - } - - async createWithIdAndData(_id: string, data: any): Promise { - const record = { - _id, - data, - updatedAt: new Date(), - }; - record._id = (await this.insertOne(record)).insertedId; - return record; - } - - removeAfterDate(date: Date): Promise { - const query = { - updatedAt: { - $lte: date, - }, - }; - return this.deleteMany(query); - } -} diff --git a/apps/meteor/app/models/server/raw/ReadReceipts.ts b/apps/meteor/app/models/server/raw/ReadReceipts.ts deleted file mode 100644 index 95b99d35f791..000000000000 --- a/apps/meteor/app/models/server/raw/ReadReceipts.ts +++ /dev/null @@ -1,14 +0,0 @@ -import { Cursor } from 'mongodb'; -import { ReadReceipt } from '@rocket.chat/core-typings'; - -import { BaseRaw, IndexSpecification } from './BaseRaw'; - -export class ReadReceiptsRaw extends BaseRaw { - protected modelIndexes(): IndexSpecification[] { - return [{ key: { roomId: 1, userId: 1, messageId: 1 }, unique: true }, { key: { messageId: 1 } }]; - } - - findByMessageId(messageId: string): Cursor { - return this.find({ messageId }); - } -} diff --git a/apps/meteor/app/models/server/raw/Reports.ts b/apps/meteor/app/models/server/raw/Reports.ts deleted file mode 100644 index 5b0e0b4a4ba6..000000000000 --- a/apps/meteor/app/models/server/raw/Reports.ts +++ /dev/null @@ -1,15 +0,0 @@ -import type { IReport, IMessage } from '@rocket.chat/core-typings'; - -import { BaseRaw } from './BaseRaw'; - -export class ReportsRaw extends BaseRaw { - createWithMessageDescriptionAndUserId(message: IMessage, description: string, userId: string): ReturnType['insertOne']> { - const record: Pick = { - message, - description, - ts: new Date(), - userId, - }; - return this.insertOne(record); - } -} diff --git a/apps/meteor/app/models/server/raw/SmarshHistory.ts b/apps/meteor/app/models/server/raw/SmarshHistory.ts deleted file mode 100644 index 8cb860993e96..000000000000 --- a/apps/meteor/app/models/server/raw/SmarshHistory.ts +++ /dev/null @@ -1,7 +0,0 @@ -import type { ISmarshHistory } from '@rocket.chat/core-typings'; - -import { BaseRaw } from './BaseRaw'; - -type T = ISmarshHistory; - -export class SmarshHistoryRaw extends BaseRaw {} diff --git a/apps/meteor/app/models/server/raw/Statistics.ts b/apps/meteor/app/models/server/raw/Statistics.ts deleted file mode 100644 index 70768a77ce46..000000000000 --- a/apps/meteor/app/models/server/raw/Statistics.ts +++ /dev/null @@ -1,20 +0,0 @@ -import type { IStats } from '@rocket.chat/core-typings'; - -import { BaseRaw, IndexSpecification } from './BaseRaw'; - -export class StatisticsRaw extends BaseRaw { - protected modelIndexes(): IndexSpecification[] { - return [{ key: { createdAt: -1 } }]; - } - - async findLast(): Promise { - const options = { - sort: { - createdAt: -1, - }, - limit: 1, - }; - const records = await this.find({}, options).toArray(); - return records?.[0]; - } -} diff --git a/apps/meteor/app/models/server/raw/UserDataFiles.ts b/apps/meteor/app/models/server/raw/UserDataFiles.ts deleted file mode 100644 index 3e441346ca0f..000000000000 --- a/apps/meteor/app/models/server/raw/UserDataFiles.ts +++ /dev/null @@ -1,29 +0,0 @@ -import { FindOneOptions, InsertOneWriteOpResult, WithId, WithoutProjection } from 'mongodb'; -import { IUserDataFile as T } from '@rocket.chat/core-typings'; - -import { BaseRaw, IndexSpecification } from './BaseRaw'; - -export class UserDataFilesRaw extends BaseRaw { - protected modelIndexes(): IndexSpecification[] { - return [{ key: { userId: 1 } }]; - } - - findLastFileByUser(userId: string, options: WithoutProjection> = {}): Promise { - const query = { - userId, - }; - - options.sort = { _updatedAt: -1 }; - return this.findOne(query, options); - } - - // INSERT - create(data: T): Promise>> { - const userDataFile = { - createdAt: new Date(), - ...data, - }; - - return this.insertOne(userDataFile); - } -} diff --git a/apps/meteor/app/models/server/raw/UsersSessions.ts b/apps/meteor/app/models/server/raw/UsersSessions.ts deleted file mode 100644 index f91616f83c9f..000000000000 --- a/apps/meteor/app/models/server/raw/UsersSessions.ts +++ /dev/null @@ -1,20 +0,0 @@ -import type { IUserSession } from '@rocket.chat/core-typings'; - -import { BaseRaw } from './BaseRaw'; - -export class UsersSessionsRaw extends BaseRaw { - clearConnectionsFromInstanceId(instanceId: string[]): ReturnType['updateMany']> { - return this.col.updateMany( - {}, - { - $pull: { - connections: { - instanceId: { - $nin: instanceId, - }, - }, - }, - }, - ); - } -} diff --git a/apps/meteor/app/models/server/raw/WebdavAccounts.ts b/apps/meteor/app/models/server/raw/WebdavAccounts.ts deleted file mode 100644 index 1e6d635711db..000000000000 --- a/apps/meteor/app/models/server/raw/WebdavAccounts.ts +++ /dev/null @@ -1,43 +0,0 @@ -/** - * Webdav Accounts model - */ -import type { FindOneOptions, Cursor, DeleteWriteOpResultObject } from 'mongodb'; -import type { IWebdavAccount } from '@rocket.chat/core-typings'; - -import { BaseRaw, IndexSpecification } from './BaseRaw'; - -type T = IWebdavAccount; - -export class WebdavAccountsRaw extends BaseRaw { - protected modelIndexes(): IndexSpecification[] { - return [{ key: { userId: 1 } }]; - } - - findOneByIdAndUserId(_id: string, userId: string, options: FindOneOptions): Promise { - return this.findOne({ _id, userId }, options); - } - - findOneByUserIdServerUrlAndUsername( - { - userId, - serverURL, - username, - }: { - userId: string; - serverURL: string; - username: string; - }, - options: FindOneOptions, - ): Promise { - return this.findOne({ userId, serverURL, username }, options); - } - - findWithUserId(userId: string, options: FindOneOptions): Cursor { - const query = { userId }; - return this.find(query, options); - } - - removeByUserAndId(_id: string, userId: string): Promise { - return this.deleteOne({ _id, userId }); - } -} diff --git a/apps/meteor/app/models/server/raw/_Users.d.ts b/apps/meteor/app/models/server/raw/_Users.d.ts deleted file mode 100644 index 573117e868fb..000000000000 --- a/apps/meteor/app/models/server/raw/_Users.d.ts +++ /dev/null @@ -1,14 +0,0 @@ -import { UpdateWriteOpResult } from 'mongodb'; -import type { IRole, IUser } from '@rocket.chat/core-typings'; - -import { BaseRaw } from './BaseRaw'; - -export interface IUserRaw extends BaseRaw { - isUserInRole(uid: IUser['_id'], roleId: IRole['_id']): Promise; - removeRolesByUserId(uid: IUser['_id'], roles: IRole['_id'][]): Promise; - findUsersInRoles(roles: IRole['_id'][]): Promise; - addRolesByUserId(uid: IUser['_id'], roles: IRole['_id'][]): Promise; - isUserInRoleScope(uid: IUser['_id']): Promise; - new (...args: any): IUser; -} -export const UsersRaw: IUserRaw; diff --git a/apps/meteor/app/models/server/raw/index.ts b/apps/meteor/app/models/server/raw/index.ts deleted file mode 100644 index 5213d78ffcf3..000000000000 --- a/apps/meteor/app/models/server/raw/index.ts +++ /dev/null @@ -1,186 +0,0 @@ -import { MongoInternals } from 'meteor/mongo'; - -import { AvatarsRaw } from './Avatars'; -import { AnalyticsRaw } from './Analytics'; -import { api } from '../../../../server/sdk/api'; -import { BaseDbWatch, trash } from '../models/_BaseDb'; -import { CredentialTokensRaw } from './CredentialTokens'; -import { CustomSoundsRaw } from './CustomSounds'; -import { CustomUserStatusRaw } from './CustomUserStatus'; -import { EmailInboxRaw } from './EmailInbox'; -import { EmailMessageHistoryRaw } from './EmailMessageHistory'; -import { EmojiCustomRaw } from './EmojiCustom'; -import { ExportOperationsRaw } from './ExportOperations'; -import { FederationKeysRaw } from './FederationKeys'; -import { FederationServersRaw } from './FederationServers'; -import { ImportDataRaw } from './ImportData'; -import { initWatchers } from '../../../../server/modules/watchers/watchers.module'; -import { InstanceStatusRaw } from './InstanceStatus'; -import { IntegrationHistoryRaw } from './IntegrationHistory'; -import { IntegrationsRaw } from './Integrations'; -import { InvitesRaw } from './Invites'; -import { LivechatAgentActivityRaw } from './LivechatAgentActivity'; -import { LivechatBusinessHoursRaw } from './LivechatBusinessHours'; -import { LivechatCustomFieldRaw } from './LivechatCustomField'; -import { LivechatDepartmentAgentsRaw } from './LivechatDepartmentAgents'; -import { LivechatDepartmentRaw } from './LivechatDepartment'; -import { LivechatInquiryRaw } from './LivechatInquiry'; -import { LivechatRoomsRaw } from './LivechatRooms'; -import { LivechatTriggerRaw } from './LivechatTrigger'; -import { LivechatVisitorsRaw } from './LivechatVisitors'; -import { LoginServiceConfigurationRaw } from './LoginServiceConfiguration'; -import { MessagesRaw } from './Messages'; -import { NotificationQueueRaw } from './NotificationQueue'; -import { OAuthAppsRaw } from './OAuthApps'; -import { OEmbedCacheRaw } from './OEmbedCache'; -import { OmnichannelQueueRaw } from './OmnichannelQueue'; -import { PermissionsRaw } from './Permissions'; -import { readSecondaryPreferred } from '../../../../server/database/readSecondaryPreferred'; -import { ReadReceiptsRaw } from './ReadReceipts'; -import { ReportsRaw } from './Reports'; -import { RolesRaw } from './Roles'; -import { RoomsRaw } from './Rooms'; -import { ServerEventsRaw } from './ServerEvents'; -import { SessionsRaw } from './Sessions'; -import { SettingsRaw } from './Settings'; -import { SmarshHistoryRaw } from './SmarshHistory'; -import { StatisticsRaw } from './Statistics'; -import { SubscriptionsRaw } from './Subscriptions'; -import { UsersRaw } from './Users'; -import { UsersSessionsRaw } from './UsersSessions'; -import { UserDataFilesRaw } from './UserDataFiles'; -import { UploadsRaw } from './Uploads'; -import { WebdavAccountsRaw } from './WebdavAccounts'; -import { VoipRoomsRaw } from './VoipRooms'; -import ImportDataModel from '../models/ImportData'; -import LivechatBusinessHoursModel from '../models/LivechatBusinessHours'; -import LivechatCustomFieldModel from '../models/LivechatCustomField'; -import LivechatDepartmentAgentsModel from '../models/LivechatDepartmentAgents'; -import LivechatDepartmentModel from '../models/LivechatDepartment'; -import LivechatInquiryModel from '../models/LivechatInquiry'; -import LivechatRoomsModel from '../models/LivechatRooms'; -import LivechatVisitorsModel from '../models/LivechatVisitors'; -import MessagesModel from '../models/Messages'; -import OmnichannelQueueModel from '../models/OmnichannelQueue'; -import RoomsModel from '../models/Rooms'; -import SettingsModel from '../models/Settings'; -import SubscriptionsModel from '../models/Subscriptions'; -import UsersModel from '../models/Users'; -import { PbxEventsRaw } from './PbxEvents'; -import { isRunningMs } from '../../../../server/lib/isRunningMs'; - -const trashCollection = trash.rawCollection(); - -export const Users = new UsersRaw(UsersModel.model.rawCollection(), trashCollection); -export const Subscriptions = new SubscriptionsRaw(SubscriptionsModel.model.rawCollection(), { Users }, trashCollection); -export const Settings = new SettingsRaw(SettingsModel.model.rawCollection(), trashCollection); -export const Rooms = new RoomsRaw(RoomsModel.model.rawCollection(), trashCollection); -export const LivechatCustomField = new LivechatCustomFieldRaw(LivechatCustomFieldModel.model.rawCollection(), trashCollection); -export const LivechatDepartment = new LivechatDepartmentRaw(LivechatDepartmentModel.model.rawCollection(), trashCollection); -export const LivechatDepartmentAgents = new LivechatDepartmentAgentsRaw( - LivechatDepartmentAgentsModel.model.rawCollection(), - trashCollection, -); -export const LivechatRooms = new LivechatRoomsRaw(LivechatRoomsModel.model.rawCollection(), trashCollection); -export const Messages = new MessagesRaw(MessagesModel.model.rawCollection(), trashCollection); -export const LivechatVisitors = new LivechatVisitorsRaw(LivechatVisitorsModel.model.rawCollection(), trashCollection); -export const LivechatInquiry = new LivechatInquiryRaw(LivechatInquiryModel.model.rawCollection(), trashCollection); -export const LivechatBusinessHours = new LivechatBusinessHoursRaw(LivechatBusinessHoursModel.model.rawCollection(), trashCollection); -// export const Roles = new RolesRaw(RolesModel.model.rawCollection(), { Users, Subscriptions }, trashCollection); -export const OmnichannelQueue = new OmnichannelQueueRaw(OmnichannelQueueModel.model.rawCollection(), trashCollection); -export const ImportData = new ImportDataRaw(ImportDataModel.model.rawCollection(), trashCollection); - -const { db } = MongoInternals.defaultRemoteCollectionDriver().mongo; -const prefix = 'rocketchat_'; - -export const Avatars = new AvatarsRaw(db.collection(`${prefix}avatars`), trashCollection); -export const Analytics = new AnalyticsRaw( - db.collection(`${prefix}analytics`, { readPreference: readSecondaryPreferred(db) }), - trashCollection, -); -export const CustomSounds = new CustomSoundsRaw(db.collection(`${prefix}custom_sounds`), trashCollection); -export const CustomUserStatus = new CustomUserStatusRaw(db.collection(`${prefix}custom_user_status`), trashCollection); -export const CredentialTokens = new CredentialTokensRaw(db.collection(`${prefix}credential_tokens`), trashCollection); -export const EmailInbox = new EmailInboxRaw(db.collection(`${prefix}email_inbox`), trashCollection); -export const EmailMessageHistory = new EmailMessageHistoryRaw(db.collection(`${prefix}email_message_history`), trashCollection); -export const EmojiCustom = new EmojiCustomRaw(db.collection(`${prefix}custom_emoji`), trashCollection); -export const ExportOperations = new ExportOperationsRaw(db.collection(`${prefix}export_operations`), trashCollection); -export const FederationKeys = new FederationKeysRaw(db.collection(`${prefix}federation_keys`), trashCollection); -export const FederationServers = new FederationServersRaw(db.collection(`${prefix}federation_servers`), trashCollection); -export const InstanceStatus = new InstanceStatusRaw(db.collection('instances'), trashCollection, { - preventSetUpdatedAt: true, -}); -export const Integrations = new IntegrationsRaw(db.collection(`${prefix}integrations`), trashCollection); -export const IntegrationHistory = new IntegrationHistoryRaw(db.collection(`${prefix}integration_history`), trashCollection); -export const Invites = new InvitesRaw(db.collection(`${prefix}invites`), trashCollection); -export const LivechatTrigger = new LivechatTriggerRaw(db.collection(`${prefix}livechat_trigger`), trashCollection); -export const LoginServiceConfiguration = new LoginServiceConfigurationRaw( - db.collection('meteor_accounts_loginServiceConfiguration'), - trashCollection, - { preventSetUpdatedAt: true }, -); - -export const NotificationQueue = new NotificationQueueRaw(db.collection(`${prefix}notification_queue`), trashCollection); -export const OAuthApps = new OAuthAppsRaw(db.collection(`${prefix}oauth_apps`), trashCollection); -export const OEmbedCache = new OEmbedCacheRaw(db.collection(`${prefix}oembed_cache`), trashCollection); -export const Permissions = new PermissionsRaw(db.collection(`${prefix}permissions`), trashCollection); -export const ReadReceipts = new ReadReceiptsRaw(db.collection(`${prefix}read_receipts`), trashCollection); -export const Reports = new ReportsRaw(db.collection(`${prefix}reports`), trashCollection); -export const ServerEvents = new ServerEventsRaw(db.collection(`${prefix}server_events`), trashCollection); -export const Sessions = new SessionsRaw( - db.collection(`${prefix}sessions`), - db.collection(`${prefix}sessions`, { readPreference: readSecondaryPreferred(db) }), - trashCollection, -); -export const Roles = new RolesRaw(db.collection(`${prefix}roles`), { Users, Subscriptions }, trashCollection); -export const SmarshHistory = new SmarshHistoryRaw(db.collection(`${prefix}smarsh_history`), trashCollection); -export const Statistics = new StatisticsRaw(db.collection(`${prefix}statistics`), trashCollection); -export const UsersSessions = new UsersSessionsRaw(db.collection('usersSessions'), trashCollection, { - preventSetUpdatedAt: true, -}); -export const UserDataFiles = new UserDataFilesRaw(db.collection(`${prefix}user_data_files`), trashCollection); -export const Uploads = new UploadsRaw(db.collection(`${prefix}uploads`), trashCollection); -export const WebdavAccounts = new WebdavAccountsRaw(db.collection(`${prefix}webdav_accounts`), trashCollection); -export const VoipRoom = new VoipRoomsRaw(db.collection(`${prefix}room`), trashCollection); -export const PbxEvent = new PbxEventsRaw(db.collection('pbx_events'), trashCollection); -export const LivechatAgentActivity = new LivechatAgentActivityRaw(db.collection(`${prefix}livechat_agent_activity`), trashCollection); - -const map = { - [Messages.col.collectionName]: MessagesModel, - [Users.col.collectionName]: UsersModel, - [Subscriptions.col.collectionName]: SubscriptionsModel, - [Settings.col.collectionName]: SettingsModel, - [LivechatInquiry.col.collectionName]: LivechatInquiryModel, - [LivechatDepartmentAgents.col.collectionName]: LivechatDepartmentAgentsModel, - [Rooms.col.collectionName]: RoomsModel, -}; - -if (!isRunningMs()) { - const models = { - Messages, - Users, - Subscriptions, - Settings, - LivechatInquiry, - LivechatDepartmentAgents, - UsersSessions, - Permissions, - Roles, - Rooms, - LoginServiceConfiguration, - InstanceStatus, - IntegrationHistory, - Integrations, - EmailInbox, - PbxEvent, - }; - - initWatchers(models, api.broadcastLocal.bind(api), (model, fn) => { - const meteorModel = map[model.col.collectionName] || new BaseDbWatch(model.col.collectionName); - if (!meteorModel) { - return; - } - - meteorModel.on('change', fn); - }); -} diff --git a/apps/meteor/app/notification-queue/server/NotificationQueue.ts b/apps/meteor/app/notification-queue/server/NotificationQueue.ts index b6c17a60c1ab..94958c3bbf21 100644 --- a/apps/meteor/app/notification-queue/server/NotificationQueue.ts +++ b/apps/meteor/app/notification-queue/server/NotificationQueue.ts @@ -1,8 +1,8 @@ import { Meteor } from 'meteor/meteor'; import { INotification, INotificationItemPush, INotificationItemEmail, NotificationItem } from '@rocket.chat/core-typings'; import type { IUser } from '@rocket.chat/core-typings'; +import { NotificationQueue, Users } from '@rocket.chat/models'; -import { NotificationQueue, Users } from '../../models/server/raw'; import { sendEmailFromData } from '../../lib/server/functions/notifications/email'; import { PushNotification } from '../../push-notifications/server'; import { SystemLogger } from '../../../server/lib/logger/system'; diff --git a/apps/meteor/app/notifications/server/lib/Notifications.ts b/apps/meteor/app/notifications/server/lib/Notifications.ts index f1f6d46ab13f..67260293cdbe 100644 --- a/apps/meteor/app/notifications/server/lib/Notifications.ts +++ b/apps/meteor/app/notifications/server/lib/Notifications.ts @@ -4,12 +4,6 @@ import { DDPCommon } from 'meteor/ddp-common'; import { NotificationsModule } from '../../../../server/modules/notifications/notifications.module'; import { Streamer } from '../../../../server/modules/streamer/streamer.module'; import { api } from '../../../../server/sdk/api'; -import { - Subscriptions as SubscriptionsRaw, - Rooms as RoomsRaw, - Users as UsersRaw, - Settings as SettingsRaw, -} from '../../../models/server/raw'; import './Presence'; export class Stream extends Streamer { @@ -35,12 +29,7 @@ export class Stream extends Streamer { const notifications = new NotificationsModule(Stream); -notifications.configure({ - Rooms: RoomsRaw, - Subscriptions: SubscriptionsRaw, - Users: UsersRaw, - Settings: SettingsRaw, -}); +notifications.configure(); notifications.streamLocal.on('broadcast', ({ eventName, args }) => { api.broadcastLocal(eventName, ...args); diff --git a/apps/meteor/app/oauth2-server-config/server/admin/methods/addOAuthApp.js b/apps/meteor/app/oauth2-server-config/server/admin/methods/addOAuthApp.js index fecb7b41b666..d330da92ae32 100644 --- a/apps/meteor/app/oauth2-server-config/server/admin/methods/addOAuthApp.js +++ b/apps/meteor/app/oauth2-server-config/server/admin/methods/addOAuthApp.js @@ -1,10 +1,10 @@ import { Meteor } from 'meteor/meteor'; import { Random } from 'meteor/random'; import _ from 'underscore'; +import { OAuthApps } from '@rocket.chat/models'; import { hasPermission } from '../../../../authorization'; import { Users } from '../../../../models/server'; -import { OAuthApps } from '../../../../models/server/raw'; import { parseUriList } from '../functions/parseUriList'; Meteor.methods({ diff --git a/apps/meteor/app/oauth2-server-config/server/admin/methods/deleteOAuthApp.js b/apps/meteor/app/oauth2-server-config/server/admin/methods/deleteOAuthApp.js index 4bd24819b12f..7af1a14c3d59 100644 --- a/apps/meteor/app/oauth2-server-config/server/admin/methods/deleteOAuthApp.js +++ b/apps/meteor/app/oauth2-server-config/server/admin/methods/deleteOAuthApp.js @@ -1,7 +1,7 @@ import { Meteor } from 'meteor/meteor'; +import { OAuthApps } from '@rocket.chat/models'; import { hasPermission } from '../../../../authorization'; -import { OAuthApps } from '../../../../models/server/raw'; Meteor.methods({ async deleteOAuthApp(applicationId) { diff --git a/apps/meteor/app/oauth2-server-config/server/admin/methods/updateOAuthApp.js b/apps/meteor/app/oauth2-server-config/server/admin/methods/updateOAuthApp.js index 79838a227ab7..74742d07ad1c 100644 --- a/apps/meteor/app/oauth2-server-config/server/admin/methods/updateOAuthApp.js +++ b/apps/meteor/app/oauth2-server-config/server/admin/methods/updateOAuthApp.js @@ -1,8 +1,8 @@ import { Meteor } from 'meteor/meteor'; import _ from 'underscore'; +import { OAuthApps } from '@rocket.chat/models'; import { hasPermission } from '../../../../authorization'; -import { OAuthApps } from '../../../../models/server/raw'; import { Users } from '../../../../models/server'; import { parseUriList } from '../functions/parseUriList'; diff --git a/apps/meteor/app/oauth2-server-config/server/oauth/default-services.ts b/apps/meteor/app/oauth2-server-config/server/oauth/default-services.ts index 77277b7ddc3b..68d05ef7fa72 100644 --- a/apps/meteor/app/oauth2-server-config/server/oauth/default-services.ts +++ b/apps/meteor/app/oauth2-server-config/server/oauth/default-services.ts @@ -1,4 +1,4 @@ -import { OAuthApps } from '../../../models/server/raw'; +import { OAuthApps } from '@rocket.chat/models'; async function run(): Promise { if (!(await OAuthApps.findOneById('zapier'))) { diff --git a/apps/meteor/app/oauth2-server-config/server/oauth/oauth2-server.ts b/apps/meteor/app/oauth2-server-config/server/oauth/oauth2-server.ts index ca83449a539c..47b144aa10bd 100644 --- a/apps/meteor/app/oauth2-server-config/server/oauth/oauth2-server.ts +++ b/apps/meteor/app/oauth2-server-config/server/oauth/oauth2-server.ts @@ -5,9 +5,9 @@ import { WebApp } from 'meteor/webapp'; import { OAuth2Server } from 'meteor/rocketchat:oauth2-server'; import { Request, Response } from 'express'; import { IUser } from '@rocket.chat/core-typings'; +import { OAuthApps } from '@rocket.chat/models'; import { Users } from '../../../models/server'; -import { OAuthApps } from '../../../models/server/raw'; import { API } from '../../../api/server'; const oauth2server = new OAuth2Server({ diff --git a/apps/meteor/app/oembed/server/server.js b/apps/meteor/app/oembed/server/server.js index 84d5f3eef3e7..24bca83f7976 100644 --- a/apps/meteor/app/oembed/server/server.js +++ b/apps/meteor/app/oembed/server/server.js @@ -7,9 +7,9 @@ import iconv from 'iconv-lite'; import ipRangeCheck from 'ip-range-check'; import he from 'he'; import jschardet from 'jschardet'; +import { OEmbedCache } from '@rocket.chat/models'; import { Messages } from '../../models/server'; -import { OEmbedCache } from '../../models/server/raw'; import { callbacks } from '../../../lib/callbacks'; import { settings } from '../../settings/server'; import { isURL } from '../../../lib/utils/isURL'; diff --git a/apps/meteor/app/otr/client/rocketchat.otr.js b/apps/meteor/app/otr/client/rocketchat.otr.js index f8a660d7fcfa..ebaefbe0d7db 100644 --- a/apps/meteor/app/otr/client/rocketchat.otr.js +++ b/apps/meteor/app/otr/client/rocketchat.otr.js @@ -2,7 +2,7 @@ import { Meteor } from 'meteor/meteor'; import { ReactiveVar } from 'meteor/reactive-var'; import { Tracker } from 'meteor/tracker'; -import { Subscriptions } from '../../models'; +import { Subscriptions } from '../../models/client'; import { Notifications } from '../../notifications'; import { t } from '../../utils'; import { onClientMessageReceived } from '../../../client/lib/onClientMessageReceived'; diff --git a/apps/meteor/app/otr/server/methods/deleteOldOTRMessages.js b/apps/meteor/app/otr/server/methods/deleteOldOTRMessages.js index c7b4dafd9900..3852734e4bb0 100644 --- a/apps/meteor/app/otr/server/methods/deleteOldOTRMessages.js +++ b/apps/meteor/app/otr/server/methods/deleteOldOTRMessages.js @@ -1,6 +1,6 @@ import { Meteor } from 'meteor/meteor'; -import { Subscriptions, Messages } from '../../../models'; +import { Subscriptions, Messages } from '../../../models/server'; Meteor.methods({ deleteOldOTRMessages(roomId) { diff --git a/apps/meteor/app/otr/server/methods/updateOTRAck.js b/apps/meteor/app/otr/server/methods/updateOTRAck.js index fc48adca642f..1c822a51d89c 100644 --- a/apps/meteor/app/otr/server/methods/updateOTRAck.js +++ b/apps/meteor/app/otr/server/methods/updateOTRAck.js @@ -1,6 +1,6 @@ import { Meteor } from 'meteor/meteor'; -import { Messages } from '../../../models'; +import { Messages } from '../../../models/server'; Meteor.methods({ updateOTRAck(_id, ack) { diff --git a/apps/meteor/app/reactions/client/init.js b/apps/meteor/app/reactions/client/init.js index bc83ed83e05c..b20a36dee39d 100644 --- a/apps/meteor/app/reactions/client/init.js +++ b/apps/meteor/app/reactions/client/init.js @@ -1,7 +1,7 @@ import { Meteor } from 'meteor/meteor'; import { Blaze } from 'meteor/blaze'; -import { Rooms, Subscriptions } from '../../models'; +import { Rooms, Subscriptions } from '../../models/client'; import { MessageAction } from '../../ui-utils'; import { messageArgs } from '../../../client/lib/utils/messageArgs'; import { EmojiPicker } from '../../emoji'; diff --git a/apps/meteor/app/reactions/client/methods/setReaction.js b/apps/meteor/app/reactions/client/methods/setReaction.js index 0da4565a49a0..26286e4e1130 100644 --- a/apps/meteor/app/reactions/client/methods/setReaction.js +++ b/apps/meteor/app/reactions/client/methods/setReaction.js @@ -1,7 +1,7 @@ import { Meteor } from 'meteor/meteor'; import _ from 'underscore'; -import { Messages, Rooms, Subscriptions } from '../../../models'; +import { Messages, Rooms, Subscriptions } from '../../../models/client'; import { callbacks } from '../../../../lib/callbacks'; import { emoji } from '../../../emoji'; import { roomCoordinator } from '../../../../client/lib/rooms/roomCoordinator'; diff --git a/apps/meteor/app/reactions/server/setReaction.js b/apps/meteor/app/reactions/server/setReaction.js index f477519e6d03..9cfbd264df88 100644 --- a/apps/meteor/app/reactions/server/setReaction.js +++ b/apps/meteor/app/reactions/server/setReaction.js @@ -1,9 +1,9 @@ import { Meteor } from 'meteor/meteor'; import { TAPi18n } from 'meteor/rocketchat:tap-i18n'; import _ from 'underscore'; +import { EmojiCustom } from '@rocket.chat/models'; import { Messages, Rooms } from '../../models/server'; -import { EmojiCustom } from '../../models/server/raw'; import { callbacks } from '../../../lib/callbacks'; import { emoji } from '../../emoji/server'; import { isTheLastMessage, msgStream } from '../../lib/server'; diff --git a/apps/meteor/app/search/server/model/provider.js b/apps/meteor/app/search/server/model/provider.js index edd8ad805d15..5d236ad6d068 100644 --- a/apps/meteor/app/search/server/model/provider.js +++ b/apps/meteor/app/search/server/model/provider.js @@ -1,6 +1,6 @@ /* eslint no-unused-vars: [2, { "args": "none" }]*/ import SearchLogger from '../logger/logger'; -import { settings } from '../../../settings'; +import { settings } from '../../../settings/server'; /** * Setting Object in order to manage settings loading for providers and admin ui display diff --git a/apps/meteor/app/slackbridge/server/RocketAdapter.js b/apps/meteor/app/slackbridge/server/RocketAdapter.js index 27f92b4fee45..302e35151ead 100644 --- a/apps/meteor/app/slackbridge/server/RocketAdapter.js +++ b/apps/meteor/app/slackbridge/server/RocketAdapter.js @@ -7,8 +7,8 @@ import { Random } from 'meteor/random'; import { rocketLogger } from './logger'; import { callbacks } from '../../../lib/callbacks'; -import { settings } from '../../settings'; -import { Messages, Rooms, Users } from '../../models'; +import { settings } from '../../settings/server'; +import { Messages, Rooms, Users } from '../../models/server'; import { createRoom, sendMessage, setUserAvatar } from '../../lib'; export default class RocketAdapter { diff --git a/apps/meteor/app/slackbridge/server/SlackAdapter.js b/apps/meteor/app/slackbridge/server/SlackAdapter.js index 4e597f43f1ef..efaa28e18e21 100644 --- a/apps/meteor/app/slackbridge/server/SlackAdapter.js +++ b/apps/meteor/app/slackbridge/server/SlackAdapter.js @@ -8,8 +8,8 @@ import { Meteor } from 'meteor/meteor'; import { slackLogger } from './logger'; import { SlackAPI } from './SlackAPI'; import { getUserAvatarURL } from '../../utils/lib/getUserAvatarURL'; -import { Messages, Rooms, Users } from '../../models'; -import { settings } from '../../settings'; +import { Messages, Rooms, Users } from '../../models/server'; +import { settings } from '../../settings/server'; import { deleteMessage, updateMessage, addUserToRoom, removeUserFromRoom, archiveRoom, unarchiveRoom, sendMessage } from '../../lib'; import { saveRoomName, saveRoomTopic } from '../../channel-settings'; import { FileUpload } from '../../file-upload'; diff --git a/apps/meteor/app/slackbridge/server/slackbridge_import.server.js b/apps/meteor/app/slackbridge/server/slackbridge_import.server.js index e41cb15255cf..a30dc53e4e86 100644 --- a/apps/meteor/app/slackbridge/server/slackbridge_import.server.js +++ b/apps/meteor/app/slackbridge/server/slackbridge_import.server.js @@ -4,7 +4,7 @@ import { Random } from 'meteor/random'; import { TAPi18n } from 'meteor/rocketchat:tap-i18n'; import { SlackBridge } from './slackbridge'; -import { Rooms } from '../../models'; +import { Rooms } from '../../models/server'; import { msgStream } from '../../lib'; import { slashCommands } from '../../utils'; diff --git a/apps/meteor/app/smarsh-connector/server/functions/generateEml.js b/apps/meteor/app/smarsh-connector/server/functions/generateEml.js index a4244e3f9501..fea8bc9d4d23 100644 --- a/apps/meteor/app/smarsh-connector/server/functions/generateEml.js +++ b/apps/meteor/app/smarsh-connector/server/functions/generateEml.js @@ -2,10 +2,10 @@ import { Meteor } from 'meteor/meteor'; import { TAPi18n } from 'meteor/rocketchat:tap-i18n'; import _ from 'underscore'; import moment from 'moment'; +import { SmarshHistory } from '@rocket.chat/models'; -import { settings } from '../../../settings'; +import { settings } from '../../../settings/server'; import { Rooms, Messages, Users } from '../../../models/server'; -import { SmarshHistory } from '../../../models/server/raw'; import { MessageTypes } from '../../../ui-utils'; import { smarsh } from '../lib/rocketchat'; import 'moment-timezone'; diff --git a/apps/meteor/app/smarsh-connector/server/functions/sendEmail.js b/apps/meteor/app/smarsh-connector/server/functions/sendEmail.js index 67fcfde02e67..ed062693ad57 100644 --- a/apps/meteor/app/smarsh-connector/server/functions/sendEmail.js +++ b/apps/meteor/app/smarsh-connector/server/functions/sendEmail.js @@ -5,10 +5,10 @@ // files: ['i3nc9l3mn'] // } import { UploadFS } from 'meteor/jalik:ufs'; +import { Uploads } from '@rocket.chat/models'; import * as Mailer from '../../../mailer'; -import { Uploads } from '../../../models/server/raw'; -import { settings } from '../../../settings'; +import { settings } from '../../../settings/server'; import { smarsh } from '../lib/rocketchat'; smarsh.sendEmail = async (data) => { diff --git a/apps/meteor/app/sms/server/services/mobex.js b/apps/meteor/app/sms/server/services/mobex.js index 5f92c2920305..ad0ceb7ffec0 100644 --- a/apps/meteor/app/sms/server/services/mobex.js +++ b/apps/meteor/app/sms/server/services/mobex.js @@ -1,7 +1,7 @@ import { HTTP } from 'meteor/http'; import { Base64 } from 'meteor/base64'; -import { settings } from '../../../settings'; +import { settings } from '../../../settings/server'; import { SMS } from '../SMS'; import { SystemLogger } from '../../../../server/lib/logger/system'; diff --git a/apps/meteor/app/sms/server/services/twilio.js b/apps/meteor/app/sms/server/services/twilio.js index 3fab2b7520a8..c0213051b91b 100644 --- a/apps/meteor/app/sms/server/services/twilio.js +++ b/apps/meteor/app/sms/server/services/twilio.js @@ -3,7 +3,7 @@ import twilio from 'twilio'; import { TAPi18n } from 'meteor/rocketchat:tap-i18n'; import filesize from 'filesize'; -import { settings } from '../../../settings'; +import { settings } from '../../../settings/server'; import { SMS } from '../SMS'; import { fileUploadIsValidContentType } from '../../../utils/lib/fileUploadRestrictions'; import { api } from '../../../../server/sdk/api'; diff --git a/apps/meteor/app/sms/server/services/voxtelesys.js b/apps/meteor/app/sms/server/services/voxtelesys.js index bc8347caa10b..c5b7a2e88a3e 100644 --- a/apps/meteor/app/sms/server/services/voxtelesys.js +++ b/apps/meteor/app/sms/server/services/voxtelesys.js @@ -3,7 +3,7 @@ import { Meteor } from 'meteor/meteor'; import { TAPi18n } from 'meteor/rocketchat:tap-i18n'; import filesize from 'filesize'; -import { settings } from '../../../settings'; +import { settings } from '../../../settings/server'; import { SMS } from '../SMS'; import { fileUploadIsValidContentType } from '../../../utils/lib/fileUploadRestrictions'; import { mime } from '../../../utils/lib/mimeTypes'; diff --git a/apps/meteor/app/statistics/server/functions/getLastStatistics.js b/apps/meteor/app/statistics/server/functions/getLastStatistics.js index c405109d6dfd..5fc6bbbb1620 100644 --- a/apps/meteor/app/statistics/server/functions/getLastStatistics.js +++ b/apps/meteor/app/statistics/server/functions/getLastStatistics.js @@ -1,6 +1,7 @@ +import { Statistics } from '@rocket.chat/models'; + import { hasPermissionAsync } from '../../../authorization/server/functions/hasPermission'; import { statistics } from '../lib/statistics'; -import { Statistics } from '../../../models/server/raw'; export async function getLastStatistics({ userId, refresh }) { if (!(await hasPermissionAsync(userId, 'view-statistics'))) { diff --git a/apps/meteor/app/statistics/server/functions/getStatistics.ts b/apps/meteor/app/statistics/server/functions/getStatistics.ts index da536355c494..ec43534366b6 100644 --- a/apps/meteor/app/statistics/server/functions/getStatistics.ts +++ b/apps/meteor/app/statistics/server/functions/getStatistics.ts @@ -1,8 +1,8 @@ import type { SortOptionObject, SchemaMember } from 'mongodb'; import type { IStats } from '@rocket.chat/core-typings'; +import { Statistics } from '@rocket.chat/models'; import { hasPermissionAsync } from '../../../authorization/server/functions/hasPermission'; -import { Statistics } from '../../../models/server/raw'; type GetStatisticsParams = { userId: string; diff --git a/apps/meteor/app/statistics/server/lib/SAUMonitor.ts b/apps/meteor/app/statistics/server/lib/SAUMonitor.ts index f52bce1ec94b..3893941e69fd 100644 --- a/apps/meteor/app/statistics/server/lib/SAUMonitor.ts +++ b/apps/meteor/app/statistics/server/lib/SAUMonitor.ts @@ -3,10 +3,10 @@ import { SyncedCron } from 'meteor/littledata:synced-cron'; import UAParser from 'ua-parser-js'; import mem from 'mem'; import type { ISession, ISessionDevice, ISocketConnection, IUser } from '@rocket.chat/core-typings'; +import { Sessions, Users } from '@rocket.chat/models'; import { UAParserMobile, UAParserDesktop } from './UAParserCustom'; -import { Sessions, Users } from '../../../models/server/raw'; -import { aggregates } from '../../../models/server/raw/Sessions'; +import { aggregates } from '../../../../server/models/raw/Sessions'; import { Logger } from '../../../../server/lib/logger/Logger'; import { getMostImportantRole } from '../../../../lib/roles/getMostImportantRole'; import { sauEvents } from '../../../../server/services/sauMonitor/events'; diff --git a/apps/meteor/app/statistics/server/lib/statistics.ts b/apps/meteor/app/statistics/server/lib/statistics.ts index 051456c55ae7..3efc88d46d0d 100644 --- a/apps/meteor/app/statistics/server/lib/statistics.ts +++ b/apps/meteor/app/statistics/server/lib/statistics.ts @@ -5,12 +5,6 @@ import _ from 'underscore'; import { Meteor } from 'meteor/meteor'; import { MongoInternals } from 'meteor/mongo'; import type { IRoom, IStats } from '@rocket.chat/core-typings'; - -import { Settings, Users, Rooms, Subscriptions, Messages, LivechatVisitors } from '../../../models/server'; -import { settings } from '../../../settings/server'; -import { Info, getMongoInfo } from '../../../utils/server'; -import { getControl } from '../../../../server/lib/migrations'; -import { getStatistics as federationGetStatistics } from '../../../federation/server/functions/dashboard'; import { NotificationQueue, Users as UsersRaw, @@ -21,11 +15,18 @@ import { Invites, Uploads, LivechatDepartment, + LivechatVisitors, EmailInbox, LivechatBusinessHours, Messages as MessagesRaw, InstanceStatus, -} from '../../../models/server/raw'; +} from '@rocket.chat/models'; + +import { Settings, Users, Rooms, Subscriptions, Messages } from '../../../models/server'; +import { settings } from '../../../settings/server'; +import { Info, getMongoInfo } from '../../../utils/server'; +import { getControl } from '../../../../server/lib/migrations'; +import { getStatistics as federationGetStatistics } from '../../../federation/server/functions/dashboard'; import { readSecondaryPreferred } from '../../../../server/database/readSecondaryPreferred'; import { getAppsStatistics } from './getAppsStatistics'; import { getImporterStatistics } from './getImporterStatistics'; @@ -112,7 +113,7 @@ export const statistics = { statistics.totalThreads = Messages.countThreads(); // livechat visitors - statistics.totalLivechatVisitors = LivechatVisitors.find().count(); + statistics.totalLivechatVisitors = await LivechatVisitors.find().count(); // livechat agents statistics.totalLivechatAgents = Users.findAgents().count(); diff --git a/apps/meteor/app/threads/client/flextab/thread.js b/apps/meteor/app/threads/client/flextab/thread.js index c1dfa725b5e6..da1cd730642b 100644 --- a/apps/meteor/app/threads/client/flextab/thread.js +++ b/apps/meteor/app/threads/client/flextab/thread.js @@ -11,7 +11,7 @@ import { chatMessages, ChatMessages } from '../../../ui'; import { callWithErrorHandling } from '../../../../client/lib/utils/callWithErrorHandling'; import { messageContext } from '../../../ui-utils/client/lib/messageContext'; import { upsertMessageBulk } from '../../../ui-utils/client/lib/RoomHistoryManager'; -import { Messages } from '../../../models'; +import { Messages } from '../../../models/client'; import { fileUpload } from '../../../ui/client/lib/fileUpload'; import { dropzoneEvents, dropzoneHelpers } from '../../../ui/client/views/app/room'; import './thread.html'; diff --git a/apps/meteor/app/ui-master/client/body.js b/apps/meteor/app/ui-master/client/body.js index 9fc2bbb4065d..af1bf3c5557a 100644 --- a/apps/meteor/app/ui-master/client/body.js +++ b/apps/meteor/app/ui-master/client/body.js @@ -9,7 +9,7 @@ import { t } from '../../utils/client'; import { chatMessages } from '../../ui'; import { popover, RoomManager } from '../../ui-utils'; import { settings } from '../../settings'; -import { ChatSubscription } from '../../models'; +import { ChatSubscription } from '../../models/client'; import './body.html'; import { imperativeModal } from '../../../client/lib/imperativeModal'; import GenericModal from '../../../client/components/GenericModal'; diff --git a/apps/meteor/app/ui-master/server/index.js b/apps/meteor/app/ui-master/server/index.js index c93c8d73e3c2..cf837de93795 100644 --- a/apps/meteor/app/ui-master/server/index.js +++ b/apps/meteor/app/ui-master/server/index.js @@ -4,7 +4,7 @@ import { Tracker } from 'meteor/tracker'; import _ from 'underscore'; import { escapeHTML } from '@rocket.chat/string-helpers'; -import { Settings } from '../../models'; +import { Settings } from '../../models/server'; import { settings } from '../../settings/server'; import { applyHeadInjections, headInjections, injectIntoBody, injectIntoHead } from './inject'; import './scripts'; diff --git a/apps/meteor/app/ui-message/client/messageBox/messageBox.js b/apps/meteor/app/ui-message/client/messageBox/messageBox.js index 770187744fc2..878f42b379eb 100644 --- a/apps/meteor/app/ui-message/client/messageBox/messageBox.js +++ b/apps/meteor/app/ui-message/client/messageBox/messageBox.js @@ -9,7 +9,7 @@ import moment from 'moment'; import { setupAutogrow } from './messageBoxAutogrow'; import { formattingButtons, applyFormatting } from './messageBoxFormatting'; import { EmojiPicker } from '../../../emoji'; -import { Users } from '../../../models'; +import { Users } from '../../../models/client'; import { settings } from '../../../settings'; import { fileUpload, KonchatNotification } from '../../../ui'; import { messageBox, popover } from '../../../ui-utils'; diff --git a/apps/meteor/app/ui-sidenav/client/roomList.js b/apps/meteor/app/ui-sidenav/client/roomList.js index 972ad86ffa07..e5d289134f63 100644 --- a/apps/meteor/app/ui-sidenav/client/roomList.js +++ b/apps/meteor/app/ui-sidenav/client/roomList.js @@ -3,7 +3,7 @@ import { Template } from 'meteor/templating'; import { callbacks } from '../../../lib/callbacks'; import { UiTextContext } from '../../../definition/IRoomTypeConfig'; -import { ChatSubscription, Rooms, Users, Subscriptions } from '../../models'; +import { ChatSubscription, Rooms, Users, Subscriptions } from '../../models/client'; import { getUserPreference } from '../../utils'; import { settings } from '../../settings'; import { roomCoordinator } from '../../../client/lib/rooms/roomCoordinator'; diff --git a/apps/meteor/app/ui-sidenav/client/sideNav.js b/apps/meteor/app/ui-sidenav/client/sideNav.js index 42abb5945e6c..5c8f614f0786 100644 --- a/apps/meteor/app/ui-sidenav/client/sideNav.js +++ b/apps/meteor/app/ui-sidenav/client/sideNav.js @@ -7,7 +7,7 @@ import { Template } from 'meteor/templating'; import { SideNav, menu } from '../../ui-utils'; import { settings } from '../../settings'; import { getUserPreference } from '../../utils'; -import { Users } from '../../models'; +import { Users } from '../../models/client'; import { roomCoordinator } from '../../../client/lib/rooms/roomCoordinator'; Template.sideNav.helpers({ diff --git a/apps/meteor/app/ui-utils/client/lib/RoomHistoryManager.js b/apps/meteor/app/ui-utils/client/lib/RoomHistoryManager.js index 6c7e6d2df43d..3ce3b93a5cb1 100644 --- a/apps/meteor/app/ui-utils/client/lib/RoomHistoryManager.js +++ b/apps/meteor/app/ui-utils/client/lib/RoomHistoryManager.js @@ -11,7 +11,7 @@ import { RoomManager } from './RoomManager'; import { readMessage } from './readMessages'; import { renderMessageBody } from '../../../../client/lib/utils/renderMessageBody'; import { getConfig } from '../../../../client/lib/utils/getConfig'; -import { ChatMessage, ChatSubscription, ChatRoom } from '../../../models'; +import { ChatMessage, ChatSubscription, ChatRoom } from '../../../models/client'; import { callWithErrorHandling } from '../../../../client/lib/utils/callWithErrorHandling'; import { filterMarkdown } from '../../../markdown/lib/markdown'; import { getUserPreference } from '../../../utils/client'; diff --git a/apps/meteor/app/ui-utils/client/lib/RoomManager.js b/apps/meteor/app/ui-utils/client/lib/RoomManager.js index 28048fc7a84f..6338a2f3185c 100644 --- a/apps/meteor/app/ui-utils/client/lib/RoomManager.js +++ b/apps/meteor/app/ui-utils/client/lib/RoomManager.js @@ -11,7 +11,7 @@ import { upsertMessage, RoomHistoryManager } from './RoomHistoryManager'; import { mainReady } from './mainReady'; import { callbacks } from '../../../../lib/callbacks'; import { Notifications } from '../../../notifications'; -import { CachedChatRoom, ChatMessage, ChatSubscription, CachedChatSubscription, ChatRoom } from '../../../models'; +import { CachedChatRoom, ChatMessage, ChatSubscription, CachedChatSubscription, ChatRoom } from '../../../models/client'; import { CachedCollectionManager } from '../../../ui-cached-collection'; import { getConfig } from '../../../../client/lib/utils/getConfig'; import { callWithErrorHandling } from '../../../../client/lib/utils/callWithErrorHandling'; diff --git a/apps/meteor/app/ui-utils/client/lib/openRoom.js b/apps/meteor/app/ui-utils/client/lib/openRoom.js index d5d9bbd79d96..8305ff41470c 100644 --- a/apps/meteor/app/ui-utils/client/lib/openRoom.js +++ b/apps/meteor/app/ui-utils/client/lib/openRoom.js @@ -7,14 +7,13 @@ import _ from 'underscore'; import { appLayout } from '../../../../client/lib/appLayout'; import { waitUntilFind } from '../../../../client/lib/utils/waitUntilFind'; -import { Messages, ChatSubscription } from '../../../models'; +import { Messages, ChatSubscription, Rooms, Subscriptions } from '../../../models/client'; import { settings } from '../../../settings'; import { callbacks } from '../../../../lib/callbacks'; import { callWithErrorHandling } from '../../../../client/lib/utils/callWithErrorHandling'; import { call } from '../../../../client/lib/utils/call'; import { RoomManager, RoomHistoryManager } from '..'; import { RoomManager as NewRoomManager } from '../../../../client/lib/RoomManager'; -import { Rooms, Subscriptions } from '../../../models/client'; import { fireGlobalEvent } from '../../../../client/lib/utils/fireGlobalEvent'; import { roomCoordinator } from '../../../../client/lib/rooms/roomCoordinator'; import MainLayout from '../../../../client/views/root/MainLayout'; diff --git a/apps/meteor/app/ui-utils/client/lib/readMessages.js b/apps/meteor/app/ui-utils/client/lib/readMessages.js index c1ef4c26a81b..21b85ca539b6 100644 --- a/apps/meteor/app/ui-utils/client/lib/readMessages.js +++ b/apps/meteor/app/ui-utils/client/lib/readMessages.js @@ -4,7 +4,7 @@ import { Emitter } from '@rocket.chat/emitter'; import { RoomHistoryManager } from './RoomHistoryManager'; import { RoomManager } from './RoomManager'; -import { ChatSubscription, ChatMessage } from '../../../models'; +import { ChatSubscription, ChatMessage } from '../../../models/client'; /* DEFINITIONS - If window loses focus user needs to scroll or click/touch some place - On hit ESC enable read, force read of current room and remove unread mark diff --git a/apps/meteor/app/ui/client/lib/chatMessages.js b/apps/meteor/app/ui/client/lib/chatMessages.js index 4dc81166f21e..dc49ccdb221d 100644 --- a/apps/meteor/app/ui/client/lib/chatMessages.js +++ b/apps/meteor/app/ui/client/lib/chatMessages.js @@ -416,13 +416,13 @@ export class ChatMessages { async processSlashCommand(msgObject) { if (msgObject.msg[0] === '/') { - const match = msgObject.msg.match(/^\/([^\s]+)(?:\s+(.*))?$/m); + const match = msgObject.msg.match(/^\/([^\s]+)/m); if (match) { - let command; - if (slashCommands.commands[match[1]]) { - const commandOptions = slashCommands.commands[match[1]]; - command = match[1]; - const param = match[2] || ''; + const command = match[1]; + + if (slashCommands.commands[command]) { + const commandOptions = slashCommands.commands[command]; + const param = msgObject.msg.replace(/^\/([^\s]+)/m, ''); if (!commandOptions.permission || hasAtLeastOnePermission(commandOptions.permission, Session.get('openedRoom'))) { if (commandOptions.clientOnly) { @@ -449,7 +449,7 @@ export class ChatMessages { _id: Random.id(), rid: msgObject.rid, ts: new Date(), - msg: TAPi18n.__('No_such_command', { command: escapeHTML(match[1]) }), + msg: TAPi18n.__('No_such_command', { command: escapeHTML(command) }), u: { username: settings.get('InternalHubot_Username') || 'rocket.cat', }, diff --git a/apps/meteor/app/ui/client/lib/collections.js b/apps/meteor/app/ui/client/lib/collections.js index 18df31be28b8..ad3099decf85 100644 --- a/apps/meteor/app/ui/client/lib/collections.js +++ b/apps/meteor/app/ui/client/lib/collections.js @@ -2,7 +2,7 @@ import { Meteor } from 'meteor/meteor'; import { Tracker } from 'meteor/tracker'; import { settings } from '../../../settings'; -import { CachedChatRoom, CachedChatSubscription } from '../../../models'; +import { CachedChatRoom, CachedChatSubscription } from '../../../models/client'; Meteor.startup(() => { Tracker.autorun(() => { diff --git a/apps/meteor/app/ui/client/lib/notification.js b/apps/meteor/app/ui/client/lib/notification.js index ed38e78c62ac..75d0119d0c7c 100644 --- a/apps/meteor/app/ui/client/lib/notification.js +++ b/apps/meteor/app/ui/client/lib/notification.js @@ -9,7 +9,7 @@ import _ from 'underscore'; import s from 'underscore.string'; import { e2e } from '../../../e2e/client'; -import { Users, ChatSubscription } from '../../../models'; +import { Users, ChatSubscription } from '../../../models/client'; import { getUserPreference } from '../../../utils'; import { getUserAvatarURL } from '../../../utils/lib/getUserAvatarURL'; import { CustomSounds } from '../../../custom-sounds/client/lib/CustomSounds'; diff --git a/apps/meteor/app/ui/client/views/app/lib/getCommonRoomEvents.js b/apps/meteor/app/ui/client/views/app/lib/getCommonRoomEvents.js index 2e1262589c60..18a9747af7f7 100644 --- a/apps/meteor/app/ui/client/views/app/lib/getCommonRoomEvents.js +++ b/apps/meteor/app/ui/client/views/app/lib/getCommonRoomEvents.js @@ -9,7 +9,7 @@ import { callWithErrorHandling } from '../../../../../../client/lib/utils/callWi import { isURL } from '../../../../../../lib/utils/isURL'; import { openUserCard } from '../../../lib/UserCard'; import { messageArgs } from '../../../../../../client/lib/utils/messageArgs'; -import { ChatMessage, Rooms, Messages } from '../../../../../models'; +import { ChatMessage, Rooms, Messages } from '../../../../../models/client'; import { t } from '../../../../../utils/client'; import { chatMessages } from '../room'; import { EmojiEvents } from '../../../../../reactions/client/init'; diff --git a/apps/meteor/app/ui/client/views/app/room.js b/apps/meteor/app/ui/client/views/app/room.js index 93314819f0c7..a659a1a3bc0c 100644 --- a/apps/meteor/app/ui/client/views/app/room.js +++ b/apps/meteor/app/ui/client/views/app/room.js @@ -12,7 +12,7 @@ import { Template } from 'meteor/templating'; import { t, getUserPreference } from '../../../../utils/client'; import { WebRTC } from '../../../../webrtc/client'; -import { ChatMessage, RoomRoles, Users, Subscriptions, Rooms } from '../../../../models'; +import { ChatMessage, RoomRoles, Users, Subscriptions, Rooms } from '../../../../models/client'; import { RoomHistoryManager, RoomManager, readMessage } from '../../../../ui-utils/client'; import { messageContext } from '../../../../ui-utils/client/lib/messageContext'; import { messageArgs } from '../../../../../client/lib/utils/messageArgs'; diff --git a/apps/meteor/app/user-data-download/server/cronProcessDownloads.js b/apps/meteor/app/user-data-download/server/cronProcessDownloads.js index c93272dc1e31..4bf95816d9e6 100644 --- a/apps/meteor/app/user-data-download/server/cronProcessDownloads.js +++ b/apps/meteor/app/user-data-download/server/cronProcessDownloads.js @@ -8,10 +8,10 @@ import { SyncedCron } from 'meteor/littledata:synced-cron'; import archiver from 'archiver'; import moment from 'moment'; import { v4 as uuidv4 } from 'uuid'; +import { Avatars, ExportOperations, UserDataFiles, Uploads } from '@rocket.chat/models'; import { settings } from '../../settings/server'; import { Subscriptions, Rooms, Users, Messages } from '../../models/server'; -import { Avatars, ExportOperations, UserDataFiles, Uploads } from '../../models/server/raw'; import { FileUpload } from '../../file-upload/server'; import { DataExport } from './DataExport'; import * as Mailer from '../../mailer'; diff --git a/apps/meteor/app/user-data-download/server/exportDownload.js b/apps/meteor/app/user-data-download/server/exportDownload.js index 0da359e13d96..a004f2ceb571 100644 --- a/apps/meteor/app/user-data-download/server/exportDownload.js +++ b/apps/meteor/app/user-data-download/server/exportDownload.js @@ -1,7 +1,7 @@ import { WebApp } from 'meteor/webapp'; import { TAPi18n } from 'meteor/rocketchat:tap-i18n'; +import { UserDataFiles } from '@rocket.chat/models'; -import { UserDataFiles } from '../../models/server/raw'; import { DataExport } from './DataExport'; import { settings } from '../../settings/server'; diff --git a/apps/meteor/app/user-status/server/methods/deleteCustomUserStatus.js b/apps/meteor/app/user-status/server/methods/deleteCustomUserStatus.js index 6935266a7475..8fa7e0cb4f97 100644 --- a/apps/meteor/app/user-status/server/methods/deleteCustomUserStatus.js +++ b/apps/meteor/app/user-status/server/methods/deleteCustomUserStatus.js @@ -1,7 +1,7 @@ import { Meteor } from 'meteor/meteor'; +import { CustomUserStatus } from '@rocket.chat/models'; import { hasPermission } from '../../../authorization/server'; -import { CustomUserStatus } from '../../../models/server/raw'; import { api } from '../../../../server/sdk/api'; Meteor.methods({ diff --git a/apps/meteor/app/user-status/server/methods/insertOrUpdateUserStatus.js b/apps/meteor/app/user-status/server/methods/insertOrUpdateUserStatus.js index d05d7aee658e..c27e657a03d1 100644 --- a/apps/meteor/app/user-status/server/methods/insertOrUpdateUserStatus.js +++ b/apps/meteor/app/user-status/server/methods/insertOrUpdateUserStatus.js @@ -1,8 +1,8 @@ import { Meteor } from 'meteor/meteor'; import s from 'underscore.string'; +import { CustomUserStatus } from '@rocket.chat/models'; import { hasPermission } from '../../../authorization'; -import { CustomUserStatus } from '../../../models/server/raw'; import { api } from '../../../../server/sdk/api'; Meteor.methods({ diff --git a/apps/meteor/app/user-status/server/methods/listCustomUserStatus.js b/apps/meteor/app/user-status/server/methods/listCustomUserStatus.js index 3e6ebb9fa2d0..3d0191396637 100644 --- a/apps/meteor/app/user-status/server/methods/listCustomUserStatus.js +++ b/apps/meteor/app/user-status/server/methods/listCustomUserStatus.js @@ -1,6 +1,5 @@ import { Meteor } from 'meteor/meteor'; - -import { CustomUserStatus } from '../../../models/server/raw'; +import { CustomUserStatus } from '@rocket.chat/models'; Meteor.methods({ async listCustomUserStatus() { diff --git a/apps/meteor/app/utils/server/functions/normalizeMessageFileUpload.js b/apps/meteor/app/utils/server/functions/normalizeMessageFileUpload.js index abfe9e4644cc..07a1759aa9da 100644 --- a/apps/meteor/app/utils/server/functions/normalizeMessageFileUpload.js +++ b/apps/meteor/app/utils/server/functions/normalizeMessageFileUpload.js @@ -1,6 +1,7 @@ +import { Uploads } from '@rocket.chat/models'; + import { getURL } from '../../lib/getURL'; import { FileUpload } from '../../../file-upload/server'; -import { Uploads } from '../../../models/server/raw'; export const normalizeMessageFileUpload = async (message) => { if (message.file && !message.fileUpload) { diff --git a/apps/meteor/app/utils/server/index.js b/apps/meteor/app/utils/server/index.js index 8b2905f0dcbc..eddd95c43a04 100644 --- a/apps/meteor/app/utils/server/index.js +++ b/apps/meteor/app/utils/server/index.js @@ -10,7 +10,7 @@ export { slashCommands } from '../lib/slashCommand'; export { getUserNotificationPreference } from '../lib/getUserNotificationPreference'; export { getAvatarColor } from '../lib/getAvatarColor'; export { getURL } from '../lib/getURL'; -export { getValidRoomName } from '../lib/getValidRoomName'; +export { getValidRoomName } from './lib/getValidRoomName'; export { placeholders } from '../lib/placeholders'; export { templateVarHandler } from '../lib/templateVarHandler'; export { secondsToHHMMSS } from '../../../lib/utils/secondsToHHMMSS'; diff --git a/apps/meteor/app/utils/lib/getValidRoomName.js b/apps/meteor/app/utils/server/lib/getValidRoomName.js similarity index 93% rename from apps/meteor/app/utils/lib/getValidRoomName.js rename to apps/meteor/app/utils/server/lib/getValidRoomName.js index 9085005fbe68..04577e955cbc 100644 --- a/apps/meteor/app/utils/lib/getValidRoomName.js +++ b/apps/meteor/app/utils/server/lib/getValidRoomName.js @@ -2,9 +2,9 @@ import { Meteor } from 'meteor/meteor'; import limax from 'limax'; import { escapeHTML } from '@rocket.chat/string-helpers'; -import { settings } from '../../settings'; -import { Rooms } from '../../models'; -import { validateName } from '../../lib/server/functions/validateName'; +import { settings } from '../../../settings/server'; +import { Rooms } from '../../../models/server'; +import { validateName } from '../../../lib/server/functions/validateName'; export const getValidRoomName = (displayName, rid = '', options = {}) => { let slugifiedName = displayName; diff --git a/apps/meteor/app/version-check/server/functions/checkVersionUpdate.js b/apps/meteor/app/version-check/server/functions/checkVersionUpdate.js index 0794547ad75c..8a3191a9863f 100644 --- a/apps/meteor/app/version-check/server/functions/checkVersionUpdate.js +++ b/apps/meteor/app/version-check/server/functions/checkVersionUpdate.js @@ -2,12 +2,11 @@ import { TAPi18n } from 'meteor/rocketchat:tap-i18n'; import semver from 'semver'; import getNewUpdates from './getNewUpdates'; -import { settings } from '../../../settings'; +import { settings } from '../../../settings/server'; import { Info } from '../../../utils'; -import { Users } from '../../../models'; +import { Users, Settings } from '../../../models/server'; import logger from '../logger'; import { sendMessagesToAdmins } from '../../../../server/lib/sendMessagesToAdmins'; -import { Settings } from '../../../models/server'; // import getNewUpdates from '../sampleUpdateData'; export default () => { diff --git a/apps/meteor/app/version-check/server/functions/getNewUpdates.js b/apps/meteor/app/version-check/server/functions/getNewUpdates.js index 146af59a2a58..f5e8e7c0c691 100644 --- a/apps/meteor/app/version-check/server/functions/getNewUpdates.js +++ b/apps/meteor/app/version-check/server/functions/getNewUpdates.js @@ -3,7 +3,7 @@ import os from 'os'; import { HTTP } from 'meteor/http'; import { check, Match } from 'meteor/check'; -import { Settings } from '../../../models'; +import { Settings } from '../../../models/server'; import { Info } from '../../../utils'; import { getWorkspaceAccessToken } from '../../../cloud/server'; diff --git a/apps/meteor/app/version-check/server/methods/banner_dismiss.js b/apps/meteor/app/version-check/server/methods/banner_dismiss.js index 217aaf49252e..0d5d3b4b35f9 100644 --- a/apps/meteor/app/version-check/server/methods/banner_dismiss.js +++ b/apps/meteor/app/version-check/server/methods/banner_dismiss.js @@ -1,6 +1,6 @@ import { Meteor } from 'meteor/meteor'; -import { Users } from '../../../models'; +import { Users } from '../../../models/server'; Meteor.methods({ 'banner/dismiss'({ id }) { diff --git a/apps/meteor/app/videobridge/client/actionLink.js b/apps/meteor/app/videobridge/client/actionLink.js index e09db09aeb61..8825a64f109d 100644 --- a/apps/meteor/app/videobridge/client/actionLink.js +++ b/apps/meteor/app/videobridge/client/actionLink.js @@ -3,7 +3,7 @@ import { Session } from 'meteor/session'; import { TAPi18n } from 'meteor/rocketchat:tap-i18n'; import { actionLinks } from '../../action-links/client'; -import { Rooms } from '../../models'; +import { Rooms } from '../../models/client'; import { dispatchToastMessage } from '../../../client/lib/toast'; import { APIClient } from '../../utils/client'; diff --git a/apps/meteor/app/videobridge/server/methods/jitsiGenerateToken.js b/apps/meteor/app/videobridge/server/methods/jitsiGenerateToken.js index ebd9aa15d1c1..2aabfe83dffc 100644 --- a/apps/meteor/app/videobridge/server/methods/jitsiGenerateToken.js +++ b/apps/meteor/app/videobridge/server/methods/jitsiGenerateToken.js @@ -1,8 +1,8 @@ import { Meteor } from 'meteor/meteor'; import { jws } from 'jsrsasign'; -import { Rooms } from '../../../models'; -import { settings } from '../../../settings'; +import { Rooms } from '../../../models/server'; +import { settings } from '../../../settings/server'; import { canAccessRoom } from '../../../authorization/server/functions/canAccessRoom'; import { getUserEmailAddress } from '../../../../lib/getUserEmailAddress'; diff --git a/apps/meteor/app/videobridge/server/methods/jitsiSetTimeout.js b/apps/meteor/app/videobridge/server/methods/jitsiSetTimeout.js index 0789b9d82c69..acc51845ac79 100644 --- a/apps/meteor/app/videobridge/server/methods/jitsiSetTimeout.js +++ b/apps/meteor/app/videobridge/server/methods/jitsiSetTimeout.js @@ -7,7 +7,7 @@ import { metrics } from '../../../metrics/server'; import * as CONSTANTS from '../../constants'; import { canSendMessage } from '../../../authorization/server'; import { SystemLogger } from '../../../../server/lib/logger/system'; -import { settings } from '../../../settings'; +import { settings } from '../../../settings/server'; // TODO: Access Token missing. This is just a partial solution, it doesn't handle access token generation logic as present in this file - client/views/room/contextualBar/Call/Jitsi/CallJitsWithData.js const resolveJitsiCallUrl = (room) => { diff --git a/apps/meteor/app/webdav/server/methods/addWebdavAccount.ts b/apps/meteor/app/webdav/server/methods/addWebdavAccount.ts index 7835c62ae911..f89c56f69c93 100644 --- a/apps/meteor/app/webdav/server/methods/addWebdavAccount.ts +++ b/apps/meteor/app/webdav/server/methods/addWebdavAccount.ts @@ -1,8 +1,8 @@ import { Meteor } from 'meteor/meteor'; import { Match, check } from 'meteor/check'; +import { WebdavAccounts } from '@rocket.chat/models'; import { settings } from '../../../settings/server'; -import { WebdavAccounts } from '../../../models/server/raw'; import { WebdavClientAdapter } from '../lib/webdavClientAdapter'; import { api } from '../../../../server/sdk/api'; diff --git a/apps/meteor/app/webdav/server/methods/getFileFromWebdav.ts b/apps/meteor/app/webdav/server/methods/getFileFromWebdav.ts index 1f0bf354c278..ea753de9d670 100644 --- a/apps/meteor/app/webdav/server/methods/getFileFromWebdav.ts +++ b/apps/meteor/app/webdav/server/methods/getFileFromWebdav.ts @@ -1,8 +1,8 @@ import { Meteor } from 'meteor/meteor'; +import { WebdavAccounts } from '@rocket.chat/models'; import { settings } from '../../../settings/server'; import { getWebdavCredentials } from './getWebdavCredentials'; -import { WebdavAccounts } from '../../../models/server/raw'; import { WebdavClientAdapter } from '../lib/webdavClientAdapter'; Meteor.methods({ diff --git a/apps/meteor/app/webdav/server/methods/getWebdavFileList.ts b/apps/meteor/app/webdav/server/methods/getWebdavFileList.ts index 0343f273cebb..e1d980132a93 100644 --- a/apps/meteor/app/webdav/server/methods/getWebdavFileList.ts +++ b/apps/meteor/app/webdav/server/methods/getWebdavFileList.ts @@ -1,8 +1,8 @@ import { Meteor } from 'meteor/meteor'; +import { WebdavAccounts } from '@rocket.chat/models'; import { settings } from '../../../settings/server'; import { getWebdavCredentials } from './getWebdavCredentials'; -import { WebdavAccounts } from '../../../models/server/raw'; import { WebdavClientAdapter } from '../lib/webdavClientAdapter'; Meteor.methods({ diff --git a/apps/meteor/app/webdav/server/methods/getWebdavFilePreview.ts b/apps/meteor/app/webdav/server/methods/getWebdavFilePreview.ts index f98d0a57ca20..735be207431c 100644 --- a/apps/meteor/app/webdav/server/methods/getWebdavFilePreview.ts +++ b/apps/meteor/app/webdav/server/methods/getWebdavFilePreview.ts @@ -1,9 +1,9 @@ import { Meteor } from 'meteor/meteor'; import { createClient } from 'webdav'; +import { WebdavAccounts } from '@rocket.chat/models'; import { settings } from '../../../settings/server'; import { getWebdavCredentials } from './getWebdavCredentials'; -import { WebdavAccounts } from '../../../models/server/raw'; Meteor.methods({ async getWebdavFilePreview(accountId, path) { diff --git a/apps/meteor/app/webdav/server/methods/removeWebdavAccount.ts b/apps/meteor/app/webdav/server/methods/removeWebdavAccount.ts index e50cc203e9ea..0c1b2de477b4 100644 --- a/apps/meteor/app/webdav/server/methods/removeWebdavAccount.ts +++ b/apps/meteor/app/webdav/server/methods/removeWebdavAccount.ts @@ -1,7 +1,7 @@ import { Meteor } from 'meteor/meteor'; import { check } from 'meteor/check'; +import { WebdavAccounts } from '@rocket.chat/models'; -import { WebdavAccounts } from '../../../models/server/raw'; import { api } from '../../../../server/sdk/api'; Meteor.methods({ diff --git a/apps/meteor/app/webdav/server/methods/uploadFileToWebdav.ts b/apps/meteor/app/webdav/server/methods/uploadFileToWebdav.ts index 1e1cc1bba953..5499445b825d 100644 --- a/apps/meteor/app/webdav/server/methods/uploadFileToWebdav.ts +++ b/apps/meteor/app/webdav/server/methods/uploadFileToWebdav.ts @@ -1,9 +1,9 @@ import { Meteor } from 'meteor/meteor'; +import { WebdavAccounts } from '@rocket.chat/models'; import { settings } from '../../../settings/server'; import { Logger } from '../../../logger/server'; import { getWebdavCredentials } from './getWebdavCredentials'; -import { WebdavAccounts } from '../../../models/server/raw'; import { WebdavClientAdapter } from '../lib/webdavClientAdapter'; const logger = new Logger('WebDAV_Upload'); diff --git a/apps/meteor/app/webrtc/client/WebRTCClass.js b/apps/meteor/app/webrtc/client/WebRTCClass.js index 0c1989603859..478d173cde15 100644 --- a/apps/meteor/app/webrtc/client/WebRTCClass.js +++ b/apps/meteor/app/webrtc/client/WebRTCClass.js @@ -9,7 +9,7 @@ import { t } from '../../utils'; import { Notifications } from '../../notifications'; import { settings } from '../../settings'; import { modal } from '../../ui-utils'; -import { ChatSubscription } from '../../models'; +import { ChatSubscription } from '../../models/client'; import { WEB_RTC_EVENTS } from '..'; import { goToRoomById } from '../../../client/lib/utils/goToRoomById'; diff --git a/apps/meteor/client/components/UserAutoComplete/UserAutoComplete.tsx b/apps/meteor/client/components/UserAutoComplete/UserAutoComplete.tsx index b8e23f6e44d3..1b876fc99b2d 100644 --- a/apps/meteor/client/components/UserAutoComplete/UserAutoComplete.tsx +++ b/apps/meteor/client/components/UserAutoComplete/UserAutoComplete.tsx @@ -38,9 +38,9 @@ const UserAutoComplete = ({ value, ...props }: UserAutoCompleteProps): ReactElem onChange={props.onChange as any} filter={filter} setFilter={setFilter} - renderSelected={({ value, label }): ReactElement => { + renderSelected={({ value, label }): ReactElement | null => { if (!value) { - undefined; + return null; } return ( diff --git a/apps/meteor/client/components/UserAutoCompleteMultiple/UserAutoCompleteMultiple.tsx b/apps/meteor/client/components/UserAutoCompleteMultiple/UserAutoCompleteMultiple.tsx index b27c6d6034f9..9efda652b61a 100644 --- a/apps/meteor/client/components/UserAutoCompleteMultiple/UserAutoCompleteMultiple.tsx +++ b/apps/meteor/client/components/UserAutoCompleteMultiple/UserAutoCompleteMultiple.tsx @@ -1,4 +1,4 @@ -import { AutoComplete, Box, Option, Chip } from '@rocket.chat/fuselage'; +import { AutoComplete, Box, Option, OptionAvatar, OptionContent, Chip } from '@rocket.chat/fuselage'; import { useMutableCallback, useDebouncedValue } from '@rocket.chat/fuselage-hooks'; import React, { ComponentProps, memo, ReactElement, useMemo, useState } from 'react'; @@ -52,12 +52,12 @@ const UserAutoCompleteMultiple = ({ onChange, ...props }: UserAutoCompleteMultip } renderItem={({ value, label, ...props }): ReactElement => ( )} options={options} diff --git a/apps/meteor/client/contexts/CallContext.ts b/apps/meteor/client/contexts/CallContext.ts index b28a325e97cf..bb739416a74c 100644 --- a/apps/meteor/client/contexts/CallContext.ts +++ b/apps/meteor/client/contexts/CallContext.ts @@ -1,6 +1,6 @@ import type { IVoipRoom } from '@rocket.chat/core-typings'; import { ICallerInfo, VoIpCallerInfo } from '@rocket.chat/core-typings'; -import { createContext, useCallback, useContext } from 'react'; +import { createContext, useContext, useMemo } from 'react'; import { useSyncExternalStore } from 'use-sync-external-store/shim'; import { VoIPUser } from '../lib/voip/VoIPUser'; @@ -62,18 +62,11 @@ export const useIsCallEnabled = (): boolean => { return enabled; }; -let callerInfo: VoIpCallerInfo; - export const useIsCallReady = (): boolean => { - const context = useContext(CallContext); + const { ready } = useContext(CallContext); - if (isCallContextReady(context)) { - callerInfo = context.voipClient.callerInfo; - } - - return !!context.ready; + return Boolean(ready); }; - export const useIsCallError = (): boolean => { const context = useContext(CallContext); return Boolean(isCallContextError(context)); @@ -94,19 +87,21 @@ export const useCallerInfo = (): VoIpCallerInfo => { if (!isCallContextReady(context)) { throw new Error('useCallerInfo only if Calls are enabled and ready'); } + const { voipClient } = context; - const subscribe = useCallback( - (callback: () => void): (() => void) => { - voipClient.on('stateChanged', callback); - - return (): void => { - voipClient.off('stateChanged', callback); - }; - }, - [voipClient], - ); - - const getSnapshot = (): VoIpCallerInfo => callerInfo; + + const [subscribe, getSnapshot] = useMemo(() => { + let caller: VoIpCallerInfo = voipClient.callerInfo; + + const callback = (cb: () => void): (() => void) => + voipClient.on('stateChanged', () => { + caller = voipClient.callerInfo; + cb(); + }); + + const getSnapshot = (): VoIpCallerInfo => caller; + return [callback, getSnapshot]; + }, [voipClient]); return useSyncExternalStore(subscribe, getSnapshot); }; diff --git a/apps/meteor/client/providers/ModalProvider.tsx b/apps/meteor/client/providers/ModalProvider.tsx index e3bab9d296b3..868cccf50052 100644 --- a/apps/meteor/client/providers/ModalProvider.tsx +++ b/apps/meteor/client/providers/ModalProvider.tsx @@ -1,9 +1,7 @@ import { ModalContext } from '@rocket.chat/ui-contexts'; -import React, { useState, useMemo, memo, ReactNode, useCallback, ReactElement } from 'react'; +import React, { useState, useMemo, memo, ReactNode, ReactElement } from 'react'; import { modal } from '../../app/ui-utils/client/lib/modal'; -import ModalBackdrop from '../components/modal/ModalBackdrop'; -import ModalPortal from '../components/modal/ModalPortal'; import { useImperativeModal } from '../views/hooks/useImperativeModal'; type ModalProviderProps = { @@ -14,27 +12,18 @@ const ModalProvider = ({ children }: ModalProviderProps): ReactElement => { const [currentModal, setCurrentModal] = useState(null); const contextValue = useMemo( - () => - Object.assign(modal, { + () => ({ + modal: Object.assign(modal, { setModal: setCurrentModal, }), - [], + currentModal, + }), + [currentModal], ); useImperativeModal(setCurrentModal); - const handleDismiss = useCallback(() => setCurrentModal(null), [setCurrentModal]); - - return ( - - {children} - {currentModal && ( - - {currentModal} - - )} - - ); + return ; }; export default memo(ModalProvider); diff --git a/apps/meteor/client/providers/RouterProvider.tsx b/apps/meteor/client/providers/RouterProvider.tsx index 91f9711b4587..8a505723df38 100644 --- a/apps/meteor/client/providers/RouterProvider.tsx +++ b/apps/meteor/client/providers/RouterProvider.tsx @@ -9,7 +9,7 @@ const createSubscription = function (getValue: () => T): [subscribe: (onStore (callback: () => void): (() => void) => { const computation = Tracker.autorun(() => { currentValue = getValue(); - callback(); + Tracker.afterFlush(callback); }); return (): void => { diff --git a/apps/meteor/client/sidebar/Item/Condensed.stories.tsx b/apps/meteor/client/sidebar/Item/Condensed.stories.tsx index b8e4bf89962a..ef4d434ce0f0 100644 --- a/apps/meteor/client/sidebar/Item/Condensed.stories.tsx +++ b/apps/meteor/client/sidebar/Item/Condensed.stories.tsx @@ -60,9 +60,9 @@ export const Actions = Template.bind({}); Actions.args = { actions: ( <> - - - + + + ), diff --git a/apps/meteor/client/sidebar/Item/Extended.stories.tsx b/apps/meteor/client/sidebar/Item/Extended.stories.tsx index 36cd5e1e9ad8..50e7bbf972bb 100644 --- a/apps/meteor/client/sidebar/Item/Extended.stories.tsx +++ b/apps/meteor/client/sidebar/Item/Extended.stories.tsx @@ -85,9 +85,9 @@ export const Actions = Template.bind({}); Actions.args = { actions: ( <> - - - + + + ), diff --git a/apps/meteor/client/sidebar/Item/Medium.stories.tsx b/apps/meteor/client/sidebar/Item/Medium.stories.tsx index 291e3595f2ef..62e913a69d7a 100644 --- a/apps/meteor/client/sidebar/Item/Medium.stories.tsx +++ b/apps/meteor/client/sidebar/Item/Medium.stories.tsx @@ -60,9 +60,9 @@ export const Actions = Template.bind({}); Actions.args = { actions: ( <> - - - + + + ), diff --git a/apps/meteor/client/sidebar/header/CreateChannelWithData.tsx b/apps/meteor/client/sidebar/header/CreateChannelWithData.tsx index 467f6c23be36..eeb1c46f34cb 100644 --- a/apps/meteor/client/sidebar/header/CreateChannelWithData.tsx +++ b/apps/meteor/client/sidebar/header/CreateChannelWithData.tsx @@ -41,7 +41,7 @@ const CreateChannelWithData = ({ onClose, teamId = '', reload }: CreateChannelWi }, [canCreateChannel, canCreatePrivateChannel]); const initialValues = { - users: [''], + users: [], name: '', description: '', type: canOnlyCreateOneType ? canOnlyCreateOneType === 'p' : true, diff --git a/apps/meteor/client/sidebar/hooks/useSidebarPaletteColor.js b/apps/meteor/client/sidebar/hooks/useSidebarPaletteColor.js index ac0ee2149d40..8396281fb43b 100644 --- a/apps/meteor/client/sidebar/hooks/useSidebarPaletteColor.js +++ b/apps/meteor/client/sidebar/hooks/useSidebarPaletteColor.js @@ -150,15 +150,15 @@ const getStyle = ( --rcx-color-neutral-800: ${toVar(colors.n200)}; --rcx-color-neutral-900: ${toVar(colors.n100)}; - --rcx-color-primary-100: ${toVar(colors.p900)}; - --rcx-color-primary-200: ${toVar(colors.p800)}; - --rcx-color-primary-300: ${toVar(colors.p700)}; - --rcx-color-primary-400: ${toVar(colors.p600)}; - --rcx-color-primary-500: ${toVar(colors.p500)}; - --rcx-color-primary-600: ${toVar(colors.p400)}; - --rcx-color-primary-700: ${toVar(colors.p300)}; - --rcx-color-primary-800: ${toVar(colors.p200)}; - --rcx-color-primary-900: ${toVar(colors.p100)}; + --rcx-color-primary-100: ${toVar(colors.b900)}; + --rcx-color-primary-200: ${toVar(colors.b800)}; + --rcx-color-primary-300: ${toVar(colors.b700)}; + --rcx-color-primary-400: ${toVar(colors.b600)}; + --rcx-color-primary-500: ${toVar(colors.b500)}; + --rcx-color-primary-600: ${toVar(colors.b400)}; + --rcx-color-primary-700: ${toVar(colors.b300)}; + --rcx-color-primary-800: ${toVar(colors.b200)}; + --rcx-color-primary-900: ${toVar(colors.b100)}; --rcx-button-colors-icon-active-border-color: ${toVar(colors.n900)}; --rcx-button-colors-icon-active-background-color: ${toVar(colors.n800)}; @@ -167,6 +167,9 @@ const getStyle = ( --rcx-button-colors-icon-background-color: ${toVar(colors.sibebarSurface)}; --rcx-button-colors-icon-hover-background-color: ${toVar(colors.n900)}; --rcx-button-colors-icon-hover-border-color: ${toVar(colors.n900)}; + --rcx-button-colors-icon-focus-background-color: var(--rcx-color-neutral-300); + --rcx-button-colors-icon-focus-border-color: var(--rcx-color-neutral-500); + --rcx-button-colors-icon-focus-shadow-color: none; --rcx-button-colors-icon-success-active-border-color: ${toVar(colors.n900)}; --rcx-button-colors-icon-success-active-background-color: ${toVar(colors.n800)}; @@ -186,11 +189,20 @@ const getStyle = ( --rcx-divider-color: ${h2r(toVar(colors.n900), 0.4)}; --rcx-color-foreground-alternative: ${toVar(colors.n100)}; --rcx-color-foreground-hint: ${toVar(colors.n600)}; + + } + + .rcx-badge--danger { + --rcx-badge-colors-danger-background-color: ${toVar(colors.r500)} } + .rcx-badge--primary { + --rcx-badge-colors-primary-background-color: ${toVar(colors.b500)} + } + .rcx-sidebar { background-color: ${toVar(colors.sibebarSurface)}; } - ` + ` )(isIE11 ? ':root' : modifier); const useSidebarPaletteColorIE11 = () => { diff --git a/apps/meteor/client/stories/contexts/ModalContextMock.tsx b/apps/meteor/client/stories/contexts/ModalContextMock.tsx index 7abc158dcc1d..cca7c117560a 100644 --- a/apps/meteor/client/stories/contexts/ModalContextMock.tsx +++ b/apps/meteor/client/stories/contexts/ModalContextMock.tsx @@ -9,16 +9,22 @@ type ModalContextMockProps = { }; const ModalContextMock = ({ children }: ModalContextMockProps): ReactElement => { - const parent = useContext(ModalContext); + const context = useContext(ModalContext); const value = useMemo( - (): ContextType => ({ - ...parent, - setModal: (modal): void => { - logAction('setModal', modal); - }, - }), - [parent], + (): ContextType => + context?.modal + ? { + modal: { + ...context.modal, + setModal: (modal): void => { + logAction('setModal', modal); + }, + }, + currentModal: context.currentModal, + } + : undefined, + [context], ); return ; diff --git a/apps/meteor/client/views/admin/permissions/EditRolePage.tsx b/apps/meteor/client/views/admin/permissions/EditRolePage.tsx index c405e2d2f934..675cf3eb0200 100644 --- a/apps/meteor/client/views/admin/permissions/EditRolePage.tsx +++ b/apps/meteor/client/views/admin/permissions/EditRolePage.tsx @@ -103,7 +103,7 @@ const EditRolePage = ({ role }: { role?: IRole }): ReactElement => { {t('Save')} {!role?.protected && role?._id && ( - )} diff --git a/apps/meteor/client/views/admin/permissions/UsersInRole/UsersInRoleTable/UsersInRoleTableRow.tsx b/apps/meteor/client/views/admin/permissions/UsersInRole/UsersInRoleTable/UsersInRoleTableRow.tsx index 9bd902cf11c2..9234506fdb14 100644 --- a/apps/meteor/client/views/admin/permissions/UsersInRole/UsersInRoleTable/UsersInRoleTableRow.tsx +++ b/apps/meteor/client/views/admin/permissions/UsersInRole/UsersInRoleTable/UsersInRoleTableRow.tsx @@ -41,7 +41,7 @@ const UsersInRoleTableRow = ({ user, onRemove }: UsersInRoleTableRowProps): Reac {email} - diff --git a/apps/meteor/client/views/admin/settings/ResetSettingButton.tsx b/apps/meteor/client/views/admin/settings/ResetSettingButton.tsx index f708ff477c9d..30cff7459e7a 100644 --- a/apps/meteor/client/views/admin/settings/ResetSettingButton.tsx +++ b/apps/meteor/client/views/admin/settings/ResetSettingButton.tsx @@ -5,7 +5,7 @@ import React, { ComponentProps, ReactElement } from 'react'; function ResetSettingButton(props: ComponentProps): ReactElement { const t = useTranslation(); - return ; + return ; } export default ResetSettingButton; diff --git a/apps/meteor/client/views/admin/settings/Section.tsx b/apps/meteor/client/views/admin/settings/Section.tsx index 26ff90c29d80..8dc93cb46ee7 100644 --- a/apps/meteor/client/views/admin/settings/Section.tsx +++ b/apps/meteor/client/views/admin/settings/Section.tsx @@ -91,7 +91,8 @@ function Section({ groupId, hasReset = true, sectionName, tabName = '', solo, he {hasReset && canReset && ( diff --git a/apps/meteor/client/views/admin/settings/groups/voip/RemoveAgentButton.tsx b/apps/meteor/client/views/admin/settings/groups/voip/RemoveAgentButton.tsx index 54b3e62b470a..1499b4620741 100644 --- a/apps/meteor/client/views/admin/settings/groups/voip/RemoveAgentButton.tsx +++ b/apps/meteor/client/views/admin/settings/groups/voip/RemoveAgentButton.tsx @@ -6,14 +6,14 @@ import React, { FC } from 'react'; import GenericModal from '../../../../../components/GenericModal'; const RemoveAgentButton: FC<{ username: string; reload: () => void }> = ({ username, reload }) => { - const removeAgent = useEndpoint('DELETE', '/v1/omnichannel/agent/extension'); + const removeAgent = useEndpoint('DELETE', `/v1/omnichannel/agent/extension/${username}`); const setModal = useSetModal(); const dispatchToastMessage = useToastMessageDispatch(); const t = useTranslation(); const handleRemoveClick = useMutableCallback(async () => { try { - await removeAgent({ username }); + await removeAgent(); } catch (error: any) { dispatchToastMessage({ type: 'error', message: error }); } diff --git a/apps/meteor/client/views/modal/ModalRegion.tsx b/apps/meteor/client/views/modal/ModalRegion.tsx new file mode 100644 index 000000000000..928683dbd87f --- /dev/null +++ b/apps/meteor/client/views/modal/ModalRegion.tsx @@ -0,0 +1,23 @@ +import { useModal, useCurrentModal } from '@rocket.chat/ui-contexts'; +import React, { useCallback, ReactElement } from 'react'; + +import ModalBackdrop from '../../components/modal/ModalBackdrop'; +import ModalPortal from '../../components/modal/ModalPortal'; + +const ModalRegion = (): ReactElement | null => { + const currentModal = useCurrentModal(); + const { setModal } = useModal(); + const handleDismiss = useCallback(() => setModal(null), [setModal]); + + if (!currentModal) { + return null; + } + + return ( + + {currentModal} + + ); +}; + +export default ModalRegion; diff --git a/apps/meteor/client/views/omnichannel/facebook/FacebookPage.tsx b/apps/meteor/client/views/omnichannel/facebook/FacebookPage.tsx index 00d21e61523b..9836d11db3d6 100644 --- a/apps/meteor/client/views/omnichannel/facebook/FacebookPage.tsx +++ b/apps/meteor/client/views/omnichannel/facebook/FacebookPage.tsx @@ -64,7 +64,7 @@ const FacebookPage: FC = ({ pages, enabled, hasToken, onToggl - diff --git a/apps/meteor/client/views/room/MessageList/components/Toolbox/MessageActionMenu.tsx b/apps/meteor/client/views/room/MessageList/components/Toolbox/MessageActionMenu.tsx index a1fe41e76b8f..46fa4136f94c 100644 --- a/apps/meteor/client/views/room/MessageList/components/Toolbox/MessageActionMenu.tsx +++ b/apps/meteor/client/views/room/MessageList/components/Toolbox/MessageActionMenu.tsx @@ -29,6 +29,8 @@ export const MessageActionMenu: FC<{ [key: string]: MessageActionConfigOption[]; }; + const messagesContainer = document.querySelector('.messages-container') || document.body; + return ( {visible && ( - + {Object.entries(groupOptions).map(([, options], index, arr) => ( {options.map((option) => ( diff --git a/apps/meteor/client/views/room/MessageList/components/Toolbox/ToolboxDropdown.tsx b/apps/meteor/client/views/room/MessageList/components/Toolbox/ToolboxDropdown.tsx index d0e6c17e56b7..cb8ee09c921e 100644 --- a/apps/meteor/client/views/room/MessageList/components/Toolbox/ToolboxDropdown.tsx +++ b/apps/meteor/client/views/room/MessageList/components/Toolbox/ToolboxDropdown.tsx @@ -14,10 +14,12 @@ const style = css` `; export const ToolboxDropdown = ({ reference, + container, children, ...rest }: { reference: React.RefObject; + container: Element; children: ReactNode; }): ReactElement => { const { isMobile } = useLayout(); @@ -27,7 +29,7 @@ export const ToolboxDropdown = ({ return ( <> - + {children} diff --git a/apps/meteor/client/views/room/MessageList/components/Toolbox/ToolboxDropdownDesktop.tsx b/apps/meteor/client/views/room/MessageList/components/Toolbox/ToolboxDropdownDesktop.tsx index 953cda600012..18674f6305bf 100644 --- a/apps/meteor/client/views/room/MessageList/components/Toolbox/ToolboxDropdownDesktop.tsx +++ b/apps/meteor/client/views/room/MessageList/components/Toolbox/ToolboxDropdownDesktop.tsx @@ -7,11 +7,13 @@ export const ToolboxDropdownDesktop = forwardRef< { reference: RefObject; children: ReactNode; + container: Element; } ->(function ToolboxDropdownDesktop({ reference, children, ...rest }, ref) { +>(function ToolboxDropdownDesktop({ reference, container, children, ...rest }, ref) { const { style: s } = usePosition(reference, ref as RefObject, { watch: true, placement: 'bottom-end', + container, }); return ( diff --git a/apps/meteor/client/views/room/contextualBar/OTR/components/OTREstablished.tsx b/apps/meteor/client/views/room/contextualBar/OTR/components/OTREstablished.tsx index 9b19542471d9..02da786855e8 100644 --- a/apps/meteor/client/views/room/contextualBar/OTR/components/OTREstablished.tsx +++ b/apps/meteor/client/views/room/contextualBar/OTR/components/OTREstablished.tsx @@ -13,7 +13,7 @@ const OTREstablished = ({ onClickRefresh, onClickEnd }: OTREstablishedProps): Re return ( - diff --git a/apps/meteor/client/views/room/contextualBar/VideoConference/BBB/CallBBB.tsx b/apps/meteor/client/views/room/contextualBar/VideoConference/BBB/CallBBB.tsx index d4dfdfbd9745..2c79b6bf353a 100644 --- a/apps/meteor/client/views/room/contextualBar/VideoConference/BBB/CallBBB.tsx +++ b/apps/meteor/client/views/room/contextualBar/VideoConference/BBB/CallBBB.tsx @@ -38,7 +38,7 @@ const CallBBB: FC = ({ handleClose, canManageCall, live, startCall )} {live && canManageCall && ( - )} diff --git a/apps/meteor/client/views/root/AppRoot.tsx b/apps/meteor/client/views/root/AppRoot.tsx index 31e35d05cdeb..38f49b638233 100644 --- a/apps/meteor/client/views/root/AppRoot.tsx +++ b/apps/meteor/client/views/root/AppRoot.tsx @@ -10,6 +10,7 @@ const MeteorProvider = lazy(() => import('../../providers/MeteorProvider')); const BannerRegion = lazy(() => import('../banners/BannerRegion')); const AppLayout = lazy(() => import('./AppLayout')); const PortalsWrapper = lazy(() => import('./PortalsWrapper')); +const ModalRegion = lazy(() => import('../modal/ModalRegion')); const AppRoot: FC = () => ( }> @@ -20,6 +21,7 @@ const AppRoot: FC = () => ( + diff --git a/apps/meteor/ee/app/api-enterprise/server/lib/canned-responses.js b/apps/meteor/ee/app/api-enterprise/server/lib/canned-responses.js index 9fe99f00376f..622e0896bc07 100644 --- a/apps/meteor/ee/app/api-enterprise/server/lib/canned-responses.js +++ b/apps/meteor/ee/app/api-enterprise/server/lib/canned-responses.js @@ -1,9 +1,7 @@ import { escapeRegExp } from '@rocket.chat/string-helpers'; +import { LivechatDepartmentAgents, CannedResponse, LivechatUnit } from '@rocket.chat/models'; import { hasPermissionAsync } from '../../../../../app/authorization/server/functions/hasPermission'; -import CannedResponse from '../../../models/server/raw/CannedResponse'; -import LivechatUnit from '../../../models/server/models/LivechatUnit'; -import { LivechatDepartmentAgents } from '../../../../../app/models/server/raw'; export async function findAllCannedResponses({ userId }) { if (!(await hasPermissionAsync(userId, 'view-canned-responses'))) { diff --git a/apps/meteor/ee/app/auditing/server/auditLog.js b/apps/meteor/ee/app/auditing/server/auditLog.js index b106a3ab92e8..427e7cc6b4c7 100644 --- a/apps/meteor/ee/app/auditing/server/auditLog.js +++ b/apps/meteor/ee/app/auditing/server/auditLog.js @@ -1,4 +1,4 @@ -import { Base } from '../../../../app/models'; +import { Base } from '../../../../app/models/server'; class AudtitLog extends Base { constructor() { diff --git a/apps/meteor/ee/app/auditing/server/index.ts b/apps/meteor/ee/app/auditing/server/index.ts index c3c5fbcd9e01..420f9106a3aa 100644 --- a/apps/meteor/ee/app/auditing/server/index.ts +++ b/apps/meteor/ee/app/auditing/server/index.ts @@ -1,8 +1,8 @@ /* eslint no-multi-spaces: 0 */ import { Meteor } from 'meteor/meteor'; +import { Permissions } from '@rocket.chat/models'; import { onLicense } from '../../license/server'; -import { Permissions } from '../../../../app/models/server/raw'; import { createOrUpdateProtectedRole } from '../../../../server/lib/roles/createOrUpdateProtectedRole'; onLicense('auditing', () => { diff --git a/apps/meteor/ee/app/authorization/server/resetEnterprisePermissions.ts b/apps/meteor/ee/app/authorization/server/resetEnterprisePermissions.ts index 6eb8ec74b5c4..aff3f5f5be06 100644 --- a/apps/meteor/ee/app/authorization/server/resetEnterprisePermissions.ts +++ b/apps/meteor/ee/app/authorization/server/resetEnterprisePermissions.ts @@ -1,4 +1,5 @@ -import { Permissions } from '../../../../app/models/server/raw'; +import { Permissions } from '@rocket.chat/models'; + import { guestPermissions } from '../lib/guestPermissions'; export const resetEnterprisePermissions = async function (): Promise { diff --git a/apps/meteor/ee/app/canned-responses/server/hooks/onMessageSentParsePlaceholder.ts b/apps/meteor/ee/app/canned-responses/server/hooks/onMessageSentParsePlaceholder.ts index 94035c20d7cc..e732adbb6696 100644 --- a/apps/meteor/ee/app/canned-responses/server/hooks/onMessageSentParsePlaceholder.ts +++ b/apps/meteor/ee/app/canned-responses/server/hooks/onMessageSentParsePlaceholder.ts @@ -1,10 +1,11 @@ import get from 'lodash.get'; -import type { IMessage } from '@rocket.chat/core-typings'; -import { IOmnichannelRoom, isOmnichannelRoom } from '@rocket.chat/core-typings'; +import type { IMessage, IOmnichannelRoom } from '@rocket.chat/core-typings'; +import { isOmnichannelRoom } from '@rocket.chat/core-typings'; +import { LivechatVisitors } from '@rocket.chat/models'; import { settings } from '../../../../../app/settings/server'; import { callbacks } from '../../../../../lib/callbacks'; -import { Users, LivechatVisitors, Rooms } from '../../../../../app/models/server'; +import { Users, Rooms } from '../../../../../app/models/server'; const placeholderFields = { 'contact.name': { @@ -45,7 +46,7 @@ const handleBeforeSaveMessage = (message: IMessage, room?: IOmnichannelRoom): IM const agentId = room?.servedBy?._id; const visitorId = room?.v?._id; const agent = Users.findOneById(agentId, { fields: { name: 1, _id: 1, emails: 1 } }) || {}; - const visitor = LivechatVisitors.findOneById(visitorId) || {}; + const visitor = visitorId && (Promise.await(LivechatVisitors.findOneById(visitorId, {})) || {}); Object.keys(placeholderFields).map((field) => { const templateKey = `{{${field}}}`; diff --git a/apps/meteor/ee/app/canned-responses/server/methods/saveCannedResponse.js b/apps/meteor/ee/app/canned-responses/server/methods/saveCannedResponse.js index f11ef7264a0d..e77aa558bee7 100644 --- a/apps/meteor/ee/app/canned-responses/server/methods/saveCannedResponse.js +++ b/apps/meteor/ee/app/canned-responses/server/methods/saveCannedResponse.js @@ -4,7 +4,7 @@ import { Match, check } from 'meteor/check'; import { hasPermission } from '../../../../../app/authorization'; import CannedResponse from '../../../models/server/models/CannedResponse'; import LivechatDepartment from '../../../../../app/models/server/models/LivechatDepartment'; -import { Users } from '../../../../../app/models'; +import { Users } from '../../../../../app/models/server'; import notifications from '../../../../../app/notifications/server/lib/Notifications'; Meteor.methods({ diff --git a/apps/meteor/ee/app/canned-responses/server/permissions.ts b/apps/meteor/ee/app/canned-responses/server/permissions.ts index f32650dd09b9..1977939a6dec 100644 --- a/apps/meteor/ee/app/canned-responses/server/permissions.ts +++ b/apps/meteor/ee/app/canned-responses/server/permissions.ts @@ -1,6 +1,5 @@ import { Meteor } from 'meteor/meteor'; - -import { Permissions } from '../../../../app/models/server/raw'; +import { Permissions } from '@rocket.chat/models'; Meteor.startup(() => { Permissions.create('view-canned-responses', ['livechat-agent', 'livechat-monitor', 'livechat-manager', 'admin']); diff --git a/apps/meteor/ee/app/license/server/getStatistics.ts b/apps/meteor/ee/app/license/server/getStatistics.ts index b87c6ebe1f7f..9c6146d13504 100644 --- a/apps/meteor/ee/app/license/server/getStatistics.ts +++ b/apps/meteor/ee/app/license/server/getStatistics.ts @@ -1,8 +1,9 @@ import { log } from 'console'; +import { CannedResponse, LivechatPriority, LivechatTag, LivechatUnit } from '@rocket.chat/models'; + import { getModules, getTags } from './license'; import { Analytics } from '../../../../server/sdk'; -import { CannedResponseRaw, LivechatPriorityRaw, LivechatTagRaw, LivechatUnitRaw } from '../../models/server'; type ENTERPRISE_STATISTICS = { modules: string[]; @@ -32,7 +33,7 @@ export async function getStatistics(): Promise { ); // Number of livechat tags statsPms.push( - LivechatTagRaw.col.count().then((count) => { + LivechatTag.col.count().then((count) => { statistics.livechatTags = count; return true; }), @@ -40,7 +41,7 @@ export async function getStatistics(): Promise { // Number of canned responses statsPms.push( - CannedResponseRaw.col.count().then((count) => { + CannedResponse.col.count().then((count) => { statistics.cannedResponses = count; return true; }), @@ -48,7 +49,7 @@ export async function getStatistics(): Promise { // Number of Priorities statsPms.push( - LivechatPriorityRaw.col.count().then((count) => { + LivechatPriority.col.count().then((count) => { statistics.priorities = count; return true; }), @@ -56,7 +57,7 @@ export async function getStatistics(): Promise { // Number of business units statsPms.push( - LivechatUnitRaw.col.count().then((count) => { + LivechatUnit.col.count().then((count) => { statistics.businessUnits = count; return true; }), diff --git a/apps/meteor/ee/app/livechat-enterprise/server/api/lib/inquiries.js b/apps/meteor/ee/app/livechat-enterprise/server/api/lib/inquiries.js index 8d3e6097a640..5f8572e2208c 100644 --- a/apps/meteor/ee/app/livechat-enterprise/server/api/lib/inquiries.js +++ b/apps/meteor/ee/app/livechat-enterprise/server/api/lib/inquiries.js @@ -1,6 +1,6 @@ +import { LivechatInquiry, Users, LivechatPriority } from '@rocket.chat/models'; + import { hasPermissionAsync } from '../../../../../../app/authorization/server/functions/hasPermission'; -import LivechatPriority from '../../../../models/server/raw/LivechatPriority'; -import { LivechatInquiry, Users } from '../../../../../../app/models/server/raw'; import { LivechatEnterprise } from '../../lib/LivechatEnterprise'; export async function setPriorityToInquiry({ userId, roomId, priority }) { diff --git a/apps/meteor/ee/app/livechat-enterprise/server/api/lib/monitors.js b/apps/meteor/ee/app/livechat-enterprise/server/api/lib/monitors.js index 33e0fbaf488f..d8f234ddb54f 100644 --- a/apps/meteor/ee/app/livechat-enterprise/server/api/lib/monitors.js +++ b/apps/meteor/ee/app/livechat-enterprise/server/api/lib/monitors.js @@ -1,7 +1,7 @@ import { escapeRegExp } from '@rocket.chat/string-helpers'; +import { Users } from '@rocket.chat/models'; import { hasPermissionAsync } from '../../../../../../app/authorization/server/functions/hasPermission'; -import { Users } from '../../../../../../app/models/server/raw'; export async function findMonitors({ userId, text, pagination: { offset, count, sort } }) { if (!(await hasPermissionAsync(userId, 'manage-livechat-monitors'))) { diff --git a/apps/meteor/ee/app/livechat-enterprise/server/api/lib/priorities.js b/apps/meteor/ee/app/livechat-enterprise/server/api/lib/priorities.js index 18cb780d98b8..5d14e24c356e 100644 --- a/apps/meteor/ee/app/livechat-enterprise/server/api/lib/priorities.js +++ b/apps/meteor/ee/app/livechat-enterprise/server/api/lib/priorities.js @@ -1,7 +1,7 @@ import { escapeRegExp } from '@rocket.chat/string-helpers'; +import LivechatPriority from '@rocket.chat/models'; import { hasPermissionAsync } from '../../../../../../app/authorization/server/functions/hasPermission'; -import LivechatPriority from '../../../../models/server/raw/LivechatPriority'; export async function findPriorities({ userId, text, pagination: { offset, count, sort } }) { if (!(await hasPermissionAsync(userId, 'manage-livechat-priorities')) && !(await hasPermissionAsync(userId, 'view-l-room'))) { diff --git a/apps/meteor/ee/app/livechat-enterprise/server/api/lib/tags.js b/apps/meteor/ee/app/livechat-enterprise/server/api/lib/tags.js index c3357e46d026..c903a08ec5d8 100644 --- a/apps/meteor/ee/app/livechat-enterprise/server/api/lib/tags.js +++ b/apps/meteor/ee/app/livechat-enterprise/server/api/lib/tags.js @@ -1,7 +1,7 @@ import { escapeRegExp } from '@rocket.chat/string-helpers'; +import LivechatTag from '@rocket.chat/models'; import { hasPermissionAsync } from '../../../../../../app/authorization/server/functions/hasPermission'; -import LivechatTag from '../../../../models/server/raw/LivechatTag'; export async function findTags({ userId, text, pagination: { offset, count, sort } }) { if (!(await hasPermissionAsync(userId, 'manage-livechat-tags')) && !(await hasPermissionAsync(userId, 'view-l-room'))) { diff --git a/apps/meteor/ee/app/livechat-enterprise/server/api/lib/units.ts b/apps/meteor/ee/app/livechat-enterprise/server/api/lib/units.ts index d72c6b0c1800..866aa4ff4f9c 100644 --- a/apps/meteor/ee/app/livechat-enterprise/server/api/lib/units.ts +++ b/apps/meteor/ee/app/livechat-enterprise/server/api/lib/units.ts @@ -1,9 +1,9 @@ import { escapeRegExp } from '@rocket.chat/string-helpers'; import type { IOmnichannelBusinessUnit, ILivechatMonitor } from '@rocket.chat/core-typings'; +import { LivechatUnitMonitors } from '@rocket.chat/models'; import { hasPermissionAsync } from '../../../../../../app/authorization/server/functions/hasPermission'; import LivechatUnit from '../../../../models/server/models/LivechatUnit'; -import LivechatUnitMonitors from '../../../../models/server/raw/LivechatUnitMonitors'; export async function findUnits({ userId, diff --git a/apps/meteor/ee/app/livechat-enterprise/server/business-hour/Custom.ts b/apps/meteor/ee/app/livechat-enterprise/server/business-hour/Custom.ts index 8e2e3fa877ba..f53c1418a521 100644 --- a/apps/meteor/ee/app/livechat-enterprise/server/business-hour/Custom.ts +++ b/apps/meteor/ee/app/livechat-enterprise/server/business-hour/Custom.ts @@ -1,9 +1,7 @@ import { ILivechatBusinessHour, LivechatBusinessHourTypes } from '@rocket.chat/core-typings'; +import { LivechatDepartment, LivechatDepartmentAgents } from '@rocket.chat/models'; import { AbstractBusinessHourType, IBusinessHourType } from '../../../../../app/livechat/server/business-hour/AbstractBusinessHour'; -import { LivechatDepartmentRaw } from '../../../../../app/models/server/raw/LivechatDepartment'; -import { LivechatDepartmentAgentsRaw } from '../../../../../app/models/server/raw/LivechatDepartmentAgents'; -import { LivechatDepartment, LivechatDepartmentAgents } from '../../../../../app/models/server/raw'; import { businessHourManager } from '../../../../../app/livechat/server/business-hour'; type IBusinessHoursExtraProperties = { @@ -14,10 +12,6 @@ type IBusinessHoursExtraProperties = { class CustomBusinessHour extends AbstractBusinessHourType implements IBusinessHourType { name = LivechatBusinessHourTypes.CUSTOM; - private DepartmentsRepository: LivechatDepartmentRaw = LivechatDepartment; - - private DepartmentsAgentsRepository: LivechatDepartmentAgentsRaw = LivechatDepartmentAgents; - async getBusinessHour(id: string): Promise { if (!id) { return null; @@ -28,7 +22,7 @@ class CustomBusinessHour extends AbstractBusinessHourType implements IBusinessHo return null; } - businessHour.departments = await this.DepartmentsRepository.findByBusinessHourId(businessHour._id, { + businessHour.departments = await LivechatDepartment.findByBusinessHourId(businessHour._id, { projection: { name: 1 }, }).toArray(); return businessHour; @@ -52,7 +46,7 @@ class CustomBusinessHour extends AbstractBusinessHourType implements IBusinessHo delete businessHourData.departments; const businessHourId = await this.baseSaveBusinessHour(businessHourData); const currentDepartments = ( - await this.DepartmentsRepository.findByBusinessHourId(businessHourId, { + await LivechatDepartment.findByBusinessHourId(businessHourId, { projection: { _id: 1 }, }).toArray() ).map((dept) => dept._id); @@ -71,18 +65,18 @@ class CustomBusinessHour extends AbstractBusinessHourType implements IBusinessHo } await this.BusinessHourRepository.removeById(businessHourId); await this.removeBusinessHourFromAgents(businessHourId); - await this.DepartmentsRepository.removeBusinessHourFromDepartmentsByBusinessHourId(businessHourId); + await LivechatDepartment.removeBusinessHourFromDepartmentsByBusinessHourId(businessHourId); this.UsersRepository.updateLivechatStatusBasedOnBusinessHours(); } private async removeBusinessHourFromAgents(businessHourId: string): Promise { const departmentIds = ( - await this.DepartmentsRepository.findByBusinessHourId(businessHourId, { + await LivechatDepartment.findByBusinessHourId(businessHourId, { projection: { _id: 1 }, }).toArray() ).map((dept) => dept._id); const agentIds = ( - await this.DepartmentsAgentsRepository.findByDepartmentIds(departmentIds, { + await LivechatDepartmentAgents.findByDepartmentIds(departmentIds, { projection: { agentId: 1 }, }).toArray() ).map((dept) => dept.agentId); @@ -93,14 +87,14 @@ class CustomBusinessHour extends AbstractBusinessHourType implements IBusinessHo if (!departmentsToRemove.length) { return; } - await this.DepartmentsRepository.removeBusinessHourFromDepartmentsByIdsAndBusinessHourId(departmentsToRemove, businessHourId); + await LivechatDepartment.removeBusinessHourFromDepartmentsByIdsAndBusinessHourId(departmentsToRemove, businessHourId); } private async addBusinessHourToDepartmentsIfNeeded(businessHourId: string, departmentsToAdd: string[]): Promise { if (!departmentsToAdd.length) { return; } - await this.DepartmentsRepository.addBusinessHourToDepartmentsByIds(departmentsToAdd, businessHourId); + await LivechatDepartment.addBusinessHourToDepartmentsByIds(departmentsToAdd, businessHourId); } } diff --git a/apps/meteor/ee/app/livechat-enterprise/server/business-hour/Helper.ts b/apps/meteor/ee/app/livechat-enterprise/server/business-hour/Helper.ts index b2a8b50db0aa..42fb1d12a519 100644 --- a/apps/meteor/ee/app/livechat-enterprise/server/business-hour/Helper.ts +++ b/apps/meteor/ee/app/livechat-enterprise/server/business-hour/Helper.ts @@ -1,8 +1,7 @@ import { Meteor } from 'meteor/meteor'; import moment from 'moment-timezone'; import { ILivechatBusinessHour, LivechatBusinessHourTypes } from '@rocket.chat/core-typings'; - -import { LivechatBusinessHours, LivechatDepartment, LivechatDepartmentAgents, Users } from '../../../../../app/models/server/raw'; +import { LivechatBusinessHours, LivechatDepartment, LivechatDepartmentAgents, Users } from '@rocket.chat/models'; const getAllAgentIdsWithoutDepartment = async (): Promise => { const agentIdsWithDepartment = ( diff --git a/apps/meteor/ee/app/livechat-enterprise/server/business-hour/Multiple.ts b/apps/meteor/ee/app/livechat-enterprise/server/business-hour/Multiple.ts index 53ed19840c59..a81dae093d18 100644 --- a/apps/meteor/ee/app/livechat-enterprise/server/business-hour/Multiple.ts +++ b/apps/meteor/ee/app/livechat-enterprise/server/business-hour/Multiple.ts @@ -1,11 +1,9 @@ import moment from 'moment'; import { ILivechatBusinessHour, LivechatBusinessHourTypes } from '@rocket.chat/core-typings'; import type { ILivechatDepartment } from '@rocket.chat/core-typings'; +import { LivechatDepartment, LivechatDepartmentAgents } from '@rocket.chat/models'; import { AbstractBusinessHourBehavior, IBusinessHourBehavior } from '../../../../../app/livechat/server/business-hour/AbstractBusinessHour'; -import { LivechatDepartmentRaw } from '../../../../../app/models/server/raw/LivechatDepartment'; -import { LivechatDepartmentAgentsRaw } from '../../../../../app/models/server/raw/LivechatDepartmentAgents'; -import { LivechatDepartment, LivechatDepartmentAgents } from '../../../../../app/models/server/raw'; import { filterBusinessHoursThatMustBeOpened } from '../../../../../app/livechat/server/business-hour/Helper'; import { closeBusinessHour, openBusinessHour, removeBusinessHourByAgentIds } from './Helper'; import { bhLogger } from '../lib/logger'; @@ -16,10 +14,6 @@ interface IBusinessHoursExtraProperties extends ILivechatBusinessHour { } export class MultipleBusinessHoursBehavior extends AbstractBusinessHourBehavior implements IBusinessHourBehavior { - private DepartmentsRepository: LivechatDepartmentRaw = LivechatDepartment; - - private DepartmentsAgentsRepository: LivechatDepartmentAgentsRaw = LivechatDepartmentAgents; - constructor() { super(); this.onAddAgentToDepartment = this.onAddAgentToDepartment.bind(this); @@ -88,7 +82,7 @@ export class MultipleBusinessHoursBehavior extends AbstractBusinessHourBehavior async onAddAgentToDepartment(options: Record = {}): Promise { const { departmentId, agentsId } = options; - const department = await this.DepartmentsRepository.findOneById>(departmentId, { + const department = await LivechatDepartment.findOneById>(departmentId, { projection: { businessHourId: 1 }, }); if (!department || !agentsId.length) { @@ -116,7 +110,7 @@ export class MultipleBusinessHoursBehavior extends AbstractBusinessHourBehavior async onRemoveAgentFromDepartment(options: Record = {}): Promise { const { departmentId, agentsId } = options; - const department = await this.DepartmentsRepository.findOneById>(departmentId, { + const department = await LivechatDepartment.findOneById>(departmentId, { fields: { businessHourId: 1 }, }); if (!department || !agentsId.length) { @@ -227,10 +221,10 @@ export class MultipleBusinessHoursBehavior extends AbstractBusinessHourBehavior const agentIdsWithoutDepartment = []; const agentIdsToRemoveCurrentBusinessHour = []; for await (const agentId of agentsIds) { - if ((await this.DepartmentsAgentsRepository.findByAgentId(agentId).count()) === 0) { + if ((await LivechatDepartmentAgents.findByAgentId(agentId).count()) === 0) { agentIdsWithoutDepartment.push(agentId); } - if (!(await this.DepartmentsAgentsRepository.findAgentsByAgentIdAndBusinessHourId(agentId, department.businessHourId)).length) { + if (!(await LivechatDepartmentAgents.findAgentsByAgentIdAndBusinessHourId(agentId, department.businessHourId)).length) { // eslint-disable-line no-await-in-loop agentIdsToRemoveCurrentBusinessHour.push(agentId); } @@ -264,9 +258,7 @@ export class MultipleBusinessHoursBehavior extends AbstractBusinessHourBehavior if (!departmentsToRemove.length) { return; } - const agentIds = (await this.DepartmentsAgentsRepository.findByDepartmentIds(departmentsToRemove).toArray()).map( - (dept: any) => dept.agentId, - ); + const agentIds = (await LivechatDepartmentAgents.findByDepartmentIds(departmentsToRemove).toArray()).map((dept: any) => dept.agentId); await removeBusinessHourByAgentIds(agentIds, businessHourId); } diff --git a/apps/meteor/ee/app/livechat-enterprise/server/business-hour/lib/business-hour.ts b/apps/meteor/ee/app/livechat-enterprise/server/business-hour/lib/business-hour.ts index 5d313964a623..e1aba9d1b00d 100644 --- a/apps/meteor/ee/app/livechat-enterprise/server/business-hour/lib/business-hour.ts +++ b/apps/meteor/ee/app/livechat-enterprise/server/business-hour/lib/business-hour.ts @@ -1,8 +1,8 @@ import { escapeRegExp } from '@rocket.chat/string-helpers'; import type { ILivechatBusinessHour } from '@rocket.chat/core-typings'; +import { LivechatBusinessHours } from '@rocket.chat/models'; import { hasPermissionAsync } from '../../../../../../app/authorization/server/functions/hasPermission'; -import { LivechatBusinessHours } from '../../../../../../app/models/server/raw'; import { IPaginatedResponse, IPagination } from '../../api/lib/definition'; interface IResponse extends IPaginatedResponse { diff --git a/apps/meteor/ee/app/livechat-enterprise/server/hooks/beforeJoinRoom.ts b/apps/meteor/ee/app/livechat-enterprise/server/hooks/beforeJoinRoom.ts index 897ae0f38f8d..a5c78444b17b 100644 --- a/apps/meteor/ee/app/livechat-enterprise/server/hooks/beforeJoinRoom.ts +++ b/apps/meteor/ee/app/livechat-enterprise/server/hooks/beforeJoinRoom.ts @@ -1,9 +1,9 @@ import { Meteor } from 'meteor/meteor'; import { isOmnichannelRoom, IRoom } from '@rocket.chat/core-typings'; import type { IUser } from '@rocket.chat/core-typings'; +import { Users } from '@rocket.chat/models'; import { callbacks } from '../../../../../lib/callbacks'; -import { Users } from '../../../../../app/models/server/raw'; import { settings } from '../../../../../app/settings/server'; import { getMaxNumberSimultaneousChat } from '../lib/Helper'; diff --git a/apps/meteor/ee/app/livechat-enterprise/server/hooks/beforeRoutingChat.js b/apps/meteor/ee/app/livechat-enterprise/server/hooks/beforeRoutingChat.js index c425d3b790c9..9e356b1a6847 100644 --- a/apps/meteor/ee/app/livechat-enterprise/server/hooks/beforeRoutingChat.js +++ b/apps/meteor/ee/app/livechat-enterprise/server/hooks/beforeRoutingChat.js @@ -1,10 +1,11 @@ +import { LivechatDepartment, LivechatInquiry as LivechatInquiryRaw, LivechatRooms } from '@rocket.chat/models'; + import { callbacks } from '../../../../../lib/callbacks'; import { settings } from '../../../../../app/settings/server'; import { LivechatInquiry } from '../../../../../app/models/server'; import { dispatchInquiryPosition } from '../lib/Helper'; import { allowAgentSkipQueue } from '../../../../../app/livechat/server/lib/Helper'; import { Livechat } from '../../../../../app/livechat/server/lib/Livechat'; -import { LivechatDepartment, LivechatInquiry as LivechatInquiryRaw, LivechatRooms } from '../../../../../app/models/server/raw'; import { online } from '../../../../../app/livechat/server/api/lib/livechat'; import { saveQueueInquiry } from '../../../../../app/livechat/server/lib/QueueManager'; import { cbLogger } from '../lib/logger'; diff --git a/apps/meteor/ee/app/livechat-enterprise/server/hooks/checkAgentBeforeTakeInquiry.ts b/apps/meteor/ee/app/livechat-enterprise/server/hooks/checkAgentBeforeTakeInquiry.ts index 84ee02bee90a..d503f81ea564 100644 --- a/apps/meteor/ee/app/livechat-enterprise/server/hooks/checkAgentBeforeTakeInquiry.ts +++ b/apps/meteor/ee/app/livechat-enterprise/server/hooks/checkAgentBeforeTakeInquiry.ts @@ -1,7 +1,7 @@ import { Meteor } from 'meteor/meteor'; +import { Users } from '@rocket.chat/models'; import { callbacks } from '../../../../../lib/callbacks'; -import { Users } from '../../../../../app/models/server/raw'; import { settings } from '../../../../../app/settings/server'; import { getMaxNumberSimultaneousChat } from '../lib/Helper'; import { allowAgentSkipQueue } from '../../../../../app/livechat/server/lib/Helper'; diff --git a/apps/meteor/ee/app/livechat-enterprise/server/hooks/handleNextAgentPreferredEvents.js b/apps/meteor/ee/app/livechat-enterprise/server/hooks/handleNextAgentPreferredEvents.js index 7d02964e79fb..6ffb215450af 100644 --- a/apps/meteor/ee/app/livechat-enterprise/server/hooks/handleNextAgentPreferredEvents.js +++ b/apps/meteor/ee/app/livechat-enterprise/server/hooks/handleNextAgentPreferredEvents.js @@ -1,7 +1,9 @@ +import { LivechatVisitors } from '@rocket.chat/models'; + import { callbacks } from '../../../../../lib/callbacks'; import { RoutingManager } from '../../../../../app/livechat/server/lib/RoutingManager'; import { settings } from '../../../../../app/settings/server'; -import { LivechatRooms, LivechatInquiry, LivechatVisitors, Users } from '../../../../../app/models/server'; +import { LivechatRooms, LivechatInquiry, Users } from '../../../../../app/models/server'; let contactManagerPreferred = false; let lastChattedAgentPreferred = false; @@ -24,9 +26,11 @@ const checkDefaultAgentOnNewRoom = (defaultAgent, defaultGuest) => { } const { _id: guestId } = defaultGuest; - const guest = LivechatVisitors.findOneById(guestId, { - fields: { lastAgent: 1, token: 1, contactManager: 1 }, - }); + const guest = Promise.await( + LivechatVisitors.findOneById(guestId, { + projection: { lastAgent: 1, token: 1, contactManager: 1 }, + }), + ); if (!guest) { return defaultAgent; } @@ -89,7 +93,7 @@ const afterTakeInquiry = (inquiry, agent) => { return inquiry; } - LivechatVisitors.updateLastAgentByToken(token, { ...agent, ts: new Date() }); + Promise.await(LivechatVisitors.updateLastAgentByToken(token, { ...agent, ts: new Date() })); return inquiry; }; diff --git a/apps/meteor/ee/app/livechat-enterprise/server/hooks/onTransferFailure.ts b/apps/meteor/ee/app/livechat-enterprise/server/hooks/onTransferFailure.ts index 44bfb84ad14e..528261033308 100644 --- a/apps/meteor/ee/app/livechat-enterprise/server/hooks/onTransferFailure.ts +++ b/apps/meteor/ee/app/livechat-enterprise/server/hooks/onTransferFailure.ts @@ -1,8 +1,8 @@ import type { IRoom, ILivechatVisitor, ILivechatDepartment } from '@rocket.chat/core-typings'; +import { LivechatDepartment } from '@rocket.chat/models'; import { callbacks } from '../../../../../lib/callbacks'; import { forwardRoomToDepartment } from '../../../../../app/livechat/server/lib/Helper'; -import { LivechatDepartment } from '../../../../../app/models/server/raw'; import { Messages } from '../../../../../app/models/server'; import { cbLogger } from '../lib/logger'; diff --git a/apps/meteor/ee/app/livechat-enterprise/server/lib/Department.js b/apps/meteor/ee/app/livechat-enterprise/server/lib/Department.js index dde74af2454a..b4f8677759bc 100644 --- a/apps/meteor/ee/app/livechat-enterprise/server/lib/Department.js +++ b/apps/meteor/ee/app/livechat-enterprise/server/lib/Department.js @@ -1,7 +1,7 @@ import { escapeRegExp } from '@rocket.chat/string-helpers'; +import { LivechatDepartment } from '@rocket.chat/models'; import { callbacks } from '../../../../../lib/callbacks'; -import { LivechatDepartment } from '../../../../../app/models/server/raw'; export const findAllDepartmentsAvailable = async (uid, unitId, offset, count, text, onlyMyDepartments = false) => { const filterReg = new RegExp(escapeRegExp(text), 'i'); diff --git a/apps/meteor/ee/app/livechat-enterprise/server/lib/Helper.js b/apps/meteor/ee/app/livechat-enterprise/server/lib/Helper.js index 9431e4316d2b..0d092e0e0b9c 100644 --- a/apps/meteor/ee/app/livechat-enterprise/server/lib/Helper.js +++ b/apps/meteor/ee/app/livechat-enterprise/server/lib/Helper.js @@ -1,10 +1,10 @@ import { Meteor } from 'meteor/meteor'; import moment from 'moment'; +import { Rooms as RoomRaw } from '@rocket.chat/models'; import { memoizeDebounce } from './debounceByParams'; import { LivechatDepartment, Users, LivechatInquiry, LivechatRooms, Messages, LivechatCustomField } from '../../../../../app/models/server'; -import { Rooms as RoomRaw } from '../../../../../app/models/server/raw'; -import { settings } from '../../../../../app/settings'; +import { settings } from '../../../../../app/settings/server'; import { RoutingManager } from '../../../../../app/livechat/server/lib/RoutingManager'; import { dispatchAgentDelegated } from '../../../../../app/livechat/server/lib/Helper'; import notifications from '../../../../../app/notifications/server/lib/Notifications'; diff --git a/apps/meteor/ee/app/livechat-enterprise/server/lib/LivechatEnterprise.js b/apps/meteor/ee/app/livechat-enterprise/server/lib/LivechatEnterprise.js index 2a723fde6531..f84bfddc8a25 100644 --- a/apps/meteor/ee/app/livechat-enterprise/server/lib/LivechatEnterprise.js +++ b/apps/meteor/ee/app/livechat-enterprise/server/lib/LivechatEnterprise.js @@ -1,11 +1,10 @@ import { Meteor } from 'meteor/meteor'; import { Match, check } from 'meteor/check'; +import { LivechatInquiry, OmnichannelQueue } from '@rocket.chat/models'; -import { Users } from '../../../../../app/models'; -import { LivechatInquiry, OmnichannelQueue } from '../../../../../app/models/server/raw'; import LivechatUnit from '../../../models/server/models/LivechatUnit'; import LivechatTag from '../../../models/server/models/LivechatTag'; -import { LivechatRooms, Subscriptions, Messages } from '../../../../../app/models/server'; +import { Users, LivechatRooms, Subscriptions, Messages } from '../../../../../app/models/server'; import LivechatPriority from '../../../models/server/models/LivechatPriority'; import { addUserRoles } from '../../../../../server/lib/roles/addUserRoles'; import { removeUserFromRoles } from '../../../../../server/lib/roles/removeUserFromRoles'; diff --git a/apps/meteor/ee/app/livechat-enterprise/server/lib/VisitorInactivityMonitor.js b/apps/meteor/ee/app/livechat-enterprise/server/lib/VisitorInactivityMonitor.js index c272c0f516eb..e4b229803133 100644 --- a/apps/meteor/ee/app/livechat-enterprise/server/lib/VisitorInactivityMonitor.js +++ b/apps/meteor/ee/app/livechat-enterprise/server/lib/VisitorInactivityMonitor.js @@ -1,9 +1,10 @@ import { SyncedCron } from 'meteor/littledata:synced-cron'; import { TAPi18n } from 'meteor/rocketchat:tap-i18n'; import { Meteor } from 'meteor/meteor'; +import { LivechatVisitors } from '@rocket.chat/models'; import { settings } from '../../../../../app/settings/server'; -import { LivechatRooms, LivechatDepartment, Users, LivechatVisitors } from '../../../../../app/models/server'; +import { LivechatRooms, LivechatDepartment, Users } from '../../../../../app/models/server'; import { Livechat } from '../../../../../app/livechat/server/lib/Livechat'; import { LivechatEnterprise } from './LivechatEnterprise'; @@ -78,11 +79,11 @@ export class VisitorInactivityMonitor { }); } - placeRoomOnHold(room) { + async placeRoomOnHold(room) { const timeout = settings.get('Livechat_visitor_inactivity_timeout'); const { v: { _id: visitorId } = {} } = room; - const visitor = LivechatVisitors.findOneById(visitorId); + const visitor = await LivechatVisitors.findOneById(visitorId); if (!visitor) { throw new Meteor.Error('error-invalid_visitor', 'Visitor Not found'); } @@ -105,7 +106,7 @@ export class VisitorInactivityMonitor { break; } case 'on-hold': { - this.placeRoomOnHold(room); + Promise.await(this.placeRoomOnHold(room)); break; } } diff --git a/apps/meteor/ee/app/livechat-enterprise/server/lib/routing/LoadBalancing.js b/apps/meteor/ee/app/livechat-enterprise/server/lib/routing/LoadBalancing.js index 27b87c81e93d..6d21d9d593b2 100644 --- a/apps/meteor/ee/app/livechat-enterprise/server/lib/routing/LoadBalancing.js +++ b/apps/meteor/ee/app/livechat-enterprise/server/lib/routing/LoadBalancing.js @@ -1,5 +1,6 @@ +import { Users } from '@rocket.chat/models'; + import { RoutingManager } from '../../../../../../app/livechat/server/lib/RoutingManager'; -import { Users } from '../../../../../../app/models/server/raw'; /* Load Balancing Queuing method: * diff --git a/apps/meteor/ee/app/livechat-enterprise/server/lib/routing/LoadRotation.ts b/apps/meteor/ee/app/livechat-enterprise/server/lib/routing/LoadRotation.ts index 74ba27c5492f..6fb107631737 100644 --- a/apps/meteor/ee/app/livechat-enterprise/server/lib/routing/LoadRotation.ts +++ b/apps/meteor/ee/app/livechat-enterprise/server/lib/routing/LoadRotation.ts @@ -1,7 +1,7 @@ import type { IOmnichannelCustomAgent } from '@rocket.chat/core-typings'; +import { Users } from '@rocket.chat/models'; import { RoutingManager } from '../../../../../../app/livechat/server/lib/RoutingManager'; -import { Users } from '../../../../../../app/models/server/raw'; import { IRoutingManagerConfig } from '../../../../../../definition/IRoutingManagerConfig'; /* Load Rotation Queuing method: diff --git a/apps/meteor/ee/app/livechat-enterprise/server/methods/resumeOnHold.ts b/apps/meteor/ee/app/livechat-enterprise/server/methods/resumeOnHold.ts index caa2c1ea0d70..716a4babaf68 100644 --- a/apps/meteor/ee/app/livechat-enterprise/server/methods/resumeOnHold.ts +++ b/apps/meteor/ee/app/livechat-enterprise/server/methods/resumeOnHold.ts @@ -1,30 +1,32 @@ import { Meteor } from 'meteor/meteor'; import { TAPi18n } from 'meteor/rocketchat:tap-i18n'; +import { ILivechatVisitor } from '@rocket.chat/core-typings'; +import { LivechatVisitors } from '@rocket.chat/models'; -import { LivechatRooms, LivechatInquiry, Messages, Users, LivechatVisitors } from '../../../../../app/models/server'; +import { LivechatRooms, LivechatInquiry, Messages, Users } from '../../../../../app/models/server'; import { RoutingManager } from '../../../../../app/livechat/server/lib/RoutingManager'; import { callbacks } from '../../../../../lib/callbacks'; -const resolveOnHoldCommentInfo = (options: { clientAction: boolean }, room: any, onHoldChatResumedBy: any): string => { - let comment = ''; +async function resolveOnHoldCommentInfo(options: { clientAction: boolean }, room: any, onHoldChatResumedBy: any): Promise { if (options.clientAction) { - comment = TAPi18n.__('Omnichannel_on_hold_chat_manually', { + return TAPi18n.__('Omnichannel_on_hold_chat_manually', { user: onHoldChatResumedBy.name || onHoldChatResumedBy.username, }); - } else { - const { - v: { _id: visitorId }, - } = room; - const visitor = LivechatVisitors.findOneById(visitorId, { name: 1, username: 1 }); - if (!visitor) { - throw new Meteor.Error('error-invalid_visitor', 'Visitor Not found'); - } - const guest = visitor.name || visitor.username; - comment = TAPi18n.__('Omnichannel_on_hold_chat_automatically', { guest }); } + const { + v: { _id: visitorId }, + } = room; + const visitor = await LivechatVisitors.findOneById>(visitorId, { + projection: { name: 1, username: 1 }, + }); + if (!visitor) { + throw new Meteor.Error('error-invalid_visitor', 'Visitor Not found'); + } + + const guest = visitor.name || visitor.username; - return comment; -}; + return TAPi18n.__('Omnichannel_on_hold_chat_automatically', { guest }); +} Meteor.methods({ async 'livechat:resumeOnHold'(roomId, options = { clientAction: false }) { @@ -55,7 +57,7 @@ Meteor.methods({ const onHoldChatResumedBy = options.clientAction ? Meteor.user() : Users.findOneById('rocket.cat'); - const comment = resolveOnHoldCommentInfo(options, room, onHoldChatResumedBy); + const comment = await resolveOnHoldCommentInfo(options, room, onHoldChatResumedBy); (Messages as any).createOnHoldResumedHistoryWithRoomIdMessageAndUser(roomId, comment, onHoldChatResumedBy); const updatedRoom = LivechatRooms.findOneById(roomId); diff --git a/apps/meteor/ee/app/livechat-enterprise/server/permissions.ts b/apps/meteor/ee/app/livechat-enterprise/server/permissions.ts index da28b3c77b96..0ccf0c141fbc 100644 --- a/apps/meteor/ee/app/livechat-enterprise/server/permissions.ts +++ b/apps/meteor/ee/app/livechat-enterprise/server/permissions.ts @@ -1,4 +1,5 @@ -import { Permissions, Roles } from '../../../../app/models/server/raw'; +import { Permissions, Roles } from '@rocket.chat/models'; + import { createOrUpdateProtectedRoleAsync } from '../../../../server/lib/roles/createOrUpdateProtectedRole'; export const createPermissions = async (): Promise => { diff --git a/apps/meteor/ee/app/models/server/index.js b/apps/meteor/ee/app/models/server/index.js index 99437d0e6adb..c8424f0163a9 100644 --- a/apps/meteor/ee/app/models/server/index.js +++ b/apps/meteor/ee/app/models/server/index.js @@ -3,11 +3,6 @@ import LivechatPriority from './models/LivechatPriority'; import LivechatTag from './models/LivechatTag'; import LivechatUnit from './models/LivechatUnit'; import LivechatUnitMonitors from './models/LivechatUnitMonitors'; -import CannedResponseRaw from './raw/CannedResponse'; -import LivechatPriorityRaw from './raw/LivechatPriority'; -import LivechatTagRaw from './raw/LivechatTag'; -import LivechatUnitRaw from './raw/LivechatUnit'; -import LivechatUnitMonitorsRaw from './raw/LivechatUnitMonitors'; import './models/LivechatDepartment'; import './models/LivechatRooms'; import './models/LivechatInquiry'; @@ -16,15 +11,4 @@ import './models/Users'; import './raw/LivechatRooms'; import './raw/LivechatDepartmentAgents'; -export { - CannedResponse, - LivechatTag, - LivechatUnit, - LivechatUnitMonitors, - CannedResponseRaw, - LivechatTagRaw, - LivechatUnitRaw, - LivechatUnitMonitorsRaw, - LivechatPriority, - LivechatPriorityRaw, -}; +export { CannedResponse, LivechatTag, LivechatUnit, LivechatUnitMonitors, LivechatPriority }; diff --git a/apps/meteor/ee/app/models/server/models/CannedResponse.js b/apps/meteor/ee/app/models/server/models/CannedResponse.js index 6a8f68908c0f..cb00fa10495b 100644 --- a/apps/meteor/ee/app/models/server/models/CannedResponse.js +++ b/apps/meteor/ee/app/models/server/models/CannedResponse.js @@ -1,6 +1,6 @@ import _ from 'underscore'; -import { Base } from '../../../../../app/models'; +import { Base } from '../../../../../app/models/server'; /** * Livechat Department model */ diff --git a/apps/meteor/ee/app/models/server/models/LivechatPriority.js b/apps/meteor/ee/app/models/server/models/LivechatPriority.js index 037eea945d60..88e7a12c658a 100644 --- a/apps/meteor/ee/app/models/server/models/LivechatPriority.js +++ b/apps/meteor/ee/app/models/server/models/LivechatPriority.js @@ -1,4 +1,4 @@ -import { Base } from '../../../../../app/models'; +import { Base } from '../../../../../app/models/server'; /** * Livechat Priority model diff --git a/apps/meteor/ee/app/models/server/models/LivechatTag.js b/apps/meteor/ee/app/models/server/models/LivechatTag.js index f5d73bb487b3..db5e9df4aea7 100644 --- a/apps/meteor/ee/app/models/server/models/LivechatTag.js +++ b/apps/meteor/ee/app/models/server/models/LivechatTag.js @@ -1,6 +1,6 @@ import _ from 'underscore'; -import { Base } from '../../../../../app/models'; +import { Base } from '../../../../../app/models/server'; /** * Livechat Tag model */ diff --git a/apps/meteor/ee/app/models/server/models/LivechatUnitMonitors.js b/apps/meteor/ee/app/models/server/models/LivechatUnitMonitors.js index 41ae22ad7906..dbda31edf509 100644 --- a/apps/meteor/ee/app/models/server/models/LivechatUnitMonitors.js +++ b/apps/meteor/ee/app/models/server/models/LivechatUnitMonitors.js @@ -1,4 +1,4 @@ -import { Base } from '../../../../../app/models'; +import { Base } from '../../../../../app/models/server'; /** * Livechat Unit Monitors model */ diff --git a/apps/meteor/ee/app/models/server/raw/CannedResponse.js b/apps/meteor/ee/app/models/server/raw/CannedResponse.js deleted file mode 100644 index c53067ffa3a1..000000000000 --- a/apps/meteor/ee/app/models/server/raw/CannedResponse.js +++ /dev/null @@ -1,6 +0,0 @@ -import { BaseRaw } from '../../../../../app/models/server/raw/BaseRaw'; -import CannedResponse from '../models/CannedResponse'; - -export class CannedResponseRaw extends BaseRaw {} - -export default new CannedResponseRaw(CannedResponse.model.rawCollection()); diff --git a/apps/meteor/ee/app/models/server/raw/LivechatDepartmentAgents.ts b/apps/meteor/ee/app/models/server/raw/LivechatDepartmentAgents.ts index 8c8c4422eb0c..11bf2a07fbbb 100644 --- a/apps/meteor/ee/app/models/server/raw/LivechatDepartmentAgents.ts +++ b/apps/meteor/ee/app/models/server/raw/LivechatDepartmentAgents.ts @@ -1,4 +1,4 @@ -import { LivechatDepartmentAgentsRaw } from '../../../../../app/models/server/raw/LivechatDepartmentAgents'; +import { LivechatDepartmentAgentsRaw } from '../../../../../server/models/raw/LivechatDepartmentAgents'; import { overwriteClassOnLicense } from '../../../license/server'; overwriteClassOnLicense('livechat-enterprise', LivechatDepartmentAgentsRaw, { diff --git a/apps/meteor/ee/app/models/server/raw/LivechatPriority.js b/apps/meteor/ee/app/models/server/raw/LivechatPriority.js deleted file mode 100644 index ceec70207068..000000000000 --- a/apps/meteor/ee/app/models/server/raw/LivechatPriority.js +++ /dev/null @@ -1,21 +0,0 @@ -import { BaseRaw } from '../../../../../app/models/server/raw/BaseRaw'; -import LivechatPriority from '../models/LivechatPriority'; - -export class LivechatPriorityRaw extends BaseRaw { - findOneByIdOrName(_idOrName, options) { - const query = { - $or: [ - { - _id: _idOrName, - }, - { - name: _idOrName, - }, - ], - }; - - return this.findOne(query, options); - } -} - -export default new LivechatPriorityRaw(LivechatPriority.model.rawCollection()); diff --git a/apps/meteor/ee/app/models/server/raw/LivechatRooms.js b/apps/meteor/ee/app/models/server/raw/LivechatRooms.js index 294d55676045..6f72f076e38f 100644 --- a/apps/meteor/ee/app/models/server/raw/LivechatRooms.js +++ b/apps/meteor/ee/app/models/server/raw/LivechatRooms.js @@ -1,4 +1,4 @@ -import { LivechatRoomsRaw } from '../../../../../app/models/server/raw/LivechatRooms'; +import { LivechatRoomsRaw } from '../../../../../server/models/raw/LivechatRooms'; import { queriesLogger } from '../../../livechat-enterprise/server/lib/logger'; import { addQueryRestrictionsToRoomsModel } from '../../../livechat-enterprise/server/lib/query.helper'; import { overwriteClassOnLicense } from '../../../license/server'; diff --git a/apps/meteor/ee/app/models/server/raw/LivechatTag.js b/apps/meteor/ee/app/models/server/raw/LivechatTag.js deleted file mode 100644 index 9993554d704f..000000000000 --- a/apps/meteor/ee/app/models/server/raw/LivechatTag.js +++ /dev/null @@ -1,6 +0,0 @@ -import { BaseRaw } from '../../../../../app/models/server/raw/BaseRaw'; -import LivechatTag from '../models/LivechatTag'; - -export class LivechatTagRaw extends BaseRaw {} - -export default new LivechatTagRaw(LivechatTag.model.rawCollection()); diff --git a/apps/meteor/ee/app/models/server/raw/LivechatUnit.ts b/apps/meteor/ee/app/models/server/raw/LivechatUnit.ts deleted file mode 100644 index a2464d620c3c..000000000000 --- a/apps/meteor/ee/app/models/server/raw/LivechatUnit.ts +++ /dev/null @@ -1,6 +0,0 @@ -import { BaseRaw } from '../../../../../app/models/server/raw/BaseRaw'; -import LivechatUnit from '../models/LivechatUnit'; - -export class LivechatUnitRaw extends BaseRaw {} - -export default new LivechatUnitRaw(LivechatUnit.model.rawCollection()); diff --git a/apps/meteor/ee/app/models/server/raw/LivechatUnitMonitors.js b/apps/meteor/ee/app/models/server/raw/LivechatUnitMonitors.js deleted file mode 100644 index 664dcb817b22..000000000000 --- a/apps/meteor/ee/app/models/server/raw/LivechatUnitMonitors.js +++ /dev/null @@ -1,6 +0,0 @@ -import { BaseRaw } from '../../../../../app/models/server/raw/BaseRaw'; -import LivechatUnitMonitors from '../models/LivechatUnitMonitors'; - -export class LivechatUnitMonitorsRaw extends BaseRaw {} - -export default new LivechatUnitMonitorsRaw(LivechatUnitMonitors.model.rawCollection()); diff --git a/apps/meteor/ee/app/voip-enterprise/server/lib/calculateOnHoldTimeForRoom.ts b/apps/meteor/ee/app/voip-enterprise/server/lib/calculateOnHoldTimeForRoom.ts index 3a0b20328a3f..13acce606de2 100644 --- a/apps/meteor/ee/app/voip-enterprise/server/lib/calculateOnHoldTimeForRoom.ts +++ b/apps/meteor/ee/app/voip-enterprise/server/lib/calculateOnHoldTimeForRoom.ts @@ -1,13 +1,12 @@ import { IVoipRoom } from '@rocket.chat/core-typings'; - -import { PbxEvent } from '../../../../../app/models/server/raw'; +import { PbxEvents } from '@rocket.chat/models'; export const calculateOnHoldTimeForRoom = async (room: IVoipRoom, closedAt: Date): Promise => { if (!room.callUniqueId) { return 0; } - const events = await PbxEvent.findByEvents(room.callUniqueId, ['Hold', 'Unhold']).toArray(); + const events = await PbxEvents.findByEvents(room.callUniqueId, ['Hold', 'Unhold']).toArray(); if (!events.length) { // if there's no events, that means no hold time return 0; diff --git a/apps/meteor/ee/client/omnichannel/cannedResponses/CannedResponsesRoute.tsx b/apps/meteor/ee/client/omnichannel/cannedResponses/CannedResponsesRoute.tsx index b0176783716f..e029c5367795 100644 --- a/apps/meteor/ee/client/omnichannel/cannedResponses/CannedResponsesRoute.tsx +++ b/apps/meteor/ee/client/omnichannel/cannedResponses/CannedResponsesRoute.tsx @@ -120,7 +120,7 @@ const CannedResponsesRoute: FC = () => { > {t('Shortcut')} , - + {t('Sharing')} , { {t('Created_at')} , diff --git a/apps/meteor/ee/server/index.ts b/apps/meteor/ee/server/index.ts index 01c0c7c06bfa..b99e032b9c4b 100644 --- a/apps/meteor/ee/server/index.ts +++ b/apps/meteor/ee/server/index.ts @@ -1,6 +1,6 @@ import './startup'; -import '../app/models'; +import '../app/models/server'; import '../app/license/server/index'; import '../app/api-enterprise/server/index'; import '../app/auditing/server/index'; diff --git a/apps/meteor/ee/server/lib/engagementDashboard/channels.ts b/apps/meteor/ee/server/lib/engagementDashboard/channels.ts index a244ba54186f..cb19ff1ea0bb 100644 --- a/apps/meteor/ee/server/lib/engagementDashboard/channels.ts +++ b/apps/meteor/ee/server/lib/engagementDashboard/channels.ts @@ -1,7 +1,7 @@ import moment from 'moment'; import type { IDirectMessageRoom, IRoom } from '@rocket.chat/core-typings'; +import { Rooms } from '@rocket.chat/models'; -import { Rooms } from '../../../../app/models/server/raw'; import { convertDateToInt, diffBetweenDaysInclusive } from './date'; export const findAllChannelsWithNumberOfMessages = async ({ diff --git a/apps/meteor/ee/server/lib/engagementDashboard/messages.ts b/apps/meteor/ee/server/lib/engagementDashboard/messages.ts index 48827e510c58..85588965f4dd 100644 --- a/apps/meteor/ee/server/lib/engagementDashboard/messages.ts +++ b/apps/meteor/ee/server/lib/engagementDashboard/messages.ts @@ -1,7 +1,7 @@ import moment from 'moment'; import type { IDirectMessageRoom, IRoom, IMessage } from '@rocket.chat/core-typings'; +import { Messages, Analytics } from '@rocket.chat/models'; -import { Messages, Analytics } from '../../../../app/models/server/raw'; import { convertDateToInt, diffBetweenDaysInclusive, convertIntToDate, getTotalOfWeekItems } from './date'; import { roomCoordinator } from '../../../../server/lib/rooms/roomCoordinator'; diff --git a/apps/meteor/ee/server/lib/engagementDashboard/startup.ts b/apps/meteor/ee/server/lib/engagementDashboard/startup.ts index 93860aec836f..d65f7e09a2f6 100644 --- a/apps/meteor/ee/server/lib/engagementDashboard/startup.ts +++ b/apps/meteor/ee/server/lib/engagementDashboard/startup.ts @@ -1,7 +1,8 @@ +import { Permissions } from '@rocket.chat/models'; + import { fillFirstDaysOfMessagesIfNeeded, handleMessagesDeleted, handleMessagesSent } from './messages'; import { fillFirstDaysOfUsersIfNeeded, handleUserCreated } from './users'; import { callbacks } from '../../../../lib/callbacks'; -import { Permissions } from '../../../../app/models/server/raw'; export const attachCallbacks = (): void => { callbacks.add('afterSaveMessage', handleMessagesSent, callbacks.priority.MEDIUM, 'engagementDashboard.afterSaveMessage'); diff --git a/apps/meteor/ee/server/lib/engagementDashboard/users.ts b/apps/meteor/ee/server/lib/engagementDashboard/users.ts index fffeb5285974..279d743a080b 100644 --- a/apps/meteor/ee/server/lib/engagementDashboard/users.ts +++ b/apps/meteor/ee/server/lib/engagementDashboard/users.ts @@ -1,7 +1,7 @@ import moment from 'moment'; import type { IUser } from '@rocket.chat/core-typings'; +import { Users, Analytics, Sessions } from '@rocket.chat/models'; -import { Users, Analytics, Sessions } from '../../../../app/models/server/raw'; import { convertDateToInt, diffBetweenDaysInclusive, getTotalOfWeekItems, convertIntToDate } from './date'; export const handleUserCreated = (user: IUser): IUser => { diff --git a/apps/meteor/ee/server/lib/ldap/Manager.ts b/apps/meteor/ee/server/lib/ldap/Manager.ts index 7edfcb9c199b..e48c38c0af9f 100644 --- a/apps/meteor/ee/server/lib/ldap/Manager.ts +++ b/apps/meteor/ee/server/lib/ldap/Manager.ts @@ -2,11 +2,11 @@ import _ from 'underscore'; import type ldapjs from 'ldapjs'; import { ILDAPEntry } from '@rocket.chat/core-typings'; import type { IUser, IRoom, ICreatedRoom, IRole, IImportUser } from '@rocket.chat/core-typings'; +import { Users as UsersRaw, Roles, Subscriptions as SubscriptionsRaw } from '@rocket.chat/models'; import { ImporterAfterImportCallback } from '../../../../app/importer/server/definitions/IConversionCallbacks'; import { settings } from '../../../../app/settings/server'; import { Rooms } from '../../../../app/models/server'; -import { Users as UsersRaw, Roles, Subscriptions as SubscriptionsRaw } from '../../../../app/models/server/raw'; import { LDAPDataConverter } from '../../../../server/lib/ldap/DataConverter'; import { LDAPConnection } from '../../../../server/lib/ldap/Connection'; import { LDAPManager } from '../../../../server/lib/ldap/Manager'; diff --git a/apps/meteor/ee/server/lib/oauth/Manager.ts b/apps/meteor/ee/server/lib/oauth/Manager.ts index 946668ef2808..5382d585f020 100644 --- a/apps/meteor/ee/server/lib/oauth/Manager.ts +++ b/apps/meteor/ee/server/lib/oauth/Manager.ts @@ -1,7 +1,8 @@ +import { Roles } from '@rocket.chat/models'; + import { Rooms } from '../../../../app/models/server'; import { addUserToRoom, createRoom } from '../../../../app/lib/server/functions'; import { Logger } from '../../../../app/logger/server'; -import { Roles } from '../../../../app/models/server/raw'; import { syncUserRoles } from '../syncUserRoles'; export const logger = new Logger('OAuth'); diff --git a/apps/meteor/ee/server/lib/registerServiceModels.ts b/apps/meteor/ee/server/lib/registerServiceModels.ts new file mode 100644 index 000000000000..d68cf4049254 --- /dev/null +++ b/apps/meteor/ee/server/lib/registerServiceModels.ts @@ -0,0 +1,21 @@ +import type { Db } from 'mongodb'; +import { registerModel } from '@rocket.chat/models'; + +import { RolesRaw } from '../../../server/models/raw/Roles'; +import { RoomsRaw } from '../../../server/models/raw/Rooms'; +import { SettingsRaw } from '../../../server/models/raw/Settings'; +import { TeamRaw } from '../../../server/models/raw/Team'; +import { TeamMemberRaw } from '../../../server/models/raw/TeamMember'; +import { SubscriptionsRaw } from '../../../server/models/raw/Subscriptions'; +import { UsersRaw } from '../../../server/models/raw/Users'; + +// TODO add trash param to model instances +export const registerServiceModels = (db: Db): void => { + registerModel('IRolesModel', () => new RolesRaw(db)); + registerModel('IRoomsModel', () => new RoomsRaw(db)); + registerModel('ISettingsModel', () => new SettingsRaw(db)); + registerModel('ISubscriptionsModel', () => new SubscriptionsRaw(db)); + registerModel('ITeamModel', () => new TeamRaw(db)); + registerModel('ITeamMemberModel', () => new TeamMemberRaw(db)); + registerModel('IUsersModel', () => new UsersRaw(db)); +}; diff --git a/apps/meteor/ee/server/lib/syncUserRoles.ts b/apps/meteor/ee/server/lib/syncUserRoles.ts index bdd66eba669a..9d637a7848e1 100644 --- a/apps/meteor/ee/server/lib/syncUserRoles.ts +++ b/apps/meteor/ee/server/lib/syncUserRoles.ts @@ -1,10 +1,10 @@ import type { IUser, IRole, AtLeast } from '@rocket.chat/core-typings'; +import { Users } from '@rocket.chat/models'; import { settings } from '../../../app/settings/server'; import { api } from '../../../server/sdk/api'; import { addUserRolesAsync } from '../../../server/lib/roles/addUserRoles'; import { removeUserFromRolesAsync } from '../../../server/lib/roles/removeUserFromRoles'; -import { Users } from '../../../app/models/server/raw'; import { canAddNewUser } from '../../app/license/server/license'; type setUserRolesOptions = { diff --git a/apps/meteor/ee/server/models/CannedResponse.ts b/apps/meteor/ee/server/models/CannedResponse.ts new file mode 100644 index 000000000000..7d4fa2052d30 --- /dev/null +++ b/apps/meteor/ee/server/models/CannedResponse.ts @@ -0,0 +1,6 @@ +import { registerModel } from '@rocket.chat/models'; + +import { db } from '../../../server/database/utils'; +import { CannedResponseRaw } from './raw/CannedResponse'; + +registerModel('ICannedResponseModel', new CannedResponseRaw(db)); diff --git a/apps/meteor/ee/server/models/LivechatPriority.ts b/apps/meteor/ee/server/models/LivechatPriority.ts new file mode 100644 index 000000000000..54ccce4886ce --- /dev/null +++ b/apps/meteor/ee/server/models/LivechatPriority.ts @@ -0,0 +1,6 @@ +import { registerModel } from '@rocket.chat/models'; + +import { db } from '../../../server/database/utils'; +import { LivechatPriorityRaw } from './raw/LivechatPriority'; + +registerModel('ILivechatPriorityModel', new LivechatPriorityRaw(db)); diff --git a/apps/meteor/ee/server/models/LivechatTag.ts b/apps/meteor/ee/server/models/LivechatTag.ts new file mode 100644 index 000000000000..28203b151a6b --- /dev/null +++ b/apps/meteor/ee/server/models/LivechatTag.ts @@ -0,0 +1,6 @@ +import { registerModel } from '@rocket.chat/models'; + +import { db } from '../../../server/database/utils'; +import { LivechatTagRaw } from './raw/LivechatTag'; + +registerModel('ILivechatTagModel', new LivechatTagRaw(db)); diff --git a/apps/meteor/ee/server/models/LivechatUnit.ts b/apps/meteor/ee/server/models/LivechatUnit.ts new file mode 100644 index 000000000000..ce33f8fccb04 --- /dev/null +++ b/apps/meteor/ee/server/models/LivechatUnit.ts @@ -0,0 +1,6 @@ +import { registerModel } from '@rocket.chat/models'; + +import { db } from '../../../server/database/utils'; +import { LivechatUnitRaw } from './raw/LivechatUnit'; + +registerModel('ILivechatUnitModel', new LivechatUnitRaw(db)); diff --git a/apps/meteor/ee/server/models/LivechatUnitMonitors.ts b/apps/meteor/ee/server/models/LivechatUnitMonitors.ts new file mode 100644 index 000000000000..2c241048da79 --- /dev/null +++ b/apps/meteor/ee/server/models/LivechatUnitMonitors.ts @@ -0,0 +1,6 @@ +import { registerModel } from '@rocket.chat/models'; + +import { db } from '../../../server/database/utils'; +import { LivechatUnitMonitorsRaw } from './raw/LivechatUnitMonitors'; + +registerModel('ILivechatUnitMonitorsModel', new LivechatUnitMonitorsRaw(db)); diff --git a/apps/meteor/ee/server/models/raw/CannedResponse.ts b/apps/meteor/ee/server/models/raw/CannedResponse.ts new file mode 100644 index 000000000000..055c4c13d435 --- /dev/null +++ b/apps/meteor/ee/server/models/raw/CannedResponse.ts @@ -0,0 +1,13 @@ +import type { IRocketChatRecord } from '@rocket.chat/core-typings'; +import type { ICannedResponseModel } from '@rocket.chat/model-typings'; +import type { Db } from 'mongodb'; +import { getCollectionName } from '@rocket.chat/models'; + +import { BaseRaw } from '../../../../server/models/raw/BaseRaw'; + +// TODO need to define type for CannedResponse object +export class CannedResponseRaw extends BaseRaw implements ICannedResponseModel { + constructor(db: Db) { + super(db, getCollectionName('canned_response')); + } +} diff --git a/apps/meteor/ee/server/models/raw/LivechatPriority.ts b/apps/meteor/ee/server/models/raw/LivechatPriority.ts new file mode 100644 index 000000000000..2a85d7fa3873 --- /dev/null +++ b/apps/meteor/ee/server/models/raw/LivechatPriority.ts @@ -0,0 +1,28 @@ +import type { IRocketChatRecord } from '@rocket.chat/core-typings'; +import type { ILivechatPriorityModel } from '@rocket.chat/model-typings'; +import type { Db } from 'mongodb'; +import { getCollectionName } from '@rocket.chat/models'; + +import { BaseRaw } from '../../../../server/models/raw/BaseRaw'; + +// TODO need to define type for LivechatPriority object +export class LivechatPriorityRaw extends BaseRaw implements ILivechatPriorityModel { + constructor(db: Db) { + super(db, getCollectionName('livechat_priority')); + } + + findOneByIdOrName(_idOrName: string, options = {}): any { + const query = { + $or: [ + { + _id: _idOrName, + }, + { + name: _idOrName, + }, + ], + }; + + return this.findOne(query, options); + } +} diff --git a/apps/meteor/ee/server/models/raw/LivechatTag.ts b/apps/meteor/ee/server/models/raw/LivechatTag.ts new file mode 100644 index 000000000000..ad8be912a42a --- /dev/null +++ b/apps/meteor/ee/server/models/raw/LivechatTag.ts @@ -0,0 +1,12 @@ +import type { IRocketChatRecord } from '@rocket.chat/core-typings'; +import type { ILivechatTagModel } from '@rocket.chat/model-typings'; +import { getCollectionName } from '@rocket.chat/models'; +import { Db } from 'mongodb'; + +import { BaseRaw } from '../../../../server/models/raw/BaseRaw'; + +export class LivechatTagRaw extends BaseRaw implements ILivechatTagModel { + constructor(db: Db) { + super(db, getCollectionName('livechat_tag')); + } +} diff --git a/apps/meteor/ee/server/models/raw/LivechatUnit.ts b/apps/meteor/ee/server/models/raw/LivechatUnit.ts new file mode 100644 index 000000000000..7429f83d4858 --- /dev/null +++ b/apps/meteor/ee/server/models/raw/LivechatUnit.ts @@ -0,0 +1,5 @@ +import type { ILivechatUnitModel } from '@rocket.chat/model-typings'; + +import { LivechatDepartmentRaw } from '../../../../server/models/raw/LivechatDepartment'; + +export class LivechatUnitRaw extends LivechatDepartmentRaw implements ILivechatUnitModel {} diff --git a/apps/meteor/ee/server/models/raw/LivechatUnitMonitors.ts b/apps/meteor/ee/server/models/raw/LivechatUnitMonitors.ts new file mode 100644 index 000000000000..dfcf9c85ad93 --- /dev/null +++ b/apps/meteor/ee/server/models/raw/LivechatUnitMonitors.ts @@ -0,0 +1,12 @@ +import type { ILivechatMonitor } from '@rocket.chat/core-typings'; +import type { ILivechatUnitMonitorsModel } from '@rocket.chat/model-typings'; +import type { Db } from 'mongodb'; +import { getCollectionName } from '@rocket.chat/models'; + +import { BaseRaw } from '../../../../server/models/raw/BaseRaw'; + +export class LivechatUnitMonitorsRaw extends BaseRaw implements ILivechatUnitMonitorsModel { + constructor(db: Db) { + super(db, getCollectionName('livechat_unit_monitors')); + } +} diff --git a/apps/meteor/ee/server/models/startup.ts b/apps/meteor/ee/server/models/startup.ts new file mode 100644 index 000000000000..59a80fb11808 --- /dev/null +++ b/apps/meteor/ee/server/models/startup.ts @@ -0,0 +1,5 @@ +import './CannedResponse'; +import './LivechatPriority'; +import './LivechatTag'; +import './LivechatUnit'; +import './LivechatUnitMonitors'; diff --git a/apps/meteor/ee/server/services/Dockerfile b/apps/meteor/ee/server/services/Dockerfile index 6e487eefcab5..8e58fc0a498f 100644 --- a/apps/meteor/ee/server/services/Dockerfile +++ b/apps/meteor/ee/server/services/Dockerfile @@ -14,6 +14,8 @@ COPY ./.yarn/releases .yarn/releases COPY ./packages/core-typings packages/core-typings COPY ./packages/eslint-config packages/eslint-config COPY ./packages/rest-typings packages/rest-typings +COPY ./packages/model-typings packages/model-typings +COPY ./packages/models packages/models COPY ./apps/meteor/ee/server/services apps/meteor/ee/server/services @@ -36,6 +38,12 @@ COPY --from=build /app/packages/core-typings/dist /app/packages/core-typings/dis COPY --from=build /app/packages/rest-typings/package.json /app/packages/rest-typings/package.json COPY --from=build /app/packages/rest-typings/dist /app/packages/rest-typings/dist +COPY --from=build /app/packages/model-typings/package.json /app/packages/model-typings/package.json +COPY --from=build /app/packages/model-typings/dist /app/packages/model-typings/dist + +COPY --from=build /app/packages/models/package.json /app/packages/models/package.json +COPY --from=build /app/packages/models/dist /app/packages/models/dist + # add dist/ folder from tsc so we don't need to add all rocket.chat repo COPY ./apps/meteor/ee/server/services/dist ./apps/meteor/ diff --git a/apps/meteor/ee/server/services/authorization/service.ts b/apps/meteor/ee/server/services/authorization/service.ts index 3cad2245f557..08cc60d61a81 100644 --- a/apps/meteor/ee/server/services/authorization/service.ts +++ b/apps/meteor/ee/server/services/authorization/service.ts @@ -3,7 +3,10 @@ import '../../startup/broker'; import { api } from '../../../../server/sdk/api'; import { Authorization } from '../../../../server/services/authorization/service'; import { getConnection } from '../mongo'; +import { registerServiceModels } from '../../lib/registerServiceModels'; getConnection().then((db) => { + registerServiceModels(db); + api.registerService(new Authorization(db)); }); diff --git a/apps/meteor/ee/server/services/package.json b/apps/meteor/ee/server/services/package.json index f04e17ba5f6a..2189172f63b9 100644 --- a/apps/meteor/ee/server/services/package.json +++ b/apps/meteor/ee/server/services/package.json @@ -27,6 +27,8 @@ "@rocket.chat/core-typings": "workspace:^", "@rocket.chat/emitter": "~0.31.9", "@rocket.chat/message-parser": "next", + "@rocket.chat/model-typings": "workspace:^", + "@rocket.chat/models": "workspace:^", "@rocket.chat/rest-typings": "workspace:^", "@rocket.chat/string-helpers": "~0.31.9", "@rocket.chat/ui-kit": "~0.31.9", diff --git a/apps/meteor/ee/server/services/stream-hub/StreamHub.ts b/apps/meteor/ee/server/services/stream-hub/StreamHub.ts index 63744abc04f3..70d55e1d1c3b 100755 --- a/apps/meteor/ee/server/services/stream-hub/StreamHub.ts +++ b/apps/meteor/ee/server/services/stream-hub/StreamHub.ts @@ -1,22 +1,22 @@ import { getConnection } from '../mongo'; import { ServiceClass, IServiceClass } from '../../../../server/sdk/types/ServiceClass'; import { initWatchers } from '../../../../server/modules/watchers/watchers.module'; -import { MessagesRaw } from '../../../../app/models/server/raw/Messages'; -import { UsersRaw } from '../../../../app/models/server/raw/Users'; -import { SubscriptionsRaw } from '../../../../app/models/server/raw/Subscriptions'; -import { SettingsRaw } from '../../../../app/models/server/raw/Settings'; -import { RolesRaw } from '../../../../app/models/server/raw/Roles'; -import { LivechatInquiryRaw } from '../../../../app/models/server/raw/LivechatInquiry'; -import { UsersSessionsRaw } from '../../../../app/models/server/raw/UsersSessions'; -import { RoomsRaw } from '../../../../app/models/server/raw/Rooms'; -import { LoginServiceConfigurationRaw } from '../../../../app/models/server/raw/LoginServiceConfiguration'; -import { InstanceStatusRaw } from '../../../../app/models/server/raw/InstanceStatus'; -import { IntegrationHistoryRaw } from '../../../../app/models/server/raw/IntegrationHistory'; -import { LivechatDepartmentAgentsRaw } from '../../../../app/models/server/raw/LivechatDepartmentAgents'; -import { IntegrationsRaw } from '../../../../app/models/server/raw/Integrations'; -import { PermissionsRaw } from '../../../../app/models/server/raw/Permissions'; -import { EmailInboxRaw } from '../../../../app/models/server/raw/EmailInbox'; -import { PbxEventsRaw } from '../../../../app/models/server/raw/PbxEvents'; +import { MessagesRaw } from '../../../../server/models/raw/Messages'; +import { UsersRaw } from '../../../../server/models/raw/Users'; +import { SubscriptionsRaw } from '../../../../server/models/raw/Subscriptions'; +import { SettingsRaw } from '../../../../server/models/raw/Settings'; +import { RolesRaw } from '../../../../server/models/raw/Roles'; +import { LivechatInquiryRaw } from '../../../../server/models/raw/LivechatInquiry'; +import { UsersSessionsRaw } from '../../../../server/models/raw/UsersSessions'; +import { RoomsRaw } from '../../../../server/models/raw/Rooms'; +import { LoginServiceConfigurationRaw } from '../../../../server/models/raw/LoginServiceConfiguration'; +import { InstanceStatusRaw } from '../../../../server/models/raw/InstanceStatus'; +import { IntegrationHistoryRaw } from '../../../../server/models/raw/IntegrationHistory'; +import { LivechatDepartmentAgentsRaw } from '../../../../server/models/raw/LivechatDepartmentAgents'; +import { IntegrationsRaw } from '../../../../server/models/raw/Integrations'; +import { PermissionsRaw } from '../../../../server/models/raw/Permissions'; +import { EmailInboxRaw } from '../../../../server/models/raw/EmailInbox'; +import { PbxEventsRaw } from '../../../../server/models/raw/PbxEvents'; import { api } from '../../../../server/sdk/api'; export class StreamHub extends ServiceClass implements IServiceClass { @@ -27,26 +27,22 @@ export class StreamHub extends ServiceClass implements IServiceClass { const Trash = db.collection('rocketchat__trash'); - const UsersCol = db.collection('users'); - - const Rooms = new RoomsRaw(db.collection('rocketchat_room'), Trash); - const Settings = new SettingsRaw(db.collection('rocketchat_settings'), Trash); - const Users = new UsersRaw(UsersCol, Trash); - const UsersSessions = new UsersSessionsRaw(db.collection('usersSessions'), Trash, { - preventSetUpdatedAt: true, - }); - const Subscriptions = new SubscriptionsRaw(db.collection('rocketchat_subscription'), { Users }, Trash); - const LivechatInquiry = new LivechatInquiryRaw(db.collection('rocketchat_livechat_inquiry'), Trash); - const LivechatDepartmentAgents = new LivechatDepartmentAgentsRaw(db.collection('rocketchat_livechat_department_agents'), Trash); - const Messages = new MessagesRaw(db.collection('rocketchat_message'), Trash); - const Permissions = new PermissionsRaw(db.collection('rocketchat_permissions'), Trash); - const Roles = new RolesRaw(db.collection('rocketchat_roles'), { Users, Subscriptions }, Trash); - const LoginServiceConfiguration = new LoginServiceConfigurationRaw(db.collection('meteor_accounts_loginServiceConfiguration'), Trash); - const InstanceStatus = new InstanceStatusRaw(db.collection('instances'), Trash); - const IntegrationHistory = new IntegrationHistoryRaw(db.collection('rocketchat_integration_history'), Trash); - const Integrations = new IntegrationsRaw(db.collection('rocketchat_integrations'), Trash); - const EmailInbox = new EmailInboxRaw(db.collection('rocketchat_email_inbox'), Trash); - const PbxEvent = new PbxEventsRaw(db.collection('pbx_events'), Trash); + const Rooms = new RoomsRaw(db, Trash); + const Settings = new SettingsRaw(db, Trash); + const Users = new UsersRaw(db, Trash); + const UsersSessions = new UsersSessionsRaw(db, Trash); + const Subscriptions = new SubscriptionsRaw(db, Trash); + const LivechatInquiry = new LivechatInquiryRaw(db, Trash); + const LivechatDepartmentAgents = new LivechatDepartmentAgentsRaw(db, Trash); + const Messages = new MessagesRaw(db, Trash); + const Permissions = new PermissionsRaw(db, Trash); + const Roles = new RolesRaw(db, Trash); + const LoginServiceConfiguration = new LoginServiceConfigurationRaw(db, Trash); + const InstanceStatus = new InstanceStatusRaw(db); + const IntegrationHistory = new IntegrationHistoryRaw(db); + const Integrations = new IntegrationsRaw(db, Trash); + const EmailInbox = new EmailInboxRaw(db, Trash); + const PbxEvents = new PbxEventsRaw(db, Trash); const models = { Messages, @@ -64,11 +60,11 @@ export class StreamHub extends ServiceClass implements IServiceClass { IntegrationHistory, Integrations, EmailInbox, - PbxEvent, + PbxEvents, }; initWatchers(models, api.broadcast.bind(api), (model, fn) => { - model.col.watch([]).on('change', (event) => { + model.watch([]).on('change', (event) => { switch (event.operationType) { case 'insert': fn({ diff --git a/apps/meteor/imports/message-read-receipt/server/hooks.js b/apps/meteor/imports/message-read-receipt/server/hooks.js index e8df9381de8b..869cc03d8be0 100644 --- a/apps/meteor/imports/message-read-receipt/server/hooks.js +++ b/apps/meteor/imports/message-read-receipt/server/hooks.js @@ -1,6 +1,6 @@ import { ReadReceipt } from './lib/ReadReceipt'; import { callbacks } from '../../../lib/callbacks'; -import { Subscriptions } from '../../../app/models'; +import { Subscriptions } from '../../../app/models/server'; callbacks.add( 'afterSaveMessage', diff --git a/apps/meteor/imports/message-read-receipt/server/lib/ReadReceipt.js b/apps/meteor/imports/message-read-receipt/server/lib/ReadReceipt.js index b27cc23dba62..158d3ddc3365 100644 --- a/apps/meteor/imports/message-read-receipt/server/lib/ReadReceipt.js +++ b/apps/meteor/imports/message-read-receipt/server/lib/ReadReceipt.js @@ -1,8 +1,8 @@ import { Meteor } from 'meteor/meteor'; import { Random } from 'meteor/random'; +import { LivechatVisitors, ReadReceipts } from '@rocket.chat/models'; -import { Subscriptions, Messages, Rooms, Users, LivechatVisitors } from '../../../../app/models/server'; -import { ReadReceipts } from '../../../../app/models/server/raw'; +import { Subscriptions, Messages, Rooms, Users } from '../../../../app/models/server'; import { settings } from '../../../../app/settings/server'; import { SystemLogger } from '../../../../server/lib/logger/system'; import { roomCoordinator } from '../../../../server/lib/rooms/roomCoordinator'; @@ -98,11 +98,13 @@ export const ReadReceipt = { async getReceipts(message) { const receipts = await ReadReceipts.findByMessageId(message._id).toArray(); - return receipts.map((receipt) => ({ - ...receipt, - user: receipt.token - ? LivechatVisitors.getVisitorByToken(receipt.token, { fields: { username: 1, name: 1 } }) - : Users.findOneById(receipt.userId, { fields: { username: 1, name: 1 } }), - })); + return Promise.all( + receipts.map(async (receipt) => ({ + ...receipt, + user: receipt.token + ? await LivechatVisitors.getVisitorByToken(receipt.token, { projection: { username: 1, name: 1 } }) + : Users.findOneById(receipt.userId, { fields: { username: 1, name: 1 } }), + })), + ); }, }; diff --git a/apps/meteor/imports/personal-access-tokens/server/api/methods/generateToken.js b/apps/meteor/imports/personal-access-tokens/server/api/methods/generateToken.js index 7ec4a9e07145..cd335330c644 100644 --- a/apps/meteor/imports/personal-access-tokens/server/api/methods/generateToken.js +++ b/apps/meteor/imports/personal-access-tokens/server/api/methods/generateToken.js @@ -3,7 +3,7 @@ import { Random } from 'meteor/random'; import { Accounts } from 'meteor/accounts-base'; import { hasPermission } from '../../../../../app/authorization'; -import { Users } from '../../../../../app/models'; +import { Users } from '../../../../../app/models/server'; import { twoFactorRequired } from '../../../../../app/2fa/server/twoFactorRequired'; Meteor.methods({ diff --git a/apps/meteor/imports/personal-access-tokens/server/api/methods/regenerateToken.js b/apps/meteor/imports/personal-access-tokens/server/api/methods/regenerateToken.js index d446e27990a5..7be5462b4d55 100644 --- a/apps/meteor/imports/personal-access-tokens/server/api/methods/regenerateToken.js +++ b/apps/meteor/imports/personal-access-tokens/server/api/methods/regenerateToken.js @@ -1,7 +1,7 @@ import { Meteor } from 'meteor/meteor'; import { hasPermission } from '../../../../../app/authorization'; -import { Users } from '../../../../../app/models'; +import { Users } from '../../../../../app/models/server'; import { twoFactorRequired } from '../../../../../app/2fa/server/twoFactorRequired'; Meteor.methods({ diff --git a/apps/meteor/imports/personal-access-tokens/server/api/methods/removeToken.js b/apps/meteor/imports/personal-access-tokens/server/api/methods/removeToken.js index 17613dfd0b34..683f647a0966 100644 --- a/apps/meteor/imports/personal-access-tokens/server/api/methods/removeToken.js +++ b/apps/meteor/imports/personal-access-tokens/server/api/methods/removeToken.js @@ -1,7 +1,7 @@ import { Meteor } from 'meteor/meteor'; import { hasPermission } from '../../../../../app/authorization'; -import { Users } from '../../../../../app/models'; +import { Users } from '../../../../../app/models/server'; import { twoFactorRequired } from '../../../../../app/2fa/server/twoFactorRequired'; Meteor.methods({ diff --git a/apps/meteor/lib/utils/parseParameters.ts b/apps/meteor/lib/utils/parseParameters.ts new file mode 100644 index 000000000000..934e3724c5c1 --- /dev/null +++ b/apps/meteor/lib/utils/parseParameters.ts @@ -0,0 +1,64 @@ +function split(parameters: string, ignoreExtraUnquotedSpaces = true): string[] { + // Replace \n\r with a single \n + const line = parameters.replace(/\n\r/gm, '\n'); + + const items = line.split(/[ \n\r\t]/); + + if (ignoreExtraUnquotedSpaces) { + return items.filter(Boolean); + } + + return items; +} + +export function parseParameters(parameters: string, ignoreExtraUnquotedSpaces = true): string[] { + if (!parameters.trim()) { + return []; + } + + const match = parameters.match(/((["'])(?:(?=(\\?))\3.)*?\2)/gs); + let line = parameters; + + if (!match) { + return split(line, ignoreExtraUnquotedSpaces); + } + + match.forEach((item) => { + const newItem = item + // Replace start quote with SSA character + .replace(/(^['"])/g, '\u0086') + // Replace end quote with ESA character + .replace(/['"]$/g, '\u0087') + // Replace spaces inside the quotes with a Punctuation Space character + .replace(/ /g, '\u2008') + // Replace new lines inside the quotes with a PLD character + .replace(/\n/gm, '\u008B') + // Replace carriage returns inside the quotes with a PLU character + .replace(/\r/gm, '\u008C') + // Replace tabs inside the quotes with a VTS character + .replace(/\t/g, '\u008A'); + + line = line.replace(item, newItem); + }); + + // If two quoted parameters are not separated by a space, add one automatically + line = line.replace(/\u0087\u0086/g, '\u0087 \u0086'); + + const items = split(line, ignoreExtraUnquotedSpaces); + + return items.map((item) => + item + // Convert back the spaces from inside quotes + .replace(/\u2008/g, ' ') + // Convert back the new lines from inside quotes + .replace(/\u008B/g, '\n') + // Convert back the carriage returns from inside quotes + .replace(/\u008C/g, '\r') + // Convert back the tabs from inside quotes + .replace(/\u008A/g, '\t') + // Remove SSA and ESA characters + .replace(/[\u0086\u0087]/g, '') + // Unescape quotes + .replace(/\\\"/g, '"'), + ); +} diff --git a/apps/meteor/package.json b/apps/meteor/package.json index 3e4cedcf4862..7d9d892741fe 100644 --- a/apps/meteor/package.json +++ b/apps/meteor/package.json @@ -197,18 +197,21 @@ "@rocket.chat/favicon": "workspace:^", "@rocket.chat/forked-matrix-appservice-bridge": "^4.0.1", "@rocket.chat/forked-matrix-bot-sdk": "^0.6.0-beta.2", - "@rocket.chat/fuselage": "^0.32.0-dev.55", + "@rocket.chat/fuselage": "^0.32.0-dev.61", "@rocket.chat/fuselage-hooks": "~0.31.14-dev.9", "@rocket.chat/fuselage-polyfills": "~0.31.12", "@rocket.chat/fuselage-toastbar": "^0.32.0-dev.22", - "@rocket.chat/fuselage-tokens": "^0.32.0-dev.5", + "@rocket.chat/fuselage-tokens": "^0.32.0-dev.9", "@rocket.chat/fuselage-ui-kit": "~0.31.14-dev.1", "@rocket.chat/icons": "~0.31.12", "@rocket.chat/logo": "~0.31.12", "@rocket.chat/memo": "~0.31.12", "@rocket.chat/message-parser": "~0.31.12", + "@rocket.chat/model-typings": "workspace:^", + "@rocket.chat/models": "workspace:^", "@rocket.chat/mp3-encoder": "^0.24.0", "@rocket.chat/onboarding-ui": "~0.31.12", + "@rocket.chat/poplib": "workspace:^", "@rocket.chat/rest-typings": "workspace:^", "@rocket.chat/string-helpers": "~0.31.12", "@rocket.chat/ui-contexts": "workspace:^", @@ -316,7 +319,6 @@ "pdfjs-dist": "^2.13.216", "photoswipe": "^4.1.3", "pino": "^7.10.0", - "poplib": "^0.1.7", "postis": "^2.2.0", "prom-client": "^14.0.1", "prometheus-gc-stats": "^0.6.3", diff --git a/apps/meteor/playwright.config.ts b/apps/meteor/playwright.config.ts index 8401640d940e..f729b707c136 100644 --- a/apps/meteor/playwright.config.ts +++ b/apps/meteor/playwright.config.ts @@ -23,7 +23,7 @@ const config: PlaywrightTestConfig = { baseURL, }, outputDir: 'tests/e2e/test-failures', - reporter: [['list']], + reporter: process.env.CI ? 'github' : 'list', testDir: 'tests/e2e', retries: 3, workers: 1, diff --git a/apps/meteor/server/configuration/accounts_meld.js b/apps/meteor/server/configuration/accounts_meld.js index edaaaa9e091e..dd816ef1e2e7 100644 --- a/apps/meteor/server/configuration/accounts_meld.js +++ b/apps/meteor/server/configuration/accounts_meld.js @@ -1,7 +1,7 @@ import _ from 'underscore'; import { Accounts } from 'meteor/accounts-base'; -import { Users } from '../../app/models'; +import { Users } from '../../app/models/server'; const orig_updateOrCreateUserFromExternalService = Accounts.updateOrCreateUserFromExternalService; diff --git a/apps/meteor/server/cron/federation.ts b/apps/meteor/server/cron/federation.ts index 315936a1f7bd..986f314a3a68 100644 --- a/apps/meteor/server/cron/federation.ts +++ b/apps/meteor/server/cron/federation.ts @@ -1,11 +1,11 @@ import { SettingValue } from '@rocket.chat/core-typings'; +import { Users, Settings } from '@rocket.chat/models'; import { resolveSRV, resolveTXT } from '../../app/federation/server/functions/resolveDNS'; import { settings, settingsRegistry } from '../../app/settings/server'; import { dispatchEvent } from '../../app/federation/server/handler'; import { getFederationDomain } from '../../app/federation/server/lib/getFederationDomain'; import { eventTypes } from '../../app/models/server/models/FederationEvents'; -import { Users, Settings } from '../../app/models/server/raw'; function updateSetting(id: string, value: SettingValue | null): void { if (value !== null) { diff --git a/apps/meteor/server/cron/nps.js b/apps/meteor/server/cron/nps.js index 92dd0328588f..20e1cc7f95cd 100644 --- a/apps/meteor/server/cron/nps.js +++ b/apps/meteor/server/cron/nps.js @@ -1,4 +1,4 @@ -import { settings } from '../../app/settings'; +import { settings } from '../../app/settings/server'; import { NPS } from '../sdk'; function runNPS() { diff --git a/apps/meteor/server/database/trash.ts b/apps/meteor/server/database/trash.ts new file mode 100644 index 000000000000..c1cccc0204b9 --- /dev/null +++ b/apps/meteor/server/database/trash.ts @@ -0,0 +1,18 @@ +import { getCollectionName } from '@rocket.chat/models'; +import { Mongo } from 'meteor/mongo'; +import type { Collection } from 'mongodb'; + +import { SystemLogger } from '../lib/logger/system'; + +// TODO need to improve how other files imports this +export const trash = new Mongo.Collection(getCollectionName('_trash')); +try { + trash._ensureIndex({ __collection__: 1 }); + trash._ensureIndex({ _deletedAt: 1 }, { expireAfterSeconds: 60 * 60 * 24 * 30 }); + + trash._ensureIndex({ rid: 1, __collection__: 1, _deletedAt: 1 }); +} catch (e) { + SystemLogger.error(e); +} + +export const trashCollection = trash.rawCollection() as Collection; diff --git a/apps/meteor/server/database/utils.ts b/apps/meteor/server/database/utils.ts new file mode 100644 index 000000000000..f42b15f926a8 --- /dev/null +++ b/apps/meteor/server/database/utils.ts @@ -0,0 +1,3 @@ +import { MongoInternals } from 'meteor/mongo'; + +export const { db } = MongoInternals.defaultRemoteCollectionDriver().mongo; diff --git a/apps/meteor/server/features/EmailInbox/EmailInbox.ts b/apps/meteor/server/features/EmailInbox/EmailInbox.ts index 791656902920..ee865f70d779 100644 --- a/apps/meteor/server/features/EmailInbox/EmailInbox.ts +++ b/apps/meteor/server/features/EmailInbox/EmailInbox.ts @@ -2,8 +2,8 @@ import { Meteor } from 'meteor/meteor'; import nodemailer from 'nodemailer'; import Mail from 'nodemailer/lib/mailer'; import type { IEmailInbox } from '@rocket.chat/core-typings'; +import { EmailInbox, EmailMessageHistory } from '@rocket.chat/models'; -import { EmailInbox, EmailMessageHistory } from '../../../app/models/server/raw'; import { IMAPInterceptor } from '../../email/IMAPInterceptor'; import { onEmailReceived } from './EmailInbox_Incoming'; import { logger } from './logger'; diff --git a/apps/meteor/server/features/EmailInbox/EmailInbox_Incoming.ts b/apps/meteor/server/features/EmailInbox/EmailInbox_Incoming.ts index 6c5e498cb1ee..a767be02b7c2 100644 --- a/apps/meteor/server/features/EmailInbox/EmailInbox_Incoming.ts +++ b/apps/meteor/server/features/EmailInbox/EmailInbox_Incoming.ts @@ -3,10 +3,11 @@ import stripHtml from 'string-strip-html'; import { Random } from 'meteor/random'; import { ParsedMail, Attachment } from 'mailparser'; import { TAPi18n } from 'meteor/rocketchat:tap-i18n'; -import { OmnichannelSourceType } from '@rocket.chat/core-typings'; +import { ILivechatVisitor, OmnichannelSourceType } from '@rocket.chat/core-typings'; +import { LivechatVisitors } from '@rocket.chat/models'; import { Livechat } from '../../../app/livechat/server/lib/Livechat'; -import { LivechatRooms, LivechatVisitors, Messages } from '../../../app/models/server'; +import { LivechatRooms, Messages } from '../../../app/models/server'; import { FileUpload } from '../../../app/file-upload/server'; import { QueueManager } from '../../../app/livechat/server/lib/QueueManager'; import { settings } from '../../../app/settings/server'; @@ -30,9 +31,9 @@ type FileAttachment = { const language = settings.get('Language') || 'en'; const t = (s: string): string => TAPi18n.__(s, { lng: language }); -function getGuestByEmail(email: string, name: string, department = ''): any { +async function getGuestByEmail(email: string, name: string, department = ''): Promise { logger.debug(`Attempt to register a guest for ${email} on department: ${department}`); - const guest = LivechatVisitors.findOneGuestByEmailAddress(email); + const guest = await LivechatVisitors.findOneGuestByEmailAddress(email); if (guest) { logger.debug(`Guest with email ${email} found with id ${guest._id}`); @@ -44,11 +45,11 @@ function getGuestByEmail(email: string, name: string, department = ''): any { newDepartment: department, }); if (!department) { - LivechatVisitors.removeDepartmentById(guest._id); + await LivechatVisitors.removeDepartmentById(guest._id); delete guest.department; return guest; } - Livechat.setDepartmentForGuest({ token: guest.token, department }); + await Livechat.setDepartmentForGuest({ token: guest.token, department }); return LivechatVisitors.findOneById(guest._id, {}); } return guest; @@ -58,7 +59,7 @@ function getGuestByEmail(email: string, name: string, department = ''): any { msg: 'Creating a new Omnichannel guest for visitor with email', email, }); - const userId = Livechat.registerGuest({ + const userId = await Livechat.registerGuest({ token: Random.id(), name: name || email, email, @@ -69,7 +70,7 @@ function getGuestByEmail(email: string, name: string, department = ''): any { id: undefined, }); - const newGuest = LivechatVisitors.findOneById(userId, {}); + const newGuest = await LivechatVisitors.findOneById(userId); logger.debug(`Guest ${userId} for visitor ${email} created`); if (newGuest) { return newGuest; @@ -136,7 +137,12 @@ export async function onEmailReceived(email: ParsedMail, inbox: string, departme const thread = references?.[0] ?? email.messageId; logger.debug(`Fetching guest for visitor ${email.from.value[0].address}`); - const guest = getGuestByEmail(email.from.value[0].address, email.from.value[0].name, department); + const guest = await getGuestByEmail(email.from.value[0].address, email.from.value[0].name, department); + + if (!guest) { + logger.debug(`No visitor found for ${email.from.value[0].address}`); + return; + } logger.debug(`Guest ${guest._id} obtained. Attempting to find or create a room on department ${department}`); diff --git a/apps/meteor/server/features/EmailInbox/EmailInbox_Outgoing.ts b/apps/meteor/server/features/EmailInbox/EmailInbox_Outgoing.ts index d4bc344e0041..f5254e53e180 100644 --- a/apps/meteor/server/features/EmailInbox/EmailInbox_Outgoing.ts +++ b/apps/meteor/server/features/EmailInbox/EmailInbox_Outgoing.ts @@ -3,12 +3,12 @@ import Mail from 'nodemailer/lib/mailer'; import { Match } from 'meteor/check'; import { TAPi18n } from 'meteor/rocketchat:tap-i18n'; import type { IEmailInbox, IUser, IMessage } from '@rocket.chat/core-typings'; +import { Uploads } from '@rocket.chat/models'; import { callbacks } from '../../../lib/callbacks'; import { FileUpload } from '../../../app/file-upload/server'; import { slashCommands } from '../../../app/utils/server'; import { Messages, Rooms, Users } from '../../../app/models/server'; -import { Uploads } from '../../../app/models/server/raw'; import { Inbox, inboxes } from './EmailInbox'; import { sendMessage } from '../../../app/lib/server/functions/sendMessage'; import { settings } from '../../../app/settings/server'; diff --git a/apps/meteor/server/importPackages.ts b/apps/meteor/server/importPackages.ts index 1cfec8eabf13..c5413917fa01 100644 --- a/apps/meteor/server/importPackages.ts +++ b/apps/meteor/server/importPackages.ts @@ -100,7 +100,7 @@ import '../app/bigbluebutton/server'; import '../app/mail-messages/server'; import '../app/user-status'; import '../app/utils'; -import '../app/models'; +import '../app/models/server'; import '../app/metrics'; import '../app/notifications'; import '../app/ui-utils'; diff --git a/apps/meteor/server/lib/ldap/DataConverter.ts b/apps/meteor/server/lib/ldap/DataConverter.ts index dfa4102944a2..00169f935fb5 100644 --- a/apps/meteor/server/lib/ldap/DataConverter.ts +++ b/apps/meteor/server/lib/ldap/DataConverter.ts @@ -1,9 +1,9 @@ import type { IImportUser, IUser } from '@rocket.chat/core-typings'; +import { Users } from '@rocket.chat/models'; import { VirtualDataConverter } from '../../../app/importer/server/classes/VirtualDataConverter'; import type { IConverterOptions } from '../../../app/importer/server/classes/ImportDataConverter'; import { Logger } from '../logger/Logger'; -import { Users } from '../../../app/models/server/raw'; import { settings } from '../../../app/settings/server'; const logger = new Logger('LDAP Data Converter'); diff --git a/apps/meteor/server/lib/ldap/Manager.ts b/apps/meteor/server/lib/ldap/Manager.ts index b8c4ff22f92d..ba694b752f6f 100644 --- a/apps/meteor/server/lib/ldap/Manager.ts +++ b/apps/meteor/server/lib/ldap/Manager.ts @@ -7,9 +7,9 @@ import ldapEscape from 'ldap-escape'; import _ from 'underscore'; import { ILDAPEntry, LDAPLoginResult, ILDAPUniqueIdentifierField, IUser, LoginUsername } from '@rocket.chat/core-typings'; import type { IImportUser } from '@rocket.chat/core-typings'; +import { Users as UsersRaw } from '@rocket.chat/models'; import { settings } from '../../../app/settings/server'; -import { Users as UsersRaw } from '../../../app/models/server/raw'; import { LDAPConnection } from './Connection'; import { LDAPDataConverter } from './DataConverter'; import { getLDAPConditionalSetting } from './getLDAPConditionalSetting'; diff --git a/apps/meteor/server/lib/markRoomAsRead.ts b/apps/meteor/server/lib/markRoomAsRead.ts index a71ee176d66b..7aeccbeb5c41 100644 --- a/apps/meteor/server/lib/markRoomAsRead.ts +++ b/apps/meteor/server/lib/markRoomAsRead.ts @@ -1,5 +1,6 @@ +import { NotificationQueue, Subscriptions } from '@rocket.chat/models'; + import { callbacks } from '../../lib/callbacks'; -import { NotificationQueue, Subscriptions } from '../../app/models/server/raw'; export async function markRoomAsRead(rid: string, uid: string): Promise { callbacks.run('beforeReadMessages', rid, uid); diff --git a/apps/meteor/server/lib/messages/getMessageForUser.ts b/apps/meteor/server/lib/messages/getMessageForUser.ts index 3e3fd789f94f..5830d6a8d4da 100644 --- a/apps/meteor/server/lib/messages/getMessageForUser.ts +++ b/apps/meteor/server/lib/messages/getMessageForUser.ts @@ -1,6 +1,6 @@ import type { IUser, IMessage } from '@rocket.chat/core-typings'; +import { Messages } from '@rocket.chat/models'; -import { Messages } from '../../../app/models/server/raw'; import { canAccessRoomId } from '../../../app/authorization/server'; export async function getMessageForUser(messageId: IMessage['_id'], uid: IUser['_id'] | null): Promise { diff --git a/apps/meteor/server/lib/roles/addUserRoles.ts b/apps/meteor/server/lib/roles/addUserRoles.ts index 21941d0091ed..d12764e5a05c 100644 --- a/apps/meteor/server/lib/roles/addUserRoles.ts +++ b/apps/meteor/server/lib/roles/addUserRoles.ts @@ -1,6 +1,6 @@ import type { IRole, IUser, IRoom } from '@rocket.chat/core-typings'; +import { Users, Roles } from '@rocket.chat/models'; -import { Users, Roles } from '../../../app/models/server/raw'; import { validateRoleList } from './validateRoleList'; import { MeteorError } from '../../sdk/errors'; diff --git a/apps/meteor/server/lib/roles/createOrUpdateProtectedRole.ts b/apps/meteor/server/lib/roles/createOrUpdateProtectedRole.ts index efa5129fcf82..b528d61af106 100644 --- a/apps/meteor/server/lib/roles/createOrUpdateProtectedRole.ts +++ b/apps/meteor/server/lib/roles/createOrUpdateProtectedRole.ts @@ -1,6 +1,5 @@ import type { IRole, AtLeast } from '@rocket.chat/core-typings'; - -import { Roles } from '../../../app/models/server/raw'; +import { Roles } from '@rocket.chat/models'; export const createOrUpdateProtectedRoleAsync = async ( roleId: string, diff --git a/apps/meteor/server/lib/roles/getRoomRoles.ts b/apps/meteor/server/lib/roles/getRoomRoles.ts index 5b8c6305d41c..5c28c786eb1f 100644 --- a/apps/meteor/server/lib/roles/getRoomRoles.ts +++ b/apps/meteor/server/lib/roles/getRoomRoles.ts @@ -1,9 +1,9 @@ import _ from 'underscore'; import type { IRoom, ISubscription } from '@rocket.chat/core-typings'; +import { Roles } from '@rocket.chat/models'; import { settings } from '../../../app/settings/server'; import { Subscriptions, Users } from '../../../app/models/server'; -import { Roles } from '../../../app/models/server/raw'; export function getRoomRoles(rid: IRoom['_id']): ISubscription[] { const options = { diff --git a/apps/meteor/server/lib/roles/insertRole.ts b/apps/meteor/server/lib/roles/insertRole.ts index cbfed8a8064a..500dab3e153e 100644 --- a/apps/meteor/server/lib/roles/insertRole.ts +++ b/apps/meteor/server/lib/roles/insertRole.ts @@ -1,6 +1,6 @@ import type { IRole } from '@rocket.chat/core-typings'; +import { Roles } from '@rocket.chat/models'; -import { Roles } from '../../../app/models/server/raw'; import { MeteorError } from '../../sdk/errors'; import { isValidRoleScope } from '../../../lib/roles/isValidRoleScope'; import { api } from '../../sdk/api'; diff --git a/apps/meteor/server/lib/roles/removeUserFromRoles.ts b/apps/meteor/server/lib/roles/removeUserFromRoles.ts index b2165788dc56..bdf75fd897ae 100644 --- a/apps/meteor/server/lib/roles/removeUserFromRoles.ts +++ b/apps/meteor/server/lib/roles/removeUserFromRoles.ts @@ -1,6 +1,6 @@ import type { IRole, IUser, IRoom } from '@rocket.chat/core-typings'; +import { Users, Roles } from '@rocket.chat/models'; -import { Users, Roles } from '../../../app/models/server/raw'; import { validateRoleList } from './validateRoleList'; import { MeteorError } from '../../sdk/errors'; diff --git a/apps/meteor/server/lib/roles/updateRole.ts b/apps/meteor/server/lib/roles/updateRole.ts index 3ed804fbce55..b69f54f873da 100644 --- a/apps/meteor/server/lib/roles/updateRole.ts +++ b/apps/meteor/server/lib/roles/updateRole.ts @@ -1,6 +1,6 @@ import type { IRole } from '@rocket.chat/core-typings'; +import { Roles } from '@rocket.chat/models'; -import { Roles } from '../../../app/models/server/raw'; import { MeteorError } from '../../sdk/errors'; import { isValidRoleScope } from '../../../lib/roles/isValidRoleScope'; import { api } from '../../sdk/api'; diff --git a/apps/meteor/server/lib/roles/validateRoleList.ts b/apps/meteor/server/lib/roles/validateRoleList.ts index e8fd1e08843d..8333befe873a 100644 --- a/apps/meteor/server/lib/roles/validateRoleList.ts +++ b/apps/meteor/server/lib/roles/validateRoleList.ts @@ -1,6 +1,5 @@ import type { IRole } from '@rocket.chat/core-typings'; - -import { Roles } from '../../../app/models/server/raw'; +import { Roles } from '@rocket.chat/models'; export const validateRoleList = async (roleIds: IRole['_id'][]): Promise => { const options = { diff --git a/apps/meteor/server/lib/rooms/roomTypes/livechat.ts b/apps/meteor/server/lib/rooms/roomTypes/livechat.ts index fe69aacc7217..1dadd91ee27d 100644 --- a/apps/meteor/server/lib/rooms/roomTypes/livechat.ts +++ b/apps/meteor/server/lib/rooms/roomTypes/livechat.ts @@ -1,6 +1,7 @@ import type { AtLeast, ValueOf } from '@rocket.chat/core-typings'; +import { LivechatVisitors } from '@rocket.chat/models'; -import { LivechatRooms, LivechatVisitors } from '../../../../app/models/server'; +import { LivechatRooms } from '../../../../app/models/server'; import { RoomSettingsEnum, RoomMemberActions } from '../../../../definition/IRoomTypeConfig'; import type { IRoomTypeServerDirectives } from '../../../../definition/IRoomTypeConfig'; import { getLivechatRoomType } from '../../../../lib/rooms/roomTypes/livechat'; @@ -38,7 +39,7 @@ roomCoordinator.add(LivechatRoomType, { }, getMsgSender(senderId) { - return LivechatVisitors.findOneById(senderId); + return Promise.await(LivechatVisitors.findOneById(senderId)); }, getReadReceiptsExtraData(message) { diff --git a/apps/meteor/server/lib/sendMessagesToAdmins.ts b/apps/meteor/server/lib/sendMessagesToAdmins.ts index 73fa88b51176..321e9c6a44e8 100644 --- a/apps/meteor/server/lib/sendMessagesToAdmins.ts +++ b/apps/meteor/server/lib/sendMessagesToAdmins.ts @@ -1,7 +1,7 @@ import type { IUser, IMessage } from '@rocket.chat/core-typings'; +import { Roles, Users } from '@rocket.chat/models'; import { SystemLogger } from './logger/system'; -import { Roles, Users } from '../../app/models/server/raw'; import { executeSendMessage } from '../../app/lib/server/methods/sendMessage'; import { createDirectMessage } from '../methods/createDirectMessage'; diff --git a/apps/meteor/server/lib/spotlight.js b/apps/meteor/server/lib/spotlight.js index 56230bb7da56..7e11ac646d0f 100644 --- a/apps/meteor/server/lib/spotlight.js +++ b/apps/meteor/server/lib/spotlight.js @@ -1,9 +1,9 @@ import s from 'underscore.string'; import { escapeRegExp } from '@rocket.chat/string-helpers'; +import { Users } from '@rocket.chat/models'; import { hasAllPermission, hasPermission, canAccessRoom, roomAccessAttributes } from '../../app/authorization/server'; import { Subscriptions, Rooms } from '../../app/models/server'; -import { Users } from '../../app/models/server/raw'; import { settings } from '../../app/settings/server'; import { readSecondaryPreferred } from '../database/readSecondaryPreferred'; import { roomCoordinator } from './rooms/roomCoordinator'; diff --git a/apps/meteor/server/lib/statistics/getSettingsStatistics.ts b/apps/meteor/server/lib/statistics/getSettingsStatistics.ts index cf0387d5fa96..c43f4ef83717 100644 --- a/apps/meteor/server/lib/statistics/getSettingsStatistics.ts +++ b/apps/meteor/server/lib/statistics/getSettingsStatistics.ts @@ -1,6 +1,5 @@ import type { ISettingStatistics, ISettingStatisticsObject } from '@rocket.chat/core-typings'; - -import { Settings } from '../../../app/models/server/raw'; +import { Settings } from '@rocket.chat/models'; const setSettingsStatistics = async (settings: ISettingStatistics): Promise => { const { diff --git a/apps/meteor/server/main.ts b/apps/meteor/server/main.ts index a68d452ea530..78b6e52b4df6 100644 --- a/apps/meteor/server/main.ts +++ b/apps/meteor/server/main.ts @@ -1,3 +1,5 @@ +import './models/startup'; +import '../ee/server/models/startup'; import './services/startup'; import '../app/settings/server'; import '../lib/oauthRedirectUri'; diff --git a/apps/meteor/server/methods/OEmbedCacheCleanup.js b/apps/meteor/server/methods/OEmbedCacheCleanup.js index dea83c83802c..0453dd1200c5 100644 --- a/apps/meteor/server/methods/OEmbedCacheCleanup.js +++ b/apps/meteor/server/methods/OEmbedCacheCleanup.js @@ -1,6 +1,6 @@ import { Meteor } from 'meteor/meteor'; +import { OEmbedCache } from '@rocket.chat/models'; -import { OEmbedCache } from '../../app/models/server/raw'; import { settings } from '../../app/settings/server'; import { hasPermissionAsync } from '../../app/authorization/server/functions/hasPermission'; diff --git a/apps/meteor/server/methods/addRoomLeader.js b/apps/meteor/server/methods/addRoomLeader.js index eed7d577d5a7..979b9df51d93 100644 --- a/apps/meteor/server/methods/addRoomLeader.js +++ b/apps/meteor/server/methods/addRoomLeader.js @@ -2,8 +2,8 @@ import { Meteor } from 'meteor/meteor'; import { check } from 'meteor/check'; import { hasPermission } from '../../app/authorization'; -import { Users, Subscriptions, Messages } from '../../app/models'; -import { settings } from '../../app/settings'; +import { Users, Subscriptions, Messages } from '../../app/models/server'; +import { settings } from '../../app/settings/server'; import { api } from '../sdk/api'; import { Team } from '../sdk'; diff --git a/apps/meteor/server/methods/addRoomModerator.js b/apps/meteor/server/methods/addRoomModerator.js index 6088021e2f00..3feadda06eb9 100644 --- a/apps/meteor/server/methods/addRoomModerator.js +++ b/apps/meteor/server/methods/addRoomModerator.js @@ -2,8 +2,8 @@ import { Meteor } from 'meteor/meteor'; import { check } from 'meteor/check'; import { hasPermission } from '../../app/authorization'; -import { Users, Subscriptions, Messages } from '../../app/models'; -import { settings } from '../../app/settings'; +import { Users, Subscriptions, Messages } from '../../app/models/server'; +import { settings } from '../../app/settings/server'; import { api } from '../sdk/api'; import { Team } from '../sdk'; diff --git a/apps/meteor/server/methods/addRoomOwner.js b/apps/meteor/server/methods/addRoomOwner.js index 04ecc0db72e0..01af5a76858d 100644 --- a/apps/meteor/server/methods/addRoomOwner.js +++ b/apps/meteor/server/methods/addRoomOwner.js @@ -2,9 +2,9 @@ import { Meteor } from 'meteor/meteor'; import { check } from 'meteor/check'; import { hasPermission } from '../../app/authorization'; -import { Users, Subscriptions, Messages } from '../../app/models'; +import { Users, Subscriptions, Messages } from '../../app/models/server'; import { Team } from '../sdk'; -import { settings } from '../../app/settings'; +import { settings } from '../../app/settings/server'; import { api } from '../sdk/api'; Meteor.methods({ diff --git a/apps/meteor/server/methods/afterVerifyEmail.ts b/apps/meteor/server/methods/afterVerifyEmail.ts index 6955bc099307..01424af65be4 100644 --- a/apps/meteor/server/methods/afterVerifyEmail.ts +++ b/apps/meteor/server/methods/afterVerifyEmail.ts @@ -1,8 +1,8 @@ import { Meteor } from 'meteor/meteor'; import type { IUser, IRole } from '@rocket.chat/core-typings'; +import { Roles } from '@rocket.chat/models'; import { Users } from '../../app/models/server'; -import { Roles } from '../../app/models/server/raw'; const rolesToChangeTo: Map = new Map([['anonymous', ['user']]]); diff --git a/apps/meteor/server/methods/browseChannels.js b/apps/meteor/server/methods/browseChannels.js index 083ba5a69994..4efe4b45ba20 100644 --- a/apps/meteor/server/methods/browseChannels.js +++ b/apps/meteor/server/methods/browseChannels.js @@ -3,10 +3,10 @@ import { DDPRateLimiter } from 'meteor/ddp-rate-limiter'; import s from 'underscore.string'; import mem from 'mem'; import { escapeRegExp } from '@rocket.chat/string-helpers'; +import { Rooms as RoomsRaw } from '@rocket.chat/models'; import { hasPermission } from '../../app/authorization/server'; import { Rooms, Users, Subscriptions } from '../../app/models/server'; -import { Rooms as RoomsRaw } from '../../app/models/server/raw'; import { settings } from '../../app/settings/server'; import { getFederationDomain } from '../../app/federation/server/lib/getFederationDomain'; import { isFederationEnabled } from '../../app/federation/server/lib/isFederationEnabled'; diff --git a/apps/meteor/server/methods/channelsList.js b/apps/meteor/server/methods/channelsList.js index 9cc750d58be7..65b5e371de29 100644 --- a/apps/meteor/server/methods/channelsList.js +++ b/apps/meteor/server/methods/channelsList.js @@ -4,9 +4,9 @@ import _ from 'underscore'; import s from 'underscore.string'; import { hasPermission } from '../../app/authorization'; -import { Rooms, Subscriptions, Users } from '../../app/models'; +import { Rooms, Subscriptions, Users } from '../../app/models/server'; import { getUserPreference } from '../../app/utils'; -import { settings } from '../../app/settings'; +import { settings } from '../../app/settings/server'; Meteor.methods({ channelsList(filter, channelType, limit, sort) { diff --git a/apps/meteor/server/methods/deleteFileMessage.js b/apps/meteor/server/methods/deleteFileMessage.js index a35a407f9211..bc465144e10e 100644 --- a/apps/meteor/server/methods/deleteFileMessage.js +++ b/apps/meteor/server/methods/deleteFileMessage.js @@ -2,7 +2,7 @@ import { Meteor } from 'meteor/meteor'; import { check } from 'meteor/check'; import { FileUpload } from '../../app/file-upload'; -import { Messages } from '../../app/models'; +import { Messages } from '../../app/models/server'; Meteor.methods({ async deleteFileMessage(fileID) { diff --git a/apps/meteor/server/methods/deleteUser.js b/apps/meteor/server/methods/deleteUser.js index 9e0b1f161439..1ce8be7e89bd 100644 --- a/apps/meteor/server/methods/deleteUser.js +++ b/apps/meteor/server/methods/deleteUser.js @@ -1,7 +1,7 @@ import { Meteor } from 'meteor/meteor'; import { check } from 'meteor/check'; -import { Users } from '../../app/models'; +import { Users } from '../../app/models/server'; import { hasPermission } from '../../app/authorization'; import { callbacks } from '../../lib/callbacks'; import { deleteUser } from '../../app/lib/server'; diff --git a/apps/meteor/server/methods/eraseRoom.js b/apps/meteor/server/methods/eraseRoom.js index 1c8f8f8fd58a..cea12f7225a5 100644 --- a/apps/meteor/server/methods/eraseRoom.js +++ b/apps/meteor/server/methods/eraseRoom.js @@ -3,7 +3,7 @@ import { check } from 'meteor/check'; import { deleteRoom } from '../../app/lib'; import { hasPermission } from '../../app/authorization/server'; -import { Rooms, Messages } from '../../app/models'; +import { Rooms, Messages } from '../../app/models/server'; import { Apps } from '../../app/apps/server'; import { roomCoordinator } from '../lib/rooms/roomCoordinator'; import { Team } from '../sdk'; diff --git a/apps/meteor/server/methods/getPasswordPolicy.js b/apps/meteor/server/methods/getPasswordPolicy.js index 47fadb436ee5..df14573ef014 100644 --- a/apps/meteor/server/methods/getPasswordPolicy.js +++ b/apps/meteor/server/methods/getPasswordPolicy.js @@ -1,7 +1,7 @@ import { Meteor } from 'meteor/meteor'; import { check } from 'meteor/check'; -import { Users } from '../../app/models'; +import { Users } from '../../app/models/server'; import { passwordPolicy } from '../../app/lib'; Meteor.methods({ diff --git a/apps/meteor/server/methods/getRoomById.js b/apps/meteor/server/methods/getRoomById.js index badecb45d386..8a97b6001b82 100644 --- a/apps/meteor/server/methods/getRoomById.js +++ b/apps/meteor/server/methods/getRoomById.js @@ -2,7 +2,7 @@ import { Meteor } from 'meteor/meteor'; import { check } from 'meteor/check'; import { DDPRateLimiter } from 'meteor/ddp-rate-limiter'; -import { Rooms } from '../../app/models'; +import { Rooms } from '../../app/models/server'; import { canAccessRoom } from '../../app/authorization'; Meteor.methods({ diff --git a/apps/meteor/server/methods/getRoomIdByNameOrId.js b/apps/meteor/server/methods/getRoomIdByNameOrId.js index 8718bbf4dbbe..acaac9c03ca8 100644 --- a/apps/meteor/server/methods/getRoomIdByNameOrId.js +++ b/apps/meteor/server/methods/getRoomIdByNameOrId.js @@ -2,7 +2,7 @@ import { Meteor } from 'meteor/meteor'; import { check } from 'meteor/check'; -import { Rooms } from '../../app/models'; +import { Rooms } from '../../app/models/server'; import { canAccessRoom } from '../../app/authorization'; Meteor.methods({ diff --git a/apps/meteor/server/methods/getRoomNameById.js b/apps/meteor/server/methods/getRoomNameById.js index f9a064241c41..9c4f37ce1c54 100644 --- a/apps/meteor/server/methods/getRoomNameById.js +++ b/apps/meteor/server/methods/getRoomNameById.js @@ -1,7 +1,7 @@ import { Meteor } from 'meteor/meteor'; import { check } from 'meteor/check'; -import { Rooms, Subscriptions } from '../../app/models'; +import { Rooms, Subscriptions } from '../../app/models/server'; import { hasPermission } from '../../app/authorization'; Meteor.methods({ diff --git a/apps/meteor/server/methods/getSetupWizardParameters.js b/apps/meteor/server/methods/getSetupWizardParameters.js index 2655e8af7b41..a26ab8f329b5 100644 --- a/apps/meteor/server/methods/getSetupWizardParameters.js +++ b/apps/meteor/server/methods/getSetupWizardParameters.js @@ -1,6 +1,6 @@ import { Meteor } from 'meteor/meteor'; -import { Settings } from '../../app/models'; +import { Settings } from '../../app/models/server'; import { settings } from '../../app/settings/server'; Meteor.methods({ diff --git a/apps/meteor/server/methods/getTotalChannels.js b/apps/meteor/server/methods/getTotalChannels.js index 0fcfaff4165a..0539848b209d 100644 --- a/apps/meteor/server/methods/getTotalChannels.js +++ b/apps/meteor/server/methods/getTotalChannels.js @@ -1,6 +1,6 @@ import { Meteor } from 'meteor/meteor'; -import { Rooms } from '../../app/models'; +import { Rooms } from '../../app/models/server'; Meteor.methods({ getTotalChannels() { diff --git a/apps/meteor/server/methods/hideRoom.js b/apps/meteor/server/methods/hideRoom.js index 8c632eb8ac41..37668f5984d6 100644 --- a/apps/meteor/server/methods/hideRoom.js +++ b/apps/meteor/server/methods/hideRoom.js @@ -1,7 +1,7 @@ import { Meteor } from 'meteor/meteor'; import { check } from 'meteor/check'; -import { Subscriptions } from '../../app/models'; +import { Subscriptions } from '../../app/models/server'; Meteor.methods({ hideRoom(rid) { diff --git a/apps/meteor/server/methods/ignoreUser.js b/apps/meteor/server/methods/ignoreUser.js index ff06cb27f92b..e5192abc832b 100644 --- a/apps/meteor/server/methods/ignoreUser.js +++ b/apps/meteor/server/methods/ignoreUser.js @@ -1,7 +1,7 @@ import { Meteor } from 'meteor/meteor'; import { check } from 'meteor/check'; -import { Subscriptions } from '../../app/models'; +import { Subscriptions } from '../../app/models/server'; Meteor.methods({ ignoreUser({ rid, userId: ignoredUser, ignore = true }) { diff --git a/apps/meteor/server/methods/messageSearch.js b/apps/meteor/server/methods/messageSearch.js index 580a768ddf71..126b774fba62 100644 --- a/apps/meteor/server/methods/messageSearch.js +++ b/apps/meteor/server/methods/messageSearch.js @@ -1,10 +1,10 @@ import { Meteor } from 'meteor/meteor'; import { Match, check } from 'meteor/check'; import { escapeRegExp } from '@rocket.chat/string-helpers'; +import { Messages } from '@rocket.chat/models'; import { canAccessRoomId } from '../../app/authorization/server'; import { Subscriptions } from '../../app/models/server'; -import { Messages } from '../../app/models/server/raw'; import { settings } from '../../app/settings/server'; import { readSecondaryPreferred } from '../database/readSecondaryPreferred'; diff --git a/apps/meteor/server/methods/muteUserInRoom.js b/apps/meteor/server/methods/muteUserInRoom.js index f1acc60e3417..5bd07e040979 100644 --- a/apps/meteor/server/methods/muteUserInRoom.js +++ b/apps/meteor/server/methods/muteUserInRoom.js @@ -1,7 +1,7 @@ import { Meteor } from 'meteor/meteor'; import { Match, check } from 'meteor/check'; -import { Rooms, Subscriptions, Users, Messages } from '../../app/models'; +import { Rooms, Subscriptions, Users, Messages } from '../../app/models/server'; import { hasPermission } from '../../app/authorization'; import { callbacks } from '../../lib/callbacks'; import { roomCoordinator } from '../lib/rooms/roomCoordinator'; diff --git a/apps/meteor/server/methods/openRoom.js b/apps/meteor/server/methods/openRoom.js index 61ca1129a9f5..f3ae621096cd 100644 --- a/apps/meteor/server/methods/openRoom.js +++ b/apps/meteor/server/methods/openRoom.js @@ -1,7 +1,7 @@ import { Meteor } from 'meteor/meteor'; import { check } from 'meteor/check'; -import { Subscriptions } from '../../app/models'; +import { Subscriptions } from '../../app/models/server'; Meteor.methods({ openRoom(rid) { diff --git a/apps/meteor/server/methods/registerUser.js b/apps/meteor/server/methods/registerUser.js index 10beb696c831..5e206f3ded9f 100644 --- a/apps/meteor/server/methods/registerUser.js +++ b/apps/meteor/server/methods/registerUser.js @@ -4,8 +4,8 @@ import { Accounts } from 'meteor/accounts-base'; import s from 'underscore.string'; import { DDPRateLimiter } from 'meteor/ddp-rate-limiter'; -import { Users } from '../../app/models'; -import { settings } from '../../app/settings'; +import { Users } from '../../app/models/server'; +import { settings } from '../../app/settings/server'; import { validateEmailDomain, passwordPolicy, RateLimiter } from '../../app/lib'; import { validateInviteToken } from '../../app/invites/server/functions/validateInviteToken'; diff --git a/apps/meteor/server/methods/removeRoomLeader.js b/apps/meteor/server/methods/removeRoomLeader.js index 6b40f266e260..7fef6f36b11a 100644 --- a/apps/meteor/server/methods/removeRoomLeader.js +++ b/apps/meteor/server/methods/removeRoomLeader.js @@ -2,8 +2,8 @@ import { Meteor } from 'meteor/meteor'; import { check } from 'meteor/check'; import { hasPermission } from '../../app/authorization'; -import { Users, Subscriptions, Messages } from '../../app/models'; -import { settings } from '../../app/settings'; +import { Users, Subscriptions, Messages } from '../../app/models/server'; +import { settings } from '../../app/settings/server'; import { api } from '../sdk/api'; import { Team } from '../sdk'; diff --git a/apps/meteor/server/methods/removeRoomModerator.js b/apps/meteor/server/methods/removeRoomModerator.js index 4b3739b4e6df..7312c6f2e105 100644 --- a/apps/meteor/server/methods/removeRoomModerator.js +++ b/apps/meteor/server/methods/removeRoomModerator.js @@ -2,8 +2,8 @@ import { Meteor } from 'meteor/meteor'; import { check } from 'meteor/check'; import { hasPermission } from '../../app/authorization'; -import { Users, Subscriptions, Messages } from '../../app/models'; -import { settings } from '../../app/settings'; +import { Users, Subscriptions, Messages } from '../../app/models/server'; +import { settings } from '../../app/settings/server'; import { api } from '../sdk/api'; import { Team } from '../sdk'; diff --git a/apps/meteor/server/methods/reportMessage.js b/apps/meteor/server/methods/reportMessage.js index 852187acbb1e..eddcd8f8d706 100644 --- a/apps/meteor/server/methods/reportMessage.js +++ b/apps/meteor/server/methods/reportMessage.js @@ -1,8 +1,8 @@ import { Meteor } from 'meteor/meteor'; import { check } from 'meteor/check'; +import { Reports, Rooms } from '@rocket.chat/models'; import { Messages } from '../../app/models/server'; -import { Reports, Rooms } from '../../app/models/server/raw'; import { canAccessRoomAsync } from '../../app/authorization/server/functions/canAccessRoom'; import { AppEvents, Apps } from '../../app/apps/server'; diff --git a/apps/meteor/server/methods/requestDataDownload.js b/apps/meteor/server/methods/requestDataDownload.js index 3f9c28074422..e1f0d7a87b6a 100644 --- a/apps/meteor/server/methods/requestDataDownload.js +++ b/apps/meteor/server/methods/requestDataDownload.js @@ -3,8 +3,8 @@ import path from 'path'; import mkdirp from 'mkdirp'; import { Meteor } from 'meteor/meteor'; +import { ExportOperations, UserDataFiles } from '@rocket.chat/models'; -import { ExportOperations, UserDataFiles } from '../../app/models/server/raw'; import { settings } from '../../app/settings/server'; import { DataExport } from '../../app/user-data-download/server/DataExport'; diff --git a/apps/meteor/server/methods/resetAvatar.js b/apps/meteor/server/methods/resetAvatar.js index 670c5d994b7b..a57586a4d483 100644 --- a/apps/meteor/server/methods/resetAvatar.js +++ b/apps/meteor/server/methods/resetAvatar.js @@ -3,7 +3,7 @@ import { DDPRateLimiter } from 'meteor/ddp-rate-limiter'; import { FileUpload } from '../../app/file-upload'; import { Users } from '../../app/models/server'; -import { settings } from '../../app/settings'; +import { settings } from '../../app/settings/server'; import { hasPermission } from '../../app/authorization/server'; import { api } from '../sdk/api'; diff --git a/apps/meteor/server/methods/roomNameExists.js b/apps/meteor/server/methods/roomNameExists.js index ef2c2a5d167e..f0e1f3cec39c 100644 --- a/apps/meteor/server/methods/roomNameExists.js +++ b/apps/meteor/server/methods/roomNameExists.js @@ -1,7 +1,7 @@ import { Meteor } from 'meteor/meteor'; import { check } from 'meteor/check'; -import { Rooms } from '../../app/models'; +import { Rooms } from '../../app/models/server'; Meteor.methods({ roomNameExists(rid) { diff --git a/apps/meteor/server/methods/sendConfirmationEmail.js b/apps/meteor/server/methods/sendConfirmationEmail.js index 6340270f814a..cc6e4f16af36 100644 --- a/apps/meteor/server/methods/sendConfirmationEmail.js +++ b/apps/meteor/server/methods/sendConfirmationEmail.js @@ -2,7 +2,7 @@ import { Meteor } from 'meteor/meteor'; import { check } from 'meteor/check'; import { Accounts } from 'meteor/accounts-base'; -import { Users } from '../../app/models'; +import { Users } from '../../app/models/server'; Meteor.methods({ sendConfirmationEmail(to) { diff --git a/apps/meteor/server/methods/sendForgotPasswordEmail.js b/apps/meteor/server/methods/sendForgotPasswordEmail.js index bb8d5ea56ada..277f4e25a572 100644 --- a/apps/meteor/server/methods/sendForgotPasswordEmail.js +++ b/apps/meteor/server/methods/sendForgotPasswordEmail.js @@ -2,7 +2,7 @@ import { Meteor } from 'meteor/meteor'; import { check } from 'meteor/check'; import { Accounts } from 'meteor/accounts-base'; -import { Users } from '../../app/models'; +import { Users } from '../../app/models/server'; import { settings } from '../../app/settings/server'; import { SystemLogger } from '../lib/logger/system'; diff --git a/apps/meteor/server/methods/setAvatarFromService.js b/apps/meteor/server/methods/setAvatarFromService.js index 2894bf2b0b6a..d6f97c80bd66 100644 --- a/apps/meteor/server/methods/setAvatarFromService.js +++ b/apps/meteor/server/methods/setAvatarFromService.js @@ -2,7 +2,7 @@ import { Meteor } from 'meteor/meteor'; import { Match, check } from 'meteor/check'; import { DDPRateLimiter } from 'meteor/ddp-rate-limiter'; -import { settings } from '../../app/settings'; +import { settings } from '../../app/settings/server'; import { setUserAvatar } from '../../app/lib'; import { Users } from '../../app/models/server'; import { hasPermission } from '../../app/authorization/server'; diff --git a/apps/meteor/server/methods/toogleFavorite.js b/apps/meteor/server/methods/toogleFavorite.js index 4c12fea9c433..251060c5e6b7 100644 --- a/apps/meteor/server/methods/toogleFavorite.js +++ b/apps/meteor/server/methods/toogleFavorite.js @@ -1,7 +1,7 @@ import { Meteor } from 'meteor/meteor'; import { Match, check } from 'meteor/check'; -import { Subscriptions } from '../../app/models'; +import { Subscriptions } from '../../app/models/server'; Meteor.methods({ toggleFavorite(rid, f) { diff --git a/apps/meteor/server/methods/unmuteUserInRoom.js b/apps/meteor/server/methods/unmuteUserInRoom.js index e0ae8b6dc138..ce0f9ee3a86c 100644 --- a/apps/meteor/server/methods/unmuteUserInRoom.js +++ b/apps/meteor/server/methods/unmuteUserInRoom.js @@ -3,7 +3,7 @@ import { Match, check } from 'meteor/check'; import { hasPermission } from '../../app/authorization'; import { callbacks } from '../../lib/callbacks'; -import { Rooms, Subscriptions, Users, Messages } from '../../app/models'; +import { Rooms, Subscriptions, Users, Messages } from '../../app/models/server'; import { roomCoordinator } from '../lib/rooms/roomCoordinator'; import { RoomMemberActions } from '../../definition/IRoomTypeConfig'; diff --git a/apps/meteor/server/methods/userSetUtcOffset.js b/apps/meteor/server/methods/userSetUtcOffset.js index 1b987afb830d..d00bb30cc743 100644 --- a/apps/meteor/server/methods/userSetUtcOffset.js +++ b/apps/meteor/server/methods/userSetUtcOffset.js @@ -2,7 +2,7 @@ import { Meteor } from 'meteor/meteor'; import { check } from 'meteor/check'; import { DDPRateLimiter } from 'meteor/ddp-rate-limiter'; -import { Users } from '../../app/models'; +import { Users } from '../../app/models/server'; Meteor.methods({ userSetUtcOffset(utcOffset) { diff --git a/apps/meteor/server/models/Analytics.ts b/apps/meteor/server/models/Analytics.ts new file mode 100644 index 000000000000..fd5fc32766e1 --- /dev/null +++ b/apps/meteor/server/models/Analytics.ts @@ -0,0 +1,6 @@ +import { registerModel } from '@rocket.chat/models'; + +import { db } from '../database/utils'; +import { AnalyticsRaw } from './raw/Analytics'; + +registerModel('IAnalyticsModel', new AnalyticsRaw(db)); diff --git a/apps/meteor/server/models/Avatars.ts b/apps/meteor/server/models/Avatars.ts new file mode 100644 index 000000000000..2b6126c187d8 --- /dev/null +++ b/apps/meteor/server/models/Avatars.ts @@ -0,0 +1,7 @@ +import { registerModel } from '@rocket.chat/models'; + +import { trashCollection } from '../database/trash'; +import { db } from '../database/utils'; +import { AvatarsRaw } from './raw/Avatars'; + +registerModel('IAvatarsModel', new AvatarsRaw(db, trashCollection)); diff --git a/apps/meteor/server/models/Banners.ts b/apps/meteor/server/models/Banners.ts new file mode 100644 index 000000000000..a9956ffcbf7b --- /dev/null +++ b/apps/meteor/server/models/Banners.ts @@ -0,0 +1,7 @@ +import { registerModel } from '@rocket.chat/models'; + +import { trashCollection } from '../database/trash'; +import { db } from '../database/utils'; +import { BannersRaw } from './raw/Banners'; + +registerModel('IBannersModel', new BannersRaw(db, trashCollection)); diff --git a/apps/meteor/server/models/BannersDismiss.ts b/apps/meteor/server/models/BannersDismiss.ts new file mode 100644 index 000000000000..edc72e6a0809 --- /dev/null +++ b/apps/meteor/server/models/BannersDismiss.ts @@ -0,0 +1,7 @@ +import { registerModel } from '@rocket.chat/models'; + +import { trashCollection } from '../database/trash'; +import { db } from '../database/utils'; +import { BannersDismissRaw } from './raw/BannersDismiss'; + +registerModel('IBannersDismissModel', new BannersDismissRaw(db, trashCollection)); diff --git a/apps/meteor/server/models/CredentialTokens.ts b/apps/meteor/server/models/CredentialTokens.ts new file mode 100644 index 000000000000..9490618e72be --- /dev/null +++ b/apps/meteor/server/models/CredentialTokens.ts @@ -0,0 +1,7 @@ +import { registerModel } from '@rocket.chat/models'; + +import { trashCollection } from '../database/trash'; +import { db } from '../database/utils'; +import { CredentialTokensRaw } from './raw/CredentialTokens'; + +registerModel('ICredentialTokensModel', new CredentialTokensRaw(db, trashCollection)); diff --git a/apps/meteor/server/models/CustomSounds.ts b/apps/meteor/server/models/CustomSounds.ts new file mode 100644 index 000000000000..0ed1a57e45fc --- /dev/null +++ b/apps/meteor/server/models/CustomSounds.ts @@ -0,0 +1,7 @@ +import { registerModel } from '@rocket.chat/models'; + +import { trashCollection } from '../database/trash'; +import { db } from '../database/utils'; +import { CustomSoundsRaw } from './raw/CustomSounds'; + +registerModel('ICustomSoundsModel', new CustomSoundsRaw(db, trashCollection)); diff --git a/apps/meteor/server/models/CustomUserStatus.ts b/apps/meteor/server/models/CustomUserStatus.ts new file mode 100644 index 000000000000..4f59e42f9dc8 --- /dev/null +++ b/apps/meteor/server/models/CustomUserStatus.ts @@ -0,0 +1,7 @@ +import { registerModel } from '@rocket.chat/models'; + +import { trashCollection } from '../database/trash'; +import { db } from '../database/utils'; +import { CustomUserStatusRaw } from './raw/CustomUserStatus'; + +registerModel('ICustomUserStatusModel', new CustomUserStatusRaw(db, trashCollection)); diff --git a/apps/meteor/server/models/EmailInbox.ts b/apps/meteor/server/models/EmailInbox.ts new file mode 100644 index 000000000000..b38dea52f473 --- /dev/null +++ b/apps/meteor/server/models/EmailInbox.ts @@ -0,0 +1,7 @@ +import { registerModel } from '@rocket.chat/models'; + +import { trashCollection } from '../database/trash'; +import { db } from '../database/utils'; +import { EmailInboxRaw } from './raw/EmailInbox'; + +registerModel('IEmailInboxModel', new EmailInboxRaw(db, trashCollection)); diff --git a/apps/meteor/server/models/EmailMessageHistory.ts b/apps/meteor/server/models/EmailMessageHistory.ts new file mode 100644 index 000000000000..b35f851a1aaf --- /dev/null +++ b/apps/meteor/server/models/EmailMessageHistory.ts @@ -0,0 +1,7 @@ +import { registerModel } from '@rocket.chat/models'; + +import { trashCollection } from '../database/trash'; +import { db } from '../database/utils'; +import { EmailMessageHistoryRaw } from './raw/EmailMessageHistory'; + +registerModel('IEmailMessageHistoryModel', new EmailMessageHistoryRaw(db, trashCollection)); diff --git a/apps/meteor/server/models/EmojiCustom.ts b/apps/meteor/server/models/EmojiCustom.ts new file mode 100644 index 000000000000..0f7e9d6ef62b --- /dev/null +++ b/apps/meteor/server/models/EmojiCustom.ts @@ -0,0 +1,7 @@ +import { registerModel } from '@rocket.chat/models'; + +import { trashCollection } from '../database/trash'; +import { db } from '../database/utils'; +import { EmojiCustomRaw } from './raw/EmojiCustom'; + +registerModel('IEmojiCustomModel', new EmojiCustomRaw(db, trashCollection)); diff --git a/apps/meteor/server/models/ExportOperations.ts b/apps/meteor/server/models/ExportOperations.ts new file mode 100644 index 000000000000..b18f1fef81f0 --- /dev/null +++ b/apps/meteor/server/models/ExportOperations.ts @@ -0,0 +1,7 @@ +import { registerModel } from '@rocket.chat/models'; + +import { trashCollection } from '../database/trash'; +import { db } from '../database/utils'; +import { ExportOperationsRaw } from './raw/ExportOperations'; + +registerModel('IExportOperationsModel', new ExportOperationsRaw(db, trashCollection)); diff --git a/apps/meteor/server/models/FederationKeys.ts b/apps/meteor/server/models/FederationKeys.ts new file mode 100644 index 000000000000..75fbfa539e0b --- /dev/null +++ b/apps/meteor/server/models/FederationKeys.ts @@ -0,0 +1,7 @@ +import { registerModel } from '@rocket.chat/models'; + +import { trashCollection } from '../database/trash'; +import { db } from '../database/utils'; +import { FederationKeysRaw } from './raw/FederationKeys'; + +registerModel('IFederationKeysModel', new FederationKeysRaw(db, trashCollection)); diff --git a/apps/meteor/server/models/FederationServers.ts b/apps/meteor/server/models/FederationServers.ts new file mode 100644 index 000000000000..7cff64271831 --- /dev/null +++ b/apps/meteor/server/models/FederationServers.ts @@ -0,0 +1,7 @@ +import { registerModel } from '@rocket.chat/models'; + +import { trashCollection } from '../database/trash'; +import { db } from '../database/utils'; +import { FederationServersRaw } from './raw/FederationServers'; + +registerModel('IFederationServersModel', new FederationServersRaw(db, trashCollection)); diff --git a/apps/meteor/server/models/ImportData.ts b/apps/meteor/server/models/ImportData.ts new file mode 100644 index 000000000000..1fbf15800e1c --- /dev/null +++ b/apps/meteor/server/models/ImportData.ts @@ -0,0 +1,7 @@ +import { registerModel } from '@rocket.chat/models'; + +import { trashCollection } from '../database/trash'; +import { db } from '../database/utils'; +import { ImportDataRaw } from './raw/ImportData'; + +registerModel('IImportDataModel', new ImportDataRaw(db, trashCollection)); diff --git a/apps/meteor/server/models/InstanceStatus.ts b/apps/meteor/server/models/InstanceStatus.ts new file mode 100644 index 000000000000..571a16e6bd85 --- /dev/null +++ b/apps/meteor/server/models/InstanceStatus.ts @@ -0,0 +1,6 @@ +import { registerModel } from '@rocket.chat/models'; + +import { db } from '../database/utils'; +import { InstanceStatusRaw } from './raw/InstanceStatus'; + +registerModel('IInstanceStatusModel', new InstanceStatusRaw(db)); diff --git a/apps/meteor/server/models/IntegrationHistory.ts b/apps/meteor/server/models/IntegrationHistory.ts new file mode 100644 index 000000000000..839d143a7cd7 --- /dev/null +++ b/apps/meteor/server/models/IntegrationHistory.ts @@ -0,0 +1,6 @@ +import { registerModel } from '@rocket.chat/models'; + +import { db } from '../database/utils'; +import { IntegrationHistoryRaw } from './raw/IntegrationHistory'; + +registerModel('IIntegrationHistoryModel', new IntegrationHistoryRaw(db)); diff --git a/apps/meteor/server/models/Integrations.ts b/apps/meteor/server/models/Integrations.ts new file mode 100644 index 000000000000..f1e122e82944 --- /dev/null +++ b/apps/meteor/server/models/Integrations.ts @@ -0,0 +1,7 @@ +import { registerModel } from '@rocket.chat/models'; + +import { trashCollection } from '../database/trash'; +import { db } from '../database/utils'; +import { IntegrationsRaw } from './raw/Integrations'; + +registerModel('IIntegrationsModel', new IntegrationsRaw(db, trashCollection)); diff --git a/apps/meteor/server/models/Invites.ts b/apps/meteor/server/models/Invites.ts new file mode 100644 index 000000000000..e321b39ed969 --- /dev/null +++ b/apps/meteor/server/models/Invites.ts @@ -0,0 +1,7 @@ +import { registerModel } from '@rocket.chat/models'; + +import { trashCollection } from '../database/trash'; +import { db } from '../database/utils'; +import { InvitesRaw } from './raw/Invites'; + +registerModel('IInvitesModel', new InvitesRaw(db, trashCollection)); diff --git a/apps/meteor/server/models/LivechatAgentActivity.ts b/apps/meteor/server/models/LivechatAgentActivity.ts new file mode 100644 index 000000000000..7ca58726e468 --- /dev/null +++ b/apps/meteor/server/models/LivechatAgentActivity.ts @@ -0,0 +1,7 @@ +import { registerModel } from '@rocket.chat/models'; + +import { trashCollection } from '../database/trash'; +import { db } from '../database/utils'; +import { LivechatAgentActivityRaw } from './raw/LivechatAgentActivity'; + +registerModel('ILivechatAgentActivityModel', new LivechatAgentActivityRaw(db, trashCollection)); diff --git a/apps/meteor/server/models/LivechatBusinessHours.ts b/apps/meteor/server/models/LivechatBusinessHours.ts new file mode 100644 index 000000000000..e6b8ac3f884f --- /dev/null +++ b/apps/meteor/server/models/LivechatBusinessHours.ts @@ -0,0 +1,7 @@ +import { registerModel } from '@rocket.chat/models'; + +import { trashCollection } from '../database/trash'; +import { db } from '../database/utils'; +import { LivechatBusinessHoursRaw } from './raw/LivechatBusinessHours'; + +registerModel('ILivechatBusinessHoursModel', new LivechatBusinessHoursRaw(db, trashCollection)); diff --git a/apps/meteor/server/models/LivechatCustomField.ts b/apps/meteor/server/models/LivechatCustomField.ts new file mode 100644 index 000000000000..4cf738ab20cf --- /dev/null +++ b/apps/meteor/server/models/LivechatCustomField.ts @@ -0,0 +1,7 @@ +import { registerModel } from '@rocket.chat/models'; + +import { trashCollection } from '../database/trash'; +import { db } from '../database/utils'; +import { LivechatCustomFieldRaw } from './raw/LivechatCustomField'; + +registerModel('ILivechatCustomFieldModel', new LivechatCustomFieldRaw(db, trashCollection)); diff --git a/apps/meteor/server/models/LivechatDepartment.ts b/apps/meteor/server/models/LivechatDepartment.ts new file mode 100644 index 000000000000..3e1eec2a945d --- /dev/null +++ b/apps/meteor/server/models/LivechatDepartment.ts @@ -0,0 +1,7 @@ +import { registerModel } from '@rocket.chat/models'; + +import { trashCollection } from '../database/trash'; +import { db } from '../database/utils'; +import { LivechatDepartmentRaw } from './raw/LivechatDepartment'; + +registerModel('ILivechatDepartmentModel', new LivechatDepartmentRaw(db, trashCollection)); diff --git a/apps/meteor/server/models/LivechatDepartmentAgents.ts b/apps/meteor/server/models/LivechatDepartmentAgents.ts new file mode 100644 index 000000000000..26b79260c81f --- /dev/null +++ b/apps/meteor/server/models/LivechatDepartmentAgents.ts @@ -0,0 +1,7 @@ +import { registerModel } from '@rocket.chat/models'; + +import { trashCollection } from '../database/trash'; +import { db } from '../database/utils'; +import { LivechatDepartmentAgentsRaw } from './raw/LivechatDepartmentAgents'; + +registerModel('ILivechatDepartmentAgentsModel', new LivechatDepartmentAgentsRaw(db, trashCollection)); diff --git a/apps/meteor/server/models/LivechatInquiry.ts b/apps/meteor/server/models/LivechatInquiry.ts new file mode 100644 index 000000000000..cb14c207027b --- /dev/null +++ b/apps/meteor/server/models/LivechatInquiry.ts @@ -0,0 +1,7 @@ +import { registerModel } from '@rocket.chat/models'; + +import { trashCollection } from '../database/trash'; +import { db } from '../database/utils'; +import { LivechatInquiryRaw } from './raw/LivechatInquiry'; + +registerModel('ILivechatInquiryModel', new LivechatInquiryRaw(db, trashCollection)); diff --git a/apps/meteor/server/models/LivechatRooms.ts b/apps/meteor/server/models/LivechatRooms.ts new file mode 100644 index 000000000000..0e84584c0d88 --- /dev/null +++ b/apps/meteor/server/models/LivechatRooms.ts @@ -0,0 +1,7 @@ +import { registerModel } from '@rocket.chat/models'; + +import { trashCollection } from '../database/trash'; +import { db } from '../database/utils'; +import { LivechatRoomsRaw } from './raw/LivechatRooms'; + +registerModel('ILivechatRoomsModel', new LivechatRoomsRaw(db, trashCollection)); diff --git a/apps/meteor/server/models/LivechatTrigger.ts b/apps/meteor/server/models/LivechatTrigger.ts new file mode 100644 index 000000000000..bd7188e38eca --- /dev/null +++ b/apps/meteor/server/models/LivechatTrigger.ts @@ -0,0 +1,7 @@ +import { registerModel } from '@rocket.chat/models'; + +import { trashCollection } from '../database/trash'; +import { db } from '../database/utils'; +import { LivechatTriggerRaw } from './raw/LivechatTrigger'; + +registerModel('ILivechatTriggerModel', new LivechatTriggerRaw(db, trashCollection)); diff --git a/apps/meteor/server/models/LivechatVisitors.ts b/apps/meteor/server/models/LivechatVisitors.ts new file mode 100644 index 000000000000..b3402f448d63 --- /dev/null +++ b/apps/meteor/server/models/LivechatVisitors.ts @@ -0,0 +1,7 @@ +import { registerModel } from '@rocket.chat/models'; + +import { trashCollection } from '../database/trash'; +import { db } from '../database/utils'; +import { LivechatVisitorsRaw } from './raw/LivechatVisitors'; + +registerModel('ILivechatVisitorsModel', new LivechatVisitorsRaw(db, trashCollection)); diff --git a/apps/meteor/server/models/LoginServiceConfiguration.ts b/apps/meteor/server/models/LoginServiceConfiguration.ts new file mode 100644 index 000000000000..ba403ab60daa --- /dev/null +++ b/apps/meteor/server/models/LoginServiceConfiguration.ts @@ -0,0 +1,7 @@ +import { registerModel } from '@rocket.chat/models'; + +import { trashCollection } from '../database/trash'; +import { db } from '../database/utils'; +import { LoginServiceConfigurationRaw } from './raw/LoginServiceConfiguration'; + +registerModel('ILoginServiceConfigurationModel', new LoginServiceConfigurationRaw(db, trashCollection)); diff --git a/apps/meteor/server/models/Messages.ts b/apps/meteor/server/models/Messages.ts new file mode 100644 index 000000000000..e9de00514627 --- /dev/null +++ b/apps/meteor/server/models/Messages.ts @@ -0,0 +1,7 @@ +import { registerModel } from '@rocket.chat/models'; + +import { trashCollection } from '../database/trash'; +import { db } from '../database/utils'; +import { MessagesRaw } from './raw/Messages'; + +registerModel('IMessagesModel', new MessagesRaw(db, trashCollection)); diff --git a/apps/meteor/server/models/NotificationQueue.ts b/apps/meteor/server/models/NotificationQueue.ts new file mode 100644 index 000000000000..48d5ee469a80 --- /dev/null +++ b/apps/meteor/server/models/NotificationQueue.ts @@ -0,0 +1,7 @@ +import { registerModel } from '@rocket.chat/models'; + +import { trashCollection } from '../database/trash'; +import { db } from '../database/utils'; +import { NotificationQueueRaw } from './raw/NotificationQueue'; + +registerModel('INotificationQueueModel', new NotificationQueueRaw(db, trashCollection)); diff --git a/apps/meteor/server/models/Nps.ts b/apps/meteor/server/models/Nps.ts new file mode 100644 index 000000000000..2b4ba1f6bc18 --- /dev/null +++ b/apps/meteor/server/models/Nps.ts @@ -0,0 +1,7 @@ +import { registerModel } from '@rocket.chat/models'; + +import { trashCollection } from '../database/trash'; +import { db } from '../database/utils'; +import { NpsRaw } from './raw/Nps'; + +registerModel('INpsModel', new NpsRaw(db, trashCollection)); diff --git a/apps/meteor/server/models/NpsVote.ts b/apps/meteor/server/models/NpsVote.ts new file mode 100644 index 000000000000..560aa0c72245 --- /dev/null +++ b/apps/meteor/server/models/NpsVote.ts @@ -0,0 +1,7 @@ +import { registerModel } from '@rocket.chat/models'; + +import { trashCollection } from '../database/trash'; +import { db } from '../database/utils'; +import { NpsVoteRaw } from './raw/NpsVote'; + +registerModel('INpsVoteModel', new NpsVoteRaw(db, trashCollection)); diff --git a/apps/meteor/server/models/OAuthApps.ts b/apps/meteor/server/models/OAuthApps.ts new file mode 100644 index 000000000000..9c486aa2cfc8 --- /dev/null +++ b/apps/meteor/server/models/OAuthApps.ts @@ -0,0 +1,7 @@ +import { registerModel } from '@rocket.chat/models'; + +import { trashCollection } from '../database/trash'; +import { db } from '../database/utils'; +import { OAuthAppsRaw } from './raw/OAuthApps'; + +registerModel('IOAuthAppsModel', new OAuthAppsRaw(db, trashCollection)); diff --git a/apps/meteor/server/models/OEmbedCache.ts b/apps/meteor/server/models/OEmbedCache.ts new file mode 100644 index 000000000000..ee8de8bd6294 --- /dev/null +++ b/apps/meteor/server/models/OEmbedCache.ts @@ -0,0 +1,7 @@ +import { registerModel } from '@rocket.chat/models'; + +import { trashCollection } from '../database/trash'; +import { db } from '../database/utils'; +import { OEmbedCacheRaw } from './raw/OEmbedCache'; + +registerModel('IOEmbedCacheModel', new OEmbedCacheRaw(db, trashCollection)); diff --git a/apps/meteor/server/models/OmnichannelQueue.ts b/apps/meteor/server/models/OmnichannelQueue.ts new file mode 100644 index 000000000000..9321b2bd6fa4 --- /dev/null +++ b/apps/meteor/server/models/OmnichannelQueue.ts @@ -0,0 +1,7 @@ +import { registerModel } from '@rocket.chat/models'; + +import { trashCollection } from '../database/trash'; +import { db } from '../database/utils'; +import { OmnichannelQueueRaw } from './raw/OmnichannelQueue'; + +registerModel('IOmnichannelQueueModel', new OmnichannelQueueRaw(db, trashCollection)); diff --git a/apps/meteor/server/models/PbxEvents.ts b/apps/meteor/server/models/PbxEvents.ts new file mode 100644 index 000000000000..8a260d4ec734 --- /dev/null +++ b/apps/meteor/server/models/PbxEvents.ts @@ -0,0 +1,7 @@ +import { registerModel } from '@rocket.chat/models'; + +import { trashCollection } from '../database/trash'; +import { db } from '../database/utils'; +import { PbxEventsRaw } from './raw/PbxEvents'; + +registerModel('IPbxEventsModel', new PbxEventsRaw(db, trashCollection)); diff --git a/apps/meteor/server/models/Permissions.ts b/apps/meteor/server/models/Permissions.ts new file mode 100644 index 000000000000..edbf68dbfc59 --- /dev/null +++ b/apps/meteor/server/models/Permissions.ts @@ -0,0 +1,7 @@ +import { registerModel } from '@rocket.chat/models'; + +import { trashCollection } from '../database/trash'; +import { db } from '../database/utils'; +import { PermissionsRaw } from './raw/Permissions'; + +registerModel('IPermissionsModel', new PermissionsRaw(db, trashCollection)); diff --git a/apps/meteor/server/models/ReadReceipts.ts b/apps/meteor/server/models/ReadReceipts.ts new file mode 100644 index 000000000000..c17f1013e8f4 --- /dev/null +++ b/apps/meteor/server/models/ReadReceipts.ts @@ -0,0 +1,7 @@ +import { registerModel } from '@rocket.chat/models'; + +import { trashCollection } from '../database/trash'; +import { db } from '../database/utils'; +import { ReadReceiptsRaw } from './raw/ReadReceipts'; + +registerModel('IReadReceiptsModel', new ReadReceiptsRaw(db, trashCollection)); diff --git a/apps/meteor/server/models/Reports.ts b/apps/meteor/server/models/Reports.ts new file mode 100644 index 000000000000..536bb3d50e59 --- /dev/null +++ b/apps/meteor/server/models/Reports.ts @@ -0,0 +1,7 @@ +import { registerModel } from '@rocket.chat/models'; + +import { trashCollection } from '../database/trash'; +import { db } from '../database/utils'; +import { ReportsRaw } from './raw/Reports'; + +registerModel('IReportsModel', new ReportsRaw(db, trashCollection)); diff --git a/apps/meteor/server/models/Roles.ts b/apps/meteor/server/models/Roles.ts new file mode 100644 index 000000000000..f4f924b5acca --- /dev/null +++ b/apps/meteor/server/models/Roles.ts @@ -0,0 +1,7 @@ +import { registerModel } from '@rocket.chat/models'; + +import { trashCollection } from '../database/trash'; +import { db } from '../database/utils'; +import { RolesRaw } from './raw/Roles'; + +registerModel('IRolesModel', new RolesRaw(db, trashCollection)); diff --git a/apps/meteor/server/models/Rooms.ts b/apps/meteor/server/models/Rooms.ts new file mode 100644 index 000000000000..59d4ccc9f2c4 --- /dev/null +++ b/apps/meteor/server/models/Rooms.ts @@ -0,0 +1,7 @@ +import { registerModel } from '@rocket.chat/models'; + +import { trashCollection } from '../database/trash'; +import { db } from '../database/utils'; +import { RoomsRaw } from './raw/Rooms'; + +registerModel('IRoomsModel', new RoomsRaw(db, trashCollection)); diff --git a/apps/meteor/server/models/ServerEvents.ts b/apps/meteor/server/models/ServerEvents.ts new file mode 100644 index 000000000000..7b2308b981fe --- /dev/null +++ b/apps/meteor/server/models/ServerEvents.ts @@ -0,0 +1,7 @@ +import { registerModel } from '@rocket.chat/models'; + +import { trashCollection } from '../database/trash'; +import { db } from '../database/utils'; +import { ServerEventsRaw } from './raw/ServerEvents'; + +registerModel('IServerEventsModel', new ServerEventsRaw(db, trashCollection)); diff --git a/apps/meteor/server/models/Sessions.ts b/apps/meteor/server/models/Sessions.ts new file mode 100644 index 000000000000..7f46a8a71aa6 --- /dev/null +++ b/apps/meteor/server/models/Sessions.ts @@ -0,0 +1,7 @@ +import { registerModel } from '@rocket.chat/models'; + +import { trashCollection } from '../database/trash'; +import { db } from '../database/utils'; +import { SessionsRaw } from './raw/Sessions'; + +registerModel('ISessionsModel', new SessionsRaw(db, trashCollection)); diff --git a/apps/meteor/server/models/Settings.ts b/apps/meteor/server/models/Settings.ts new file mode 100644 index 000000000000..bd14012e1f6a --- /dev/null +++ b/apps/meteor/server/models/Settings.ts @@ -0,0 +1,7 @@ +import { registerModel } from '@rocket.chat/models'; + +import { trashCollection } from '../database/trash'; +import { db } from '../database/utils'; +import { SettingsRaw } from './raw/Settings'; + +registerModel('ISettingsModel', new SettingsRaw(db, trashCollection)); diff --git a/apps/meteor/server/models/SmarshHistory.ts b/apps/meteor/server/models/SmarshHistory.ts new file mode 100644 index 000000000000..17ffc8b6da3b --- /dev/null +++ b/apps/meteor/server/models/SmarshHistory.ts @@ -0,0 +1,7 @@ +import { registerModel } from '@rocket.chat/models'; + +import { trashCollection } from '../database/trash'; +import { db } from '../database/utils'; +import { SmarshHistoryRaw } from './raw/SmarshHistory'; + +registerModel('ISmarshHistoryModel', new SmarshHistoryRaw(db, trashCollection)); diff --git a/apps/meteor/server/models/Statistics.ts b/apps/meteor/server/models/Statistics.ts new file mode 100644 index 000000000000..6a2a3ce947a3 --- /dev/null +++ b/apps/meteor/server/models/Statistics.ts @@ -0,0 +1,7 @@ +import { registerModel } from '@rocket.chat/models'; + +import { trashCollection } from '../database/trash'; +import { db } from '../database/utils'; +import { StatisticsRaw } from './raw/Statistics'; + +registerModel('IStatisticsModel', new StatisticsRaw(db, trashCollection)); diff --git a/apps/meteor/server/models/Subscriptions.ts b/apps/meteor/server/models/Subscriptions.ts new file mode 100644 index 000000000000..36a8d75ad49d --- /dev/null +++ b/apps/meteor/server/models/Subscriptions.ts @@ -0,0 +1,7 @@ +import { registerModel } from '@rocket.chat/models'; + +import { trashCollection } from '../database/trash'; +import { db } from '../database/utils'; +import { SubscriptionsRaw } from './raw/Subscriptions'; + +registerModel('ISubscriptionsModel', new SubscriptionsRaw(db, trashCollection)); diff --git a/apps/meteor/server/models/Team.ts b/apps/meteor/server/models/Team.ts new file mode 100644 index 000000000000..2e01d1cf2162 --- /dev/null +++ b/apps/meteor/server/models/Team.ts @@ -0,0 +1,7 @@ +import { registerModel } from '@rocket.chat/models'; + +import { trashCollection } from '../database/trash'; +import { db } from '../database/utils'; +import { TeamRaw } from './raw/Team'; + +registerModel('ITeamModel', new TeamRaw(db, trashCollection)); diff --git a/apps/meteor/server/models/TeamMember.ts b/apps/meteor/server/models/TeamMember.ts new file mode 100644 index 000000000000..6152e52fb1b8 --- /dev/null +++ b/apps/meteor/server/models/TeamMember.ts @@ -0,0 +1,7 @@ +import { registerModel } from '@rocket.chat/models'; + +import { trashCollection } from '../database/trash'; +import { db } from '../database/utils'; +import { TeamMemberRaw } from './raw/TeamMember'; + +registerModel('ITeamMemberModel', new TeamMemberRaw(db, trashCollection)); diff --git a/apps/meteor/server/models/Uploads.ts b/apps/meteor/server/models/Uploads.ts new file mode 100644 index 000000000000..a4473168c4a3 --- /dev/null +++ b/apps/meteor/server/models/Uploads.ts @@ -0,0 +1,7 @@ +import { registerModel } from '@rocket.chat/models'; + +import { trashCollection } from '../database/trash'; +import { db } from '../database/utils'; +import { UploadsRaw } from './raw/Uploads'; + +registerModel('IUploadsModel', new UploadsRaw(db, trashCollection)); diff --git a/apps/meteor/server/models/UserDataFiles.ts b/apps/meteor/server/models/UserDataFiles.ts new file mode 100644 index 000000000000..357b85773dc2 --- /dev/null +++ b/apps/meteor/server/models/UserDataFiles.ts @@ -0,0 +1,7 @@ +import { registerModel } from '@rocket.chat/models'; + +import { trashCollection } from '../database/trash'; +import { db } from '../database/utils'; +import { UserDataFilesRaw } from './raw/UserDataFiles'; + +registerModel('IUserDataFilesModel', new UserDataFilesRaw(db, trashCollection)); diff --git a/apps/meteor/server/models/Users.ts b/apps/meteor/server/models/Users.ts new file mode 100644 index 000000000000..3f7231ea7a2b --- /dev/null +++ b/apps/meteor/server/models/Users.ts @@ -0,0 +1,7 @@ +import { registerModel } from '@rocket.chat/models'; + +import { trashCollection } from '../database/trash'; +import { db } from '../database/utils'; +import { UsersRaw } from './raw/Users'; + +registerModel('IUsersModel', new UsersRaw(db, trashCollection)); diff --git a/apps/meteor/server/models/UsersSessions.ts b/apps/meteor/server/models/UsersSessions.ts new file mode 100644 index 000000000000..d0bda4c5dc22 --- /dev/null +++ b/apps/meteor/server/models/UsersSessions.ts @@ -0,0 +1,7 @@ +import { registerModel } from '@rocket.chat/models'; + +import { trashCollection } from '../database/trash'; +import { db } from '../database/utils'; +import { UsersSessionsRaw } from './raw/UsersSessions'; + +registerModel('IUsersSessionsModel', new UsersSessionsRaw(db, trashCollection)); diff --git a/apps/meteor/server/models/VoipRoom.ts b/apps/meteor/server/models/VoipRoom.ts new file mode 100644 index 000000000000..e743b7185a92 --- /dev/null +++ b/apps/meteor/server/models/VoipRoom.ts @@ -0,0 +1,7 @@ +import { registerModel } from '@rocket.chat/models'; + +import { trashCollection } from '../database/trash'; +import { db } from '../database/utils'; +import { VoipRoomRaw } from './raw/VoipRoom'; + +registerModel('IVoipRoomModel', new VoipRoomRaw(db, trashCollection)); diff --git a/apps/meteor/server/models/WebdavAccounts.ts b/apps/meteor/server/models/WebdavAccounts.ts new file mode 100644 index 000000000000..ed9f0518c9c2 --- /dev/null +++ b/apps/meteor/server/models/WebdavAccounts.ts @@ -0,0 +1,7 @@ +import { registerModel } from '@rocket.chat/models'; + +import { trashCollection } from '../database/trash'; +import { db } from '../database/utils'; +import { WebdavAccountsRaw } from './raw/WebdavAccounts'; + +registerModel('IWebdavAccountsModel', new WebdavAccountsRaw(db, trashCollection)); diff --git a/apps/meteor/app/models/server/raw/Analytics.ts b/apps/meteor/server/models/raw/Analytics.ts similarity index 80% rename from apps/meteor/app/models/server/raw/Analytics.ts rename to apps/meteor/server/models/raw/Analytics.ts index bde3461b020f..649799eb6555 100644 --- a/apps/meteor/app/models/server/raw/Analytics.ts +++ b/apps/meteor/server/models/raw/Analytics.ts @@ -1,12 +1,19 @@ -import { Random } from 'meteor/random'; -import { AggregationCursor, Cursor, SortOptionObject, UpdateWriteOpResult } from 'mongodb'; import type { IAnalytic, IRoom } from '@rocket.chat/core-typings'; +import type { IAnalyticsModel } from '@rocket.chat/model-typings'; +import type { AggregationCursor, Cursor, Db, IndexSpecification, SortOptionObject, UpdateWriteOpResult } from 'mongodb'; +import { getCollectionName } from '@rocket.chat/models'; +import { Random } from 'meteor/random'; -import { BaseRaw, IndexSpecification } from './BaseRaw'; +import { BaseRaw } from './BaseRaw'; +import { readSecondaryPreferred } from '../../database/readSecondaryPreferred'; -type T = IAnalytic; +export class AnalyticsRaw extends BaseRaw implements IAnalyticsModel { + constructor(db: Db) { + super(db, getCollectionName('analytics'), undefined, { + collection: { readPreference: readSecondaryPreferred(db) }, + }); + } -export class AnalyticsRaw extends BaseRaw { protected modelIndexes(): IndexSpecification[] { return [{ key: { date: 1 } }, { key: { 'room._id': 1, 'date': 1 }, unique: true }]; } @@ -65,7 +72,7 @@ export class AnalyticsRaw extends BaseRaw { }: { start: IAnalytic['date']; end: IAnalytic['date']; - options?: { sort?: SortOptionObject; count?: number }; + options?: { sort?: SortOptionObject; count?: number }; }): AggregationCursor<{ _id: IAnalytic['date']; messages: number; @@ -126,7 +133,7 @@ export class AnalyticsRaw extends BaseRaw { }: { start: IAnalytic['date']; end: IAnalytic['date']; - options?: { sort?: SortOptionObject; count?: number }; + options?: { sort?: SortOptionObject; count?: number }; }): AggregationCursor<{ t: IRoom['t']; name: string; @@ -167,7 +174,7 @@ export class AnalyticsRaw extends BaseRaw { }: { start: IAnalytic['date']; end: IAnalytic['date']; - options?: { sort?: SortOptionObject; count?: number }; + options?: { sort?: SortOptionObject; count?: number }; }): AggregationCursor<{ _id: IAnalytic['date']; users: number; @@ -193,7 +200,7 @@ export class AnalyticsRaw extends BaseRaw { ]); } - findByTypeBeforeDate({ type, date }: { type: T['type']; date: T['date'] }): Cursor { + findByTypeBeforeDate({ type, date }: { type: IAnalytic['type']; date: IAnalytic['date'] }): Cursor { return this.find({ type, date: { $lte: date } }); } } diff --git a/apps/meteor/app/models/server/raw/Avatars.ts b/apps/meteor/server/models/raw/Avatars.ts similarity index 66% rename from apps/meteor/app/models/server/raw/Avatars.ts rename to apps/meteor/server/models/raw/Avatars.ts index ba1af66f7ef7..5212ceb65d5e 100644 --- a/apps/meteor/app/models/server/raw/Avatars.ts +++ b/apps/meteor/server/models/raw/Avatars.ts @@ -1,9 +1,15 @@ -import { DeleteWriteOpResultObject, UpdateWriteOpResult } from 'mongodb'; -import { IAvatar as T } from '@rocket.chat/core-typings'; +import type { IAvatar, RocketChatRecordDeleted } from '@rocket.chat/core-typings'; +import type { IAvatarsModel } from '@rocket.chat/model-typings'; +import type { Collection, Db, DeleteWriteOpResultObject, IndexSpecification, UpdateWriteOpResult } from 'mongodb'; +import { getCollectionName } from '@rocket.chat/models'; -import { BaseRaw, IndexSpecification } from './BaseRaw'; +import { BaseRaw } from './BaseRaw'; + +export class AvatarsRaw extends BaseRaw implements IAvatarsModel { + constructor(db: Db, trash?: Collection>) { + super(db, getCollectionName('avatars'), trash); + } -export class AvatarsRaw extends BaseRaw { protected modelIndexes(): IndexSpecification[] { return [ { key: { name: 1 }, sparse: true }, @@ -51,11 +57,11 @@ export class AvatarsRaw extends BaseRaw { return this.updateOne(filter, update); } - async findOneByName(name: string): Promise { + async findOneByName(name: string): Promise { return this.findOne({ name }); } - async findOneByRoomId(rid: string): Promise { + async findOneByRoomId(rid: string): Promise { return this.findOne({ rid }); } diff --git a/apps/meteor/app/models/server/raw/Banners.ts b/apps/meteor/server/models/raw/Banners.ts similarity index 64% rename from apps/meteor/app/models/server/raw/Banners.ts rename to apps/meteor/server/models/raw/Banners.ts index 04a90fb8e2e6..f20b438f1085 100644 --- a/apps/meteor/app/models/server/raw/Banners.ts +++ b/apps/meteor/server/models/raw/Banners.ts @@ -1,10 +1,24 @@ -import { Cursor, FindOneOptions, UpdateWriteOpResult, WithoutProjection, InsertOneWriteOpResult } from 'mongodb'; -import { BannerPlatform, IBanner } from '@rocket.chat/core-typings'; +import { BannerPlatform, IBanner, RocketChatRecordDeleted } from '@rocket.chat/core-typings'; +import type { IBannersModel } from '@rocket.chat/model-typings'; +import type { + Collection, + Cursor, + Db, + FindOneOptions, + IndexSpecification, + InsertOneWriteOpResult, + UpdateWriteOpResult, + WithoutProjection, +} from 'mongodb'; +import { getCollectionName } from '@rocket.chat/models'; -import { BaseRaw, IndexSpecification } from './BaseRaw'; +import { BaseRaw } from './BaseRaw'; + +export class BannersRaw extends BaseRaw implements IBannersModel { + constructor(db: Db, trash?: Collection>) { + super(db, getCollectionName('banner'), trash); + } -type T = IBanner; -export class BannersRaw extends BaseRaw { protected modelIndexes(): IndexSpecification[] { return [{ key: { platform: 1, startAt: 1, expireAt: 1 } }, { key: { platform: 1, startAt: 1, expireAt: 1, active: 1 } }]; } @@ -33,8 +47,8 @@ export class BannersRaw extends BaseRaw { roles: string[], platform: BannerPlatform, bannerId?: string, - options?: WithoutProjection>, - ): Cursor { + options?: WithoutProjection>, + ): Cursor { const today = new Date(); const query = { diff --git a/apps/meteor/app/models/server/raw/BannersDismiss.ts b/apps/meteor/server/models/raw/BannersDismiss.ts similarity index 59% rename from apps/meteor/app/models/server/raw/BannersDismiss.ts rename to apps/meteor/server/models/raw/BannersDismiss.ts index 98ac83a76f3b..1f46e508b5df 100644 --- a/apps/meteor/app/models/server/raw/BannersDismiss.ts +++ b/apps/meteor/server/models/raw/BannersDismiss.ts @@ -1,9 +1,15 @@ -import { Cursor, FindOneOptions, WithoutProjection } from 'mongodb'; -import type { IBannerDismiss } from '@rocket.chat/core-typings'; +import type { IBannerDismiss, RocketChatRecordDeleted } from '@rocket.chat/core-typings'; +import type { IBannersDismissModel } from '@rocket.chat/model-typings'; +import type { Collection, Cursor, Db, FindOneOptions, IndexSpecification, WithoutProjection } from 'mongodb'; +import { getCollectionName } from '@rocket.chat/models'; -import { BaseRaw, IndexSpecification } from './BaseRaw'; +import { BaseRaw } from './BaseRaw'; + +export class BannersDismissRaw extends BaseRaw implements IBannersDismissModel { + constructor(db: Db, trash?: Collection>) { + super(db, getCollectionName('banner_dismiss'), trash); + } -export class BannersDismissRaw extends BaseRaw { modelIndexes(): IndexSpecification[] { return [{ key: { userId: 1, bannerId: 1 } }]; } diff --git a/apps/meteor/app/models/server/raw/BaseRaw.ts b/apps/meteor/server/models/raw/BaseRaw.ts similarity index 84% rename from apps/meteor/app/models/server/raw/BaseRaw.ts rename to apps/meteor/server/models/raw/BaseRaw.ts index a1121f34cdb9..c01b6d156be9 100644 --- a/apps/meteor/app/models/server/raw/BaseRaw.ts +++ b/apps/meteor/server/models/raw/BaseRaw.ts @@ -1,8 +1,11 @@ import { + ChangeStream, Collection, CollectionInsertOneOptions, CommonOptions, Cursor, + Db, + DbCollectionOptions, DeleteWriteOpResultObject, FilterQuery, FindAndModifyWriteOpResultObject, @@ -12,7 +15,6 @@ import { InsertOneWriteOpResult, InsertWriteOpResult, ObjectID, - ObjectId, OptionalId, UpdateManyOptions, UpdateOneOptions, @@ -22,46 +24,10 @@ import { WithoutProjection, WriteOpResult, } from 'mongodb'; -import { IRocketChatRecord, RocketChatRecordDeleted } from '@rocket.chat/core-typings'; - -import { setUpdatedAt } from '../lib/setUpdatedAt'; - -export { IndexSpecification } from 'mongodb'; - -// [extracted from @types/mongo] TypeScript Omit (Exclude to be specific) does not work for objects with an "any" indexed type, and breaks discriminated unions -type EnhancedOmit = string | number extends keyof T - ? T // T has indexed type e.g. { _id: string; [k: string]: any; } or it is "any" - : T extends any - ? Pick> // discriminated unions - : never; - -// [extracted from @types/mongo] -type ExtractIdType = TSchema extends { _id: infer U } // user has defined a type for _id - ? {} extends U - ? Exclude - : unknown extends U - ? ObjectId - : U - : ObjectId; - -export type ModelOptionalId = EnhancedOmit & { _id?: ExtractIdType }; -// InsertionModel forces both _id and _updatedAt to be optional, regardless of how they are declared in T -export type InsertionModel = EnhancedOmit, '_updatedAt'> & { - _updatedAt?: Date; -}; - -export interface IBaseRaw { - col: Collection; -} +import type { IRocketChatRecord, RocketChatRecordDeleted } from '@rocket.chat/core-typings'; +import type { IBaseModel, DefaultFields, ResultFields, InsertionModel } from '@rocket.chat/model-typings'; -const baseName = 'rocketchat_'; - -type DefaultFields = Record | Record | void; -type ResultFields = Defaults extends void - ? Base - : Defaults[keyof Defaults] extends 1 - ? Pick - : Omit; +import { setUpdatedAt } from '../../../app/models/server/lib/setUpdatedAt'; const warnFields = process.env.NODE_ENV !== 'production' @@ -70,18 +36,20 @@ const warnFields = } : new Function(); -export class BaseRaw = undefined> implements IBaseRaw { +type ModelOptions = { + preventSetUpdatedAt?: boolean; + collection?: DbCollectionOptions; +}; + +export abstract class BaseRaw = undefined> implements IBaseModel { public readonly defaultFields: C; - protected name: string; + public readonly col: Collection; private preventSetUpdatedAt: boolean; - public readonly trash?: Collection>; - - constructor(public readonly col: Collection, trash?: Collection, options?: { preventSetUpdatedAt?: boolean }) { - this.name = this.col.collectionName.replace(baseName, ''); - this.trash = trash as unknown as Collection>; + constructor(private db: Db, protected name: string, protected trash?: Collection>, options?: ModelOptions) { + this.col = this.db.collection(name, options?.collection || {}); const indexes = this.modelIndexes(); if (indexes?.length) { @@ -311,7 +279,7 @@ export class BaseRaw = undefined> implements IBase trashFind

>( query: FilterQuery>, options: FindOneOptions

? RocketChatRecordDeleted : P>, - ): Cursor> | undefined { + ): Cursor> | undefined { if (!this.trash) { return undefined; } @@ -402,4 +370,8 @@ export class BaseRaw = undefined> implements IBase return trash.find(q, options as any); } + + watch(pipeline?: object[]): ChangeStream { + return this.col.watch(pipeline); + } } diff --git a/apps/meteor/server/models/raw/CredentialTokens.ts b/apps/meteor/server/models/raw/CredentialTokens.ts new file mode 100644 index 000000000000..78af22f0621a --- /dev/null +++ b/apps/meteor/server/models/raw/CredentialTokens.ts @@ -0,0 +1,37 @@ +import type { ICredentialToken, RocketChatRecordDeleted } from '@rocket.chat/core-typings'; +import type { ICredentialTokensModel } from '@rocket.chat/model-typings'; +import type { Collection, Db, IndexSpecification } from 'mongodb'; +import { getCollectionName } from '@rocket.chat/models'; + +import { BaseRaw } from './BaseRaw'; + +export class CredentialTokensRaw extends BaseRaw implements ICredentialTokensModel { + constructor(db: Db, trash?: Collection>) { + super(db, getCollectionName('credential_tokens'), trash); + } + + protected modelIndexes(): IndexSpecification[] { + return [{ key: { expireAt: 1 }, sparse: true, expireAfterSeconds: 0 }]; + } + + async create(_id: string, userInfo: ICredentialToken['userInfo']): Promise { + const validForMilliseconds = 60000; // Valid for 60 seconds + const token = { + _id, + userInfo, + expireAt: new Date(Date.now() + validForMilliseconds), + }; + + await this.insertOne(token); + return token; + } + + findOneNotExpiredById(_id: string): Promise { + const query = { + _id, + expireAt: { $gt: new Date() }, + }; + + return this.findOne(query); + } +} diff --git a/apps/meteor/server/models/raw/CustomSounds.ts b/apps/meteor/server/models/raw/CustomSounds.ts new file mode 100644 index 000000000000..8945168352b8 --- /dev/null +++ b/apps/meteor/server/models/raw/CustomSounds.ts @@ -0,0 +1,60 @@ +import type { ICustomSound, RocketChatRecordDeleted } from '@rocket.chat/core-typings'; +import type { ICustomSoundsModel } from '@rocket.chat/model-typings'; +import type { + Collection, + Cursor, + Db, + FindOneOptions, + IndexSpecification, + InsertOneWriteOpResult, + UpdateWriteOpResult, + WithId, + WithoutProjection, +} from 'mongodb'; +import { getCollectionName } from '@rocket.chat/models'; + +import { BaseRaw } from './BaseRaw'; + +export class CustomSoundsRaw extends BaseRaw implements ICustomSoundsModel { + constructor(db: Db, trash?: Collection>) { + super(db, getCollectionName('custom_sounds'), trash); + } + + protected modelIndexes(): IndexSpecification[] { + return [{ key: { name: 1 } }]; + } + + // find + findByName(name: string, options: WithoutProjection>): Cursor { + const query = { + name, + }; + + return this.find(query, options); + } + + findByNameExceptId(name: string, except: string, options: WithoutProjection>): Cursor { + const query = { + _id: { $nin: [except] }, + name, + }; + + return this.find(query, options); + } + + // update + setName(_id: string, name: string): Promise { + const update = { + $set: { + name, + }, + }; + + return this.updateOne({ _id }, update); + } + + // INSERT + create(data: ICustomSound): Promise>> { + return this.insertOne(data); + } +} diff --git a/apps/meteor/server/models/raw/CustomUserStatus.ts b/apps/meteor/server/models/raw/CustomUserStatus.ts new file mode 100644 index 000000000000..e561f8ddf498 --- /dev/null +++ b/apps/meteor/server/models/raw/CustomUserStatus.ts @@ -0,0 +1,82 @@ +import type { ICustomUserStatus, RocketChatRecordDeleted } from '@rocket.chat/core-typings'; +import type { ICustomUserStatusModel } from '@rocket.chat/model-typings'; +import { getCollectionName } from '@rocket.chat/models'; +import type { + Collection, + Cursor, + Db, + FindOneOptions, + IndexSpecification, + InsertOneWriteOpResult, + UpdateWriteOpResult, + WithId, + WithoutProjection, +} from 'mongodb'; + +import { BaseRaw } from './BaseRaw'; + +export class CustomUserStatusRaw extends BaseRaw implements ICustomUserStatusModel { + constructor(db: Db, trash?: Collection>) { + super(db, getCollectionName('custom_user_status'), trash); + } + + protected modelIndexes(): IndexSpecification[] { + return [{ key: { name: 1 } }]; + } + + // find one by name + + async findOneByName(name: string, options?: undefined): Promise; + + async findOneByName(name: string, options?: WithoutProjection>): Promise { + return options ? this.findOne({ name }, options) : this.findOne({ name }); + } + + // find + findByName(name: string, options: WithoutProjection>): Cursor { + const query = { + name, + }; + + return this.find(query, options); + } + + findByNameExceptId( + name: string, + except: string, + options: WithoutProjection>, + ): Cursor { + const query = { + _id: { $nin: [except] }, + name, + }; + + return this.find(query, options); + } + + // update + setName(_id: string, name: string): Promise { + const update = { + $set: { + name, + }, + }; + + return this.updateOne({ _id }, update); + } + + setStatusType(_id: string, statusType: string): Promise { + const update = { + $set: { + statusType, + }, + }; + + return this.updateOne({ _id }, update); + } + + // INSERT + create(data: ICustomUserStatus): Promise>> { + return this.insertOne(data); + } +} diff --git a/apps/meteor/server/models/raw/EmailInbox.ts b/apps/meteor/server/models/raw/EmailInbox.ts new file mode 100644 index 000000000000..f803b7b0d36c --- /dev/null +++ b/apps/meteor/server/models/raw/EmailInbox.ts @@ -0,0 +1,16 @@ +import type { IEmailInbox, RocketChatRecordDeleted } from '@rocket.chat/core-typings'; +import type { IEmailInboxModel } from '@rocket.chat/model-typings'; +import type { Collection, Db, IndexSpecification } from 'mongodb'; +import { getCollectionName } from '@rocket.chat/models'; + +import { BaseRaw } from './BaseRaw'; + +export class EmailInboxRaw extends BaseRaw implements IEmailInboxModel { + constructor(db: Db, trash?: Collection>) { + super(db, getCollectionName('email_inbox'), trash); + } + + protected modelIndexes(): IndexSpecification[] { + return [{ key: { email: 1 }, unique: true }]; + } +} diff --git a/apps/meteor/server/models/raw/EmailMessageHistory.ts b/apps/meteor/server/models/raw/EmailMessageHistory.ts new file mode 100644 index 000000000000..1c8baa7cd279 --- /dev/null +++ b/apps/meteor/server/models/raw/EmailMessageHistory.ts @@ -0,0 +1,24 @@ +import type { IEmailMessageHistory, RocketChatRecordDeleted } from '@rocket.chat/core-typings'; +import type { IEmailMessageHistoryModel } from '@rocket.chat/model-typings'; +import type { Collection, Db, InsertOneWriteOpResult, WithId, IndexSpecification } from 'mongodb'; +import { getCollectionName } from '@rocket.chat/models'; + +import { BaseRaw } from './BaseRaw'; + +export class EmailMessageHistoryRaw extends BaseRaw implements IEmailMessageHistoryModel { + constructor(db: Db, trash?: Collection>) { + super(db, getCollectionName('email_message_history'), trash); + } + + protected modelIndexes(): IndexSpecification[] { + return [{ key: { createdAt: 1 }, expireAfterSeconds: 60 * 60 * 24 }]; + } + + async create({ _id, email }: IEmailMessageHistory): Promise>> { + return this.insertOne({ + _id, + email, + createdAt: new Date(), + }); + } +} diff --git a/apps/meteor/app/models/server/raw/EmojiCustom.ts b/apps/meteor/server/models/raw/EmojiCustom.ts similarity index 58% rename from apps/meteor/app/models/server/raw/EmojiCustom.ts rename to apps/meteor/server/models/raw/EmojiCustom.ts index 0a8005cb379f..8b3e4a15819e 100644 --- a/apps/meteor/app/models/server/raw/EmojiCustom.ts +++ b/apps/meteor/server/models/raw/EmojiCustom.ts @@ -1,15 +1,31 @@ -import { Cursor, FindOneOptions, InsertOneWriteOpResult, UpdateWriteOpResult, WithId, WithoutProjection } from 'mongodb'; -import { IEmojiCustom as T } from '@rocket.chat/core-typings'; +import type { IEmojiCustom, RocketChatRecordDeleted } from '@rocket.chat/core-typings'; +import type { IEmojiCustomModel } from '@rocket.chat/model-typings'; +import type { + Collection, + Cursor, + Db, + FindOneOptions, + IndexSpecification, + InsertOneWriteOpResult, + UpdateWriteOpResult, + WithId, + WithoutProjection, +} from 'mongodb'; +import { getCollectionName } from '@rocket.chat/models'; -import { BaseRaw, IndexSpecification } from './BaseRaw'; +import { BaseRaw } from './BaseRaw'; + +export class EmojiCustomRaw extends BaseRaw implements IEmojiCustomModel { + constructor(db: Db, trash?: Collection>) { + super(db, getCollectionName('custom_emoji'), trash); + } -export class EmojiCustomRaw extends BaseRaw { protected modelIndexes(): IndexSpecification[] { return [{ key: { name: 1 } }, { key: { aliases: 1 } }, { key: { extension: 1 } }]; } // find - findByNameOrAlias(emojiName: string, options: WithoutProjection>): Cursor { + findByNameOrAlias(emojiName: string, options: WithoutProjection>): Cursor { let name = emojiName; if (typeof emojiName === 'string') { @@ -23,7 +39,7 @@ export class EmojiCustomRaw extends BaseRaw { return this.find(query, options); } - findByNameOrAliasExceptID(name: string, except: string, options: WithoutProjection>): Cursor { + findByNameOrAliasExceptID(name: string, except: string, options: WithoutProjection>): Cursor { const query = { _id: { $nin: [except] }, $or: [{ name }, { aliases: name }], @@ -64,7 +80,7 @@ export class EmojiCustomRaw extends BaseRaw { } // INSERT - create(data: T): Promise>> { + create(data: IEmojiCustom): Promise>> { return this.insertOne(data); } } diff --git a/apps/meteor/app/models/server/raw/ExportOperations.ts b/apps/meteor/server/models/raw/ExportOperations.ts similarity index 55% rename from apps/meteor/app/models/server/raw/ExportOperations.ts rename to apps/meteor/server/models/raw/ExportOperations.ts index 9ce76509fff3..37f8c67fa9cf 100644 --- a/apps/meteor/app/models/server/raw/ExportOperations.ts +++ b/apps/meteor/server/models/raw/ExportOperations.ts @@ -1,16 +1,20 @@ -import { Cursor, UpdateWriteOpResult } from 'mongodb'; -import type { IExportOperation } from '@rocket.chat/core-typings'; +import type { IExportOperation, RocketChatRecordDeleted } from '@rocket.chat/core-typings'; +import type { IExportOperationsModel } from '@rocket.chat/model-typings'; +import type { Collection, Cursor, Db, IndexSpecification, UpdateWriteOpResult } from 'mongodb'; +import { getCollectionName } from '@rocket.chat/models'; -import { BaseRaw, IndexSpecification } from './BaseRaw'; +import { BaseRaw } from './BaseRaw'; -type T = IExportOperation; +export class ExportOperationsRaw extends BaseRaw implements IExportOperationsModel { + constructor(db: Db, trash?: Collection>) { + super(db, getCollectionName('export_operations'), trash); + } -export class ExportOperationsRaw extends BaseRaw { protected modelIndexes(): IndexSpecification[] { return [{ key: { userId: 1 } }, { key: { status: 1 } }]; } - findOnePending(): Promise { + findOnePending(): Promise { const query = { status: { $nin: ['completed', 'skipped'] }, }; @@ -18,7 +22,7 @@ export class ExportOperationsRaw extends BaseRaw { return this.findOne(query); } - async create(data: T): Promise { + async create(data: IExportOperation): Promise { const result = await this.insertOne({ ...data, createdAt: new Date(), @@ -27,7 +31,7 @@ export class ExportOperationsRaw extends BaseRaw { return result.insertedId; } - findLastOperationByUser(userId: string, fullExport = false): Promise { + findLastOperationByUser(userId: string, fullExport = false): Promise { const query = { userId, fullExport, @@ -36,7 +40,7 @@ export class ExportOperationsRaw extends BaseRaw { return this.findOne(query, { sort: { createdAt: -1 } }); } - findAllPendingBeforeMyRequest(requestDay: Date): Cursor { + findAllPendingBeforeMyRequest(requestDay: Date): Cursor { const query = { status: { $nin: ['completed', 'skipped'] }, createdAt: { $lt: requestDay }, @@ -45,7 +49,7 @@ export class ExportOperationsRaw extends BaseRaw { return this.find(query); } - updateOperation(data: T): Promise { + updateOperation(data: IExportOperation): Promise { const update = { $set: { roomList: data.roomList, diff --git a/apps/meteor/app/models/server/raw/FederationKeys.ts b/apps/meteor/server/models/raw/FederationKeys.ts similarity index 66% rename from apps/meteor/app/models/server/raw/FederationKeys.ts rename to apps/meteor/server/models/raw/FederationKeys.ts index 3b2c505b09aa..ca84b36336f1 100644 --- a/apps/meteor/app/models/server/raw/FederationKeys.ts +++ b/apps/meteor/server/models/raw/FederationKeys.ts @@ -1,14 +1,17 @@ +import type { FederationKey, RocketChatRecordDeleted } from '@rocket.chat/core-typings'; +import type { IFederationKeysModel } from '@rocket.chat/model-typings'; +import type { Db, Collection } from 'mongodb'; +import { getCollectionName } from '@rocket.chat/models'; import NodeRSA from 'node-rsa'; import { BaseRaw } from './BaseRaw'; -type T = { - type: 'private' | 'public'; - key: string; -}; +export class FederationKeysRaw extends BaseRaw implements IFederationKeysModel { + constructor(db: Db, trash?: Collection>) { + super(db, getCollectionName('federation_keys'), trash); + } -export class FederationKeysRaw extends BaseRaw { - async getKey(type: T['type']): Promise { + async getKey(type: FederationKey['type']): Promise { const keyResource = await this.findOne({ type }); if (!keyResource) { @@ -18,7 +21,7 @@ export class FederationKeysRaw extends BaseRaw { return keyResource.key; } - loadKey(keyData: NodeRSA.Key, type: T['type']): NodeRSA { + loadKey(keyData: NodeRSA.Key, type: FederationKey['type']): NodeRSA { return new NodeRSA(keyData, `pkcs8-${type}-pem`); } diff --git a/apps/meteor/app/models/server/raw/FederationServers.ts b/apps/meteor/server/models/raw/FederationServers.ts similarity index 51% rename from apps/meteor/app/models/server/raw/FederationServers.ts rename to apps/meteor/server/models/raw/FederationServers.ts index 06af3db6e886..f8f332d60b37 100644 --- a/apps/meteor/app/models/server/raw/FederationServers.ts +++ b/apps/meteor/server/models/raw/FederationServers.ts @@ -1,10 +1,15 @@ -import { UpdateWriteOpResult } from 'mongodb'; -import type { IFederationServer } from '@rocket.chat/core-typings'; +import type { IFederationServer, RocketChatRecordDeleted } from '@rocket.chat/core-typings'; +import type { IFederationServersModel } from '@rocket.chat/model-typings'; +import type { Collection, Db, IndexSpecification, UpdateWriteOpResult } from 'mongodb'; +import { getCollectionName, Users } from '@rocket.chat/models'; -import { Users } from './index'; -import { BaseRaw, IndexSpecification } from './BaseRaw'; +import { BaseRaw } from './BaseRaw'; + +export class FederationServersRaw extends BaseRaw implements IFederationServersModel { + constructor(db: Db, trash?: Collection>) { + super(db, getCollectionName('federation_servers'), trash); + } -export class FederationServersRaw extends BaseRaw { protected modelIndexes(): IndexSpecification[] { return [{ key: { domain: 1 } }]; } diff --git a/apps/meteor/server/models/raw/ImportData.ts b/apps/meteor/server/models/raw/ImportData.ts new file mode 100644 index 000000000000..80c7b037ca15 --- /dev/null +++ b/apps/meteor/server/models/raw/ImportData.ts @@ -0,0 +1,30 @@ +import type { + IImportChannelRecord, + IImportMessageRecord, + IImportRecord, + IImportUserRecord, + RocketChatRecordDeleted, +} from '@rocket.chat/core-typings'; +import type { IImportDataModel } from '@rocket.chat/model-typings'; +import type { Collection, Cursor, Db } from 'mongodb'; +import { getCollectionName } from '@rocket.chat/models'; + +import { BaseRaw } from './BaseRaw'; + +export class ImportDataRaw extends BaseRaw implements IImportDataModel { + constructor(db: Db, trash?: Collection>) { + super(db, getCollectionName('import_data'), trash); + } + + getAllUsers(): Cursor { + return this.find({ dataType: 'user' }) as Cursor; + } + + getAllMessages(): Cursor { + return this.find({ dataType: 'message' }) as Cursor; + } + + getAllChannels(): Cursor { + return this.find({ dataType: 'channel' }) as Cursor; + } +} diff --git a/apps/meteor/server/models/raw/InstanceStatus.ts b/apps/meteor/server/models/raw/InstanceStatus.ts new file mode 100644 index 000000000000..0d3386d8ac94 --- /dev/null +++ b/apps/meteor/server/models/raw/InstanceStatus.ts @@ -0,0 +1,13 @@ +import type { IInstanceStatus } from '@rocket.chat/core-typings'; +import type { IInstanceStatusModel } from '@rocket.chat/model-typings'; +import { Db } from 'mongodb'; + +import { BaseRaw } from './BaseRaw'; + +export class InstanceStatusRaw extends BaseRaw implements IInstanceStatusModel { + constructor(db: Db) { + super(db, 'instances', undefined, { + preventSetUpdatedAt: true, + }); + } +} diff --git a/apps/meteor/app/models/server/raw/IntegrationHistory.ts b/apps/meteor/server/models/raw/IntegrationHistory.ts similarity index 67% rename from apps/meteor/app/models/server/raw/IntegrationHistory.ts rename to apps/meteor/server/models/raw/IntegrationHistory.ts index 1fcf4230586a..a062d23e2e45 100644 --- a/apps/meteor/app/models/server/raw/IntegrationHistory.ts +++ b/apps/meteor/server/models/raw/IntegrationHistory.ts @@ -1,8 +1,15 @@ import type { IIntegrationHistory } from '@rocket.chat/core-typings'; +import type { IIntegrationHistoryModel } from '@rocket.chat/model-typings'; +import type { Db, IndexSpecification } from 'mongodb'; +import { getCollectionName } from '@rocket.chat/models'; -import { BaseRaw, IndexSpecification } from './BaseRaw'; +import { BaseRaw } from './BaseRaw'; + +export class IntegrationHistoryRaw extends BaseRaw implements IIntegrationHistoryModel { + constructor(db: Db) { + super(db, getCollectionName('integration_history')); + } -export class IntegrationHistoryRaw extends BaseRaw { protected modelIndexes(): IndexSpecification[] { return [ { key: { 'integration._id': 1, 'integration._createdBy._id': 1 } }, diff --git a/apps/meteor/app/models/server/raw/Integrations.ts b/apps/meteor/server/models/raw/Integrations.ts similarity index 53% rename from apps/meteor/app/models/server/raw/Integrations.ts rename to apps/meteor/server/models/raw/Integrations.ts index 844d046ed28f..9cea6898aee3 100644 --- a/apps/meteor/app/models/server/raw/Integrations.ts +++ b/apps/meteor/server/models/raw/Integrations.ts @@ -1,8 +1,15 @@ -import type { IIntegration, IUser } from '@rocket.chat/core-typings'; +import type { IIntegration, IUser, RocketChatRecordDeleted } from '@rocket.chat/core-typings'; +import type { IBaseModel, IIntegrationsModel } from '@rocket.chat/model-typings'; +import type { Collection, Db, IndexSpecification } from 'mongodb'; +import { getCollectionName } from '@rocket.chat/models'; -import { BaseRaw, IndexSpecification } from './BaseRaw'; +import { BaseRaw } from './BaseRaw'; + +export class IntegrationsRaw extends BaseRaw implements IIntegrationsModel { + constructor(db: Db, trash?: Collection>) { + super(db, getCollectionName('integrations'), trash); + } -export class IntegrationsRaw extends BaseRaw { protected modelIndexes(): IndexSpecification[] { return [{ key: { type: 1 } }]; } @@ -11,7 +18,7 @@ export class IntegrationsRaw extends BaseRaw { return this.findOne({ url }); } - updateRoomName(oldRoomName: string, newRoomName: string): ReturnType['updateMany']> { + updateRoomName(oldRoomName: string, newRoomName: string): ReturnType['updateMany']> { const hashedOldRoomName = `#${oldRoomName}`; const hashedNewRoomName = `#${newRoomName}`; @@ -40,7 +47,7 @@ export class IntegrationsRaw extends BaseRaw { }); } - disableByUserId(userId: string): ReturnType['updateMany']> { + disableByUserId(userId: string): ReturnType['updateMany']> { return this.updateMany({ userId }, { $set: { enabled: false } }); } } diff --git a/apps/meteor/app/models/server/raw/Invites.ts b/apps/meteor/server/models/raw/Invites.ts similarity index 56% rename from apps/meteor/app/models/server/raw/Invites.ts rename to apps/meteor/server/models/raw/Invites.ts index ef55e009ca8e..92a40bcfa919 100644 --- a/apps/meteor/app/models/server/raw/Invites.ts +++ b/apps/meteor/server/models/raw/Invites.ts @@ -1,12 +1,16 @@ -import type { UpdateWriteOpResult } from 'mongodb'; -import type { IInvite } from '@rocket.chat/core-typings'; +import type { IInvite, RocketChatRecordDeleted } from '@rocket.chat/core-typings'; +import type { IInvitesModel } from '@rocket.chat/model-typings'; +import type { Collection, Db, UpdateWriteOpResult } from 'mongodb'; +import { getCollectionName } from '@rocket.chat/models'; import { BaseRaw } from './BaseRaw'; -type T = IInvite; +export class InvitesRaw extends BaseRaw implements IInvitesModel { + constructor(db: Db, trash?: Collection>) { + super(db, getCollectionName('invites'), trash); + } -export class InvitesRaw extends BaseRaw { - findOneByUserRoomMaxUsesAndExpiration(userId: string, rid: string, maxUses: number, daysToExpire: number): Promise { + findOneByUserRoomMaxUsesAndExpiration(userId: string, rid: string, maxUses: number, daysToExpire: number): Promise { return this.findOne({ rid, userId, diff --git a/apps/meteor/app/models/server/raw/LivechatAgentActivity.ts b/apps/meteor/server/models/raw/LivechatAgentActivity.ts similarity index 88% rename from apps/meteor/app/models/server/raw/LivechatAgentActivity.ts rename to apps/meteor/server/models/raw/LivechatAgentActivity.ts index 4e8aa305c281..1742cb3f064d 100644 --- a/apps/meteor/app/models/server/raw/LivechatAgentActivity.ts +++ b/apps/meteor/server/models/raw/LivechatAgentActivity.ts @@ -1,10 +1,24 @@ +import type { ILivechatAgentActivity, IServiceHistory, RocketChatRecordDeleted } from '@rocket.chat/core-typings'; +import type { ILivechatAgentActivityModel } from '@rocket.chat/model-typings'; +import type { + AggregationCursor, + Collection, + Cursor, + Db, + FindAndModifyWriteOpResultObject, + IndexSpecification, + UpdateWriteOpResult, +} from 'mongodb'; +import { getCollectionName } from '@rocket.chat/models'; import moment from 'moment'; -import type { ILivechatAgentActivity, IServiceHistory } from '@rocket.chat/core-typings'; -import type { AggregationCursor, Cursor, FindAndModifyWriteOpResultObject, IndexSpecification, UpdateWriteOpResult } from 'mongodb'; import { BaseRaw } from './BaseRaw'; -export class LivechatAgentActivityRaw extends BaseRaw { +export class LivechatAgentActivityRaw extends BaseRaw implements ILivechatAgentActivityModel { + constructor(db: Db, trash?: Collection>) { + super(db, getCollectionName('livechat_agent_activity'), trash); + } + modelIndexes(): IndexSpecification[] { return [{ key: { date: 1 } }, { key: { agentId: 1, date: 1 }, unique: true }]; } diff --git a/apps/meteor/app/models/server/raw/LivechatBusinessHours.ts b/apps/meteor/server/models/raw/LivechatBusinessHours.ts similarity index 87% rename from apps/meteor/app/models/server/raw/LivechatBusinessHours.ts rename to apps/meteor/server/models/raw/LivechatBusinessHours.ts index 161009c6bee2..f8a60fb244c4 100644 --- a/apps/meteor/app/models/server/raw/LivechatBusinessHours.ts +++ b/apps/meteor/server/models/raw/LivechatBusinessHours.ts @@ -1,5 +1,7 @@ -import { FindOneOptions, ObjectId, WithoutProjection } from 'mongodb'; -import { ILivechatBusinessHour, LivechatBusinessHourTypes } from '@rocket.chat/core-typings'; +import { ILivechatBusinessHour, LivechatBusinessHourTypes, RocketChatRecordDeleted } from '@rocket.chat/core-typings'; +import type { ILivechatBusinessHoursModel } from '@rocket.chat/model-typings'; +import { getCollectionName } from '@rocket.chat/models'; +import { Collection, Db, FindOneOptions, ObjectId, WithoutProjection } from 'mongodb'; import { BaseRaw } from './BaseRaw'; @@ -13,7 +15,11 @@ export interface IWorkHoursCronJobsWrapper { finish: IWorkHoursCronJobsItem[]; } -export class LivechatBusinessHoursRaw extends BaseRaw { +export class LivechatBusinessHoursRaw extends BaseRaw implements ILivechatBusinessHoursModel { + constructor(db: Db, trash?: Collection>) { + super(db, getCollectionName('livechat_business_hours'), trash); + } + async findOneDefaultBusinessHour(options?: undefined): Promise; async findOneDefaultBusinessHour( diff --git a/apps/meteor/server/models/raw/LivechatCustomField.ts b/apps/meteor/server/models/raw/LivechatCustomField.ts new file mode 100644 index 000000000000..36aab06b39f4 --- /dev/null +++ b/apps/meteor/server/models/raw/LivechatCustomField.ts @@ -0,0 +1,12 @@ +import type { ILivechatCustomField, RocketChatRecordDeleted } from '@rocket.chat/core-typings'; +import type { ILivechatCustomFieldModel } from '@rocket.chat/model-typings'; +import type { Db, Collection } from 'mongodb'; +import { getCollectionName } from '@rocket.chat/models'; + +import { BaseRaw } from './BaseRaw'; + +export class LivechatCustomFieldRaw extends BaseRaw implements ILivechatCustomFieldModel { + constructor(db: Db, trash?: Collection>) { + super(db, getCollectionName('livechat_custom_field'), trash); + } +} diff --git a/apps/meteor/app/models/server/raw/LivechatDepartment.ts b/apps/meteor/server/models/raw/LivechatDepartment.ts similarity index 82% rename from apps/meteor/app/models/server/raw/LivechatDepartment.ts rename to apps/meteor/server/models/raw/LivechatDepartment.ts index 8ef4fe5ac1c7..a4099ebd9fa6 100644 --- a/apps/meteor/app/models/server/raw/LivechatDepartment.ts +++ b/apps/meteor/server/models/raw/LivechatDepartment.ts @@ -1,10 +1,16 @@ +import type { ILivechatDepartmentRecord, RocketChatRecordDeleted } from '@rocket.chat/core-typings'; +import type { ILivechatDepartmentModel } from '@rocket.chat/model-typings'; +import type { Collection, Cursor, Db, FilterQuery, FindOneOptions, WriteOpResult } from 'mongodb'; +import { getCollectionName } from '@rocket.chat/models'; import { escapeRegExp } from '@rocket.chat/string-helpers'; -import { FindOneOptions, Cursor, FilterQuery, WriteOpResult } from 'mongodb'; -import type { ILivechatDepartmentRecord } from '@rocket.chat/core-typings'; import { BaseRaw } from './BaseRaw'; -export class LivechatDepartmentRaw extends BaseRaw { +export class LivechatDepartmentRaw extends BaseRaw implements ILivechatDepartmentModel { + constructor(db: Db, trash?: Collection>) { + super(db, getCollectionName('livechat_department'), trash); + } + findInIds(departmentsIds: string[], options: FindOneOptions): Cursor { const query = { _id: { $in: departmentsIds } }; return this.find(query, options); diff --git a/apps/meteor/app/models/server/raw/LivechatDepartmentAgents.ts b/apps/meteor/server/models/raw/LivechatDepartmentAgents.ts similarity index 84% rename from apps/meteor/app/models/server/raw/LivechatDepartmentAgents.ts rename to apps/meteor/server/models/raw/LivechatDepartmentAgents.ts index 0a5c56f90a23..357f35d69642 100644 --- a/apps/meteor/app/models/server/raw/LivechatDepartmentAgents.ts +++ b/apps/meteor/server/models/raw/LivechatDepartmentAgents.ts @@ -1,9 +1,15 @@ -import { Cursor, FilterQuery, WithoutProjection, FindOneOptions } from 'mongodb'; -import type { ILivechatDepartmentAgents } from '@rocket.chat/core-typings'; +import type { ILivechatDepartmentAgents, RocketChatRecordDeleted } from '@rocket.chat/core-typings'; +import type { ILivechatDepartmentAgentsModel } from '@rocket.chat/model-typings'; +import type { Collection, Cursor, Db, FilterQuery, FindOneOptions, WithoutProjection } from 'mongodb'; +import { getCollectionName } from '@rocket.chat/models'; import { BaseRaw } from './BaseRaw'; -export class LivechatDepartmentAgentsRaw extends BaseRaw { +export class LivechatDepartmentAgentsRaw extends BaseRaw implements ILivechatDepartmentAgentsModel { + constructor(db: Db, trash?: Collection>) { + super(db, getCollectionName('livechat_department_agents'), trash); + } + findUsersInQueue(usersList: string[]): Cursor; findUsersInQueue( diff --git a/apps/meteor/app/models/server/raw/LivechatInquiry.ts b/apps/meteor/server/models/raw/LivechatInquiry.ts similarity index 69% rename from apps/meteor/app/models/server/raw/LivechatInquiry.ts rename to apps/meteor/server/models/raw/LivechatInquiry.ts index 4a39b54673e3..eeabc0700d3c 100644 --- a/apps/meteor/app/models/server/raw/LivechatInquiry.ts +++ b/apps/meteor/server/models/raw/LivechatInquiry.ts @@ -1,9 +1,15 @@ -import { FindOneOptions, MongoDistinctPreferences, UpdateWriteOpResult } from 'mongodb'; -import { IMessage, ILivechatInquiryRecord, LivechatInquiryStatus } from '@rocket.chat/core-typings'; +import type { ILivechatInquiryModel } from '@rocket.chat/model-typings'; +import type { Collection, Db, FindOneOptions, MongoDistinctPreferences, UpdateWriteOpResult } from 'mongodb'; +import { ILivechatInquiryRecord, IMessage, LivechatInquiryStatus, RocketChatRecordDeleted } from '@rocket.chat/core-typings'; +import { getCollectionName } from '@rocket.chat/models'; import { BaseRaw } from './BaseRaw'; -export class LivechatInquiryRaw extends BaseRaw { +export class LivechatInquiryRaw extends BaseRaw implements ILivechatInquiryModel { + constructor(db: Db, trash?: Collection>) { + super(db, getCollectionName('livechat_inquiry'), trash); + } + findOneQueuedByRoomId(rid: string): Promise<(ILivechatInquiryRecord & { status: LivechatInquiryStatus.QUEUED }) | null> { const query = { rid, diff --git a/apps/meteor/app/models/server/raw/LivechatRooms.js b/apps/meteor/server/models/raw/LivechatRooms.js similarity index 99% rename from apps/meteor/app/models/server/raw/LivechatRooms.js rename to apps/meteor/server/models/raw/LivechatRooms.js index 7b1d9b6b74d6..a876302ed63a 100644 --- a/apps/meteor/app/models/server/raw/LivechatRooms.js +++ b/apps/meteor/server/models/raw/LivechatRooms.js @@ -1,7 +1,13 @@ +import { getCollectionName } from '@rocket.chat/models'; + import { BaseRaw } from './BaseRaw'; -import { getValue } from '../../../settings/server/raw'; +import { getValue } from '../../../app/settings/server/raw'; export class LivechatRoomsRaw extends BaseRaw { + constructor(db, trash) { + super(db, getCollectionName('room'), trash); + } + getQueueMetrics({ departmentId, agentId, includeOfflineAgents, options = {} }) { const match = { $match: { t: 'l', open: true, servedBy: { $exists: true } } }; const matchUsers = { $match: {} }; diff --git a/apps/meteor/server/models/raw/LivechatTrigger.ts b/apps/meteor/server/models/raw/LivechatTrigger.ts new file mode 100644 index 000000000000..d7de732bd3b2 --- /dev/null +++ b/apps/meteor/server/models/raw/LivechatTrigger.ts @@ -0,0 +1,24 @@ +import type { ILivechatTrigger, RocketChatRecordDeleted } from '@rocket.chat/core-typings'; +import type { ILivechatTriggerModel } from '@rocket.chat/model-typings'; +import type { Collection, Cursor, Db, IndexSpecification, UpdateWriteOpResult } from 'mongodb'; +import { getCollectionName } from '@rocket.chat/models'; + +import { BaseRaw } from './BaseRaw'; + +export class LivechatTriggerRaw extends BaseRaw implements ILivechatTriggerModel { + constructor(db: Db, trash?: Collection>) { + super(db, getCollectionName('livechat_trigger'), trash); + } + + protected modelIndexes(): IndexSpecification[] { + return [{ key: { enabled: 1 } }]; + } + + findEnabled(): Cursor { + return this.find({ enabled: true }); + } + + updateById(_id: string, data: ILivechatTrigger): Promise { + return this.updateOne({ _id }, { $set: data }); + } +} diff --git a/apps/meteor/server/models/raw/LivechatVisitors.ts b/apps/meteor/server/models/raw/LivechatVisitors.ts new file mode 100644 index 000000000000..ec6373d2bd13 --- /dev/null +++ b/apps/meteor/server/models/raw/LivechatVisitors.ts @@ -0,0 +1,334 @@ +import type { ILivechatVisitor, ISetting, RocketChatRecordDeleted } from '@rocket.chat/core-typings'; +import type { ILivechatVisitorsModel } from '@rocket.chat/model-typings'; +import type { + AggregationCursor, + Collection, + Cursor, + Db, + FilterQuery, + FindOneOptions, + UpdateWriteOpResult, + IndexSpecification, + DeleteWriteOpResultObject, + UpdateQuery, + WriteOpResult, +} from 'mongodb'; +import { getCollectionName, Settings } from '@rocket.chat/models'; +import { escapeRegExp } from '@rocket.chat/string-helpers'; + +import { BaseRaw } from './BaseRaw'; + +export class LivechatVisitorsRaw extends BaseRaw implements ILivechatVisitorsModel { + constructor(db: Db, trash?: Collection>) { + super(db, getCollectionName('livechat_visitor'), trash); + } + + protected modelIndexes(): IndexSpecification[] { + return [ + { key: { token: 1 } }, + { key: { 'phone.phoneNumber': 1 }, sparse: true }, + { key: { 'visitorEmails.address': 1 }, sparse: true }, + { key: { name: 1 }, sparse: true }, + { key: { username: 1 } }, + { key: { 'contactMananger.username': 1 }, sparse: true }, + ]; + } + + findOneVisitorByPhone(phone: string): Promise { + const query = { + 'phone.phoneNumber': phone, + }; + + return this.findOne(query); + } + + findOneGuestByEmailAddress(emailAddress: string): Promise { + const query = { + 'visitorEmails.address': String(emailAddress).toLowerCase(), + }; + + return this.findOne(query); + } + + /** + * Find visitors by _id + * @param {string} token - Visitor token + */ + findById(_id: string, options: FindOneOptions): Cursor { + const query = { + _id, + }; + + return this.find(query, options); + } + + findVisitorByToken(token: string): Cursor { + const query = { + token, + }; + + return this.find(query); + } + + getVisitorByToken(token: string, options: FindOneOptions): Promise { + const query = { + token, + }; + + return this.findOne(query, options); + } + + getVisitorsBetweenDate({ start, end, department }: { start: Date; end: Date; department: string }): Cursor { + const query = { + _updatedAt: { + $gte: new Date(start), + $lt: new Date(end), + }, + ...(department && department !== 'undefined' && { department }), + }; + + return this.find(query, { projection: { _id: 1 } }); + } + + async getNextVisitorUsername(): Promise { + const query = { + _id: 'Livechat_guest_count', + }; + + const update: UpdateQuery = { + $inc: { + // @ts-expect-error looks like the typings of ISetting.value conflict with this type of update + value: 1, + }, + }; + + const livechatCount = await Settings.findOneAndUpdate(query, update, { returnDocument: 'after' }); + + if (!livechatCount.value) { + throw new Error("Can't find Livechat_guest_count setting"); + } + + return `guest-${livechatCount.value.value}`; + } + + findByNameRegexWithExceptionsAndConditions

( + searchTerm: string, + exceptions: string[] = [], + conditions: FilterQuery = {}, + options: FindOneOptions

= {}, + ): AggregationCursor< + P & { + custom_name: string; + } + > { + if (!Array.isArray(exceptions)) { + exceptions = [exceptions]; + } + + const nameRegex = new RegExp(`^${escapeRegExp(searchTerm).trim()}`, 'i'); + + const match = { + $match: { + name: nameRegex, + _id: { + $nin: exceptions, + }, + ...conditions, + }, + }; + + const { projection, sort, skip, limit } = options; + const project = { + $project: { + // TODO: move this logic to client + // eslint-disable-next-line @typescript-eslint/camelcase + custom_name: { $concat: ['$username', ' - ', '$name'] }, + ...projection, + }, + }; + + const order = { $sort: sort || { name: 1 } }; + const params: Record[] = [match, order, skip && { $skip: skip }, limit && { $limit: limit }, project].filter( + Boolean, + ) as Record[]; + + return this.col.aggregate(params); + } + + /** + * Find visitors by their email or phone or username or name + * @return [{object}] List of Visitors from db + */ + findVisitorsByEmailOrPhoneOrNameOrUsername( + _emailOrPhoneOrNameOrUsername: string, + options: FindOneOptions, + ): Cursor { + const filter = new RegExp(_emailOrPhoneOrNameOrUsername, 'i'); + const query = { + $or: [ + { + 'visitorEmails.address': _emailOrPhoneOrNameOrUsername, + }, + { + 'phone.phoneNumber': _emailOrPhoneOrNameOrUsername, + }, + { + name: filter, + }, + { + username: filter, + }, + ], + }; + + return this.find(query, options); + } + + async updateLivechatDataByToken(token: string, key: string, value: unknown, overwrite = true): Promise { + const query = { + token, + }; + + if (!overwrite) { + const user = await this.getVisitorByToken(token, { projection: { livechatData: 1 } }); + if (user?.livechatData && typeof user.livechatData[key] !== 'undefined') { + return true; + } + } + + const update = { + $set: { + [`livechatData.${key}`]: value, + }, + }; + + return this.update(query, update); + } + + updateLastAgentByToken(token: string, lastAgent: ILivechatVisitor['lastAgent']): Promise { + const query = { + token, + }; + + const update = { + $set: { + lastAgent, + }, + }; + + return this.update(query, update); + } + + updateById(_id: string, update: UpdateQuery): Promise { + return this.update({ _id }, update); + } + + saveGuestById( + _id: string, + data: { name?: string; username?: string; email?: string; phone?: string; livechatData: { [k: string]: any } }, + ): Promise { + const setData: DeepWriteable['$set']> = {}; + const unsetData: DeepWriteable['$unset']> = {}; + + if (data.name) { + if (data.name?.trim()) { + setData.name = data.name.trim(); + } else { + unsetData.name = 1; + } + } + + if (data.email) { + if (data.email?.trim()) { + setData.visitorEmails = [{ address: data.email.trim() }]; + } else { + unsetData.visitorEmails = 1; + } + } + + if (data.phone) { + if (data.phone?.trim()) { + setData.phone = [{ phoneNumber: data.phone.trim() }]; + } else { + unsetData.phone = 1; + } + } + + if (data.livechatData) { + Object.keys(data.livechatData).forEach((key) => { + const value = data.livechatData[key]?.trim(); + if (value) { + setData[`livechatData.${key}`] = value; + } else { + unsetData[`livechatData.${key}`] = 1; + } + }); + } + + const update: UpdateQuery = { + ...(Object.keys(setData).length && { $set: setData as UpdateQuery['$set'] }), + ...(Object.keys(unsetData).length && { $unset: unsetData as UpdateQuery['$unset'] }), + }; + + if (!Object.keys(update).length) { + return Promise.resolve(true); + } + + return this.update({ _id }, update); + } + + removeDepartmentById(_id: string): Promise { + return this.update({ _id }, { $unset: { department: 1 } }); + } + + removeById(_id: string): Promise { + return this.removeById(_id); + } + + saveGuestEmailPhoneById(_id: string, emails: string[], phones: string[]): Promise { + const update: DeepWriteable> = { + $addToSet: {}, + }; + + const saveEmail = ([] as string[]) + .concat(emails) + .filter((email) => email?.trim()) + .map((email) => ({ address: email })); + + if (update.$addToSet && saveEmail.length > 0) { + update.$addToSet.visitorEmails = { $each: saveEmail }; + } + + const savePhone = ([] as string[]) + .concat(phones) + .filter((phone) => phone?.trim().replace(/[^\d]/g, '')) + .map((phone) => ({ phoneNumber: phone })); + + if (update.$addToSet && savePhone.length > 0) { + update.$addToSet.phone = { $each: savePhone }; + } + + if (!Object.keys(update).length) { + return Promise.resolve(); + } + + return this.update({ _id }, update as UpdateQuery); + } + + removeContactManagerByUsername(manager: string): Promise { + return this.updateMany( + { + contactManager: { + username: manager, + }, + }, + { + $unset: { + contactManager: true, + }, + }, + ); + } +} + +type DeepWriteable = { -readonly [P in keyof T]: DeepWriteable }; diff --git a/apps/meteor/server/models/raw/LoginServiceConfiguration.ts b/apps/meteor/server/models/raw/LoginServiceConfiguration.ts new file mode 100644 index 000000000000..37063ea7361a --- /dev/null +++ b/apps/meteor/server/models/raw/LoginServiceConfiguration.ts @@ -0,0 +1,11 @@ +import type { ILoginServiceConfiguration, RocketChatRecordDeleted } from '@rocket.chat/core-typings'; +import type { ILoginServiceConfigurationModel } from '@rocket.chat/model-typings'; +import { Collection, Db } from 'mongodb'; + +import { BaseRaw } from './BaseRaw'; + +export class LoginServiceConfigurationRaw extends BaseRaw implements ILoginServiceConfigurationModel { + constructor(db: Db, trash?: Collection>) { + super(db, 'meteor_accounts_loginServiceConfiguration', trash, { preventSetUpdatedAt: true }); + } +} diff --git a/apps/meteor/app/models/server/raw/Messages.ts b/apps/meteor/server/models/raw/Messages.ts similarity index 93% rename from apps/meteor/app/models/server/raw/Messages.ts rename to apps/meteor/server/models/raw/Messages.ts index ee81c791180a..dfa4ecfaa71b 100644 --- a/apps/meteor/app/models/server/raw/Messages.ts +++ b/apps/meteor/server/models/raw/Messages.ts @@ -1,19 +1,26 @@ -import { escapeRegExp } from '@rocket.chat/string-helpers'; -import type { IMessage, IRoom, IUser, MessageTypesValues, ILivechatDepartment } from '@rocket.chat/core-typings'; +import type { ILivechatDepartment, IMessage, IRoom, IUser, MessageTypesValues, RocketChatRecordDeleted } from '@rocket.chat/core-typings'; +import type { IMessagesModel } from '@rocket.chat/model-typings'; +import { getCollectionName } from '@rocket.chat/models'; import type { PaginatedRequest } from '@rocket.chat/rest-typings'; +import { escapeRegExp } from '@rocket.chat/string-helpers'; import type { AggregationCursor, + Collection, + CollectionAggregationOptions, Cursor, + Db, FilterQuery, FindOneOptions, WithoutProjection, - Collection, - CollectionAggregationOptions, } from 'mongodb'; import { BaseRaw } from './BaseRaw'; -export class MessagesRaw extends BaseRaw { +export class MessagesRaw extends BaseRaw implements IMessagesModel { + constructor(db: Db, trash?: Collection>) { + super(db, getCollectionName('message'), trash); + } + findVisibleByMentionAndRoomId( username: IUser['username'], rid: IRoom['_id'], diff --git a/apps/meteor/app/models/server/raw/NotificationQueue.ts b/apps/meteor/server/models/raw/NotificationQueue.ts similarity index 75% rename from apps/meteor/app/models/server/raw/NotificationQueue.ts rename to apps/meteor/server/models/raw/NotificationQueue.ts index 4297c1226566..44492c372b9b 100644 --- a/apps/meteor/app/models/server/raw/NotificationQueue.ts +++ b/apps/meteor/server/models/raw/NotificationQueue.ts @@ -1,9 +1,15 @@ -import { UpdateWriteOpResult } from 'mongodb'; -import type { INotification } from '@rocket.chat/core-typings'; +import type { INotification, RocketChatRecordDeleted } from '@rocket.chat/core-typings'; +import type { INotificationQueueModel } from '@rocket.chat/model-typings'; +import type { Collection, Db, IndexSpecification, UpdateWriteOpResult } from 'mongodb'; +import { getCollectionName } from '@rocket.chat/models'; -import { BaseRaw, IndexSpecification } from './BaseRaw'; +import { BaseRaw } from './BaseRaw'; + +export class NotificationQueueRaw extends BaseRaw implements INotificationQueueModel { + constructor(db: Db, trash?: Collection>) { + super(db, getCollectionName('notification_queue'), trash); + } -export class NotificationQueueRaw extends BaseRaw { protected modelIndexes(): IndexSpecification[] { return [ { key: { uid: 1 } }, diff --git a/apps/meteor/app/models/server/raw/Nps.ts b/apps/meteor/server/models/raw/Nps.ts similarity index 73% rename from apps/meteor/app/models/server/raw/Nps.ts rename to apps/meteor/server/models/raw/Nps.ts index 0703da39640f..699db86418b6 100644 --- a/apps/meteor/app/models/server/raw/Nps.ts +++ b/apps/meteor/server/models/raw/Nps.ts @@ -1,10 +1,16 @@ -import { UpdateWriteOpResult } from 'mongodb'; -import { INps, NPSStatus } from '@rocket.chat/core-typings'; +import type { INps, RocketChatRecordDeleted } from '@rocket.chat/core-typings'; +import type { INpsModel } from '@rocket.chat/model-typings'; +import type { Collection, Db, IndexSpecification, UpdateWriteOpResult } from 'mongodb'; +import { NPSStatus } from '@rocket.chat/core-typings'; +import { getCollectionName } from '@rocket.chat/models'; -import { BaseRaw, IndexSpecification } from './BaseRaw'; +import { BaseRaw } from './BaseRaw'; + +export class NpsRaw extends BaseRaw implements INpsModel { + constructor(db: Db, trash?: Collection>) { + super(db, getCollectionName('nps'), trash); + } -type T = INps; -export class NpsRaw extends BaseRaw { modelIndexes(): IndexSpecification[] { return [{ key: { status: 1, expireAt: 1 } }]; } diff --git a/apps/meteor/app/models/server/raw/NpsVote.ts b/apps/meteor/server/models/raw/NpsVote.ts similarity index 65% rename from apps/meteor/app/models/server/raw/NpsVote.ts rename to apps/meteor/server/models/raw/NpsVote.ts index 999b96311191..231d728a67bc 100644 --- a/apps/meteor/app/models/server/raw/NpsVote.ts +++ b/apps/meteor/server/models/raw/NpsVote.ts @@ -1,15 +1,21 @@ -import { ObjectId, Cursor, FindOneOptions, UpdateWriteOpResult, WithoutProjection } from 'mongodb'; -import { INpsVote, INpsVoteStatus } from '@rocket.chat/core-typings'; +import { INpsVote, INpsVoteStatus, RocketChatRecordDeleted } from '@rocket.chat/core-typings'; +import type { INpsVoteModel } from '@rocket.chat/model-typings'; +import type { Collection, Cursor, Db, FindOneOptions, IndexSpecification, UpdateWriteOpResult, WithoutProjection } from 'mongodb'; +import { getCollectionName } from '@rocket.chat/models'; +import { ObjectId } from 'mongodb'; -import { BaseRaw, IndexSpecification } from './BaseRaw'; +import { BaseRaw } from './BaseRaw'; + +export class NpsVoteRaw extends BaseRaw implements INpsVoteModel { + constructor(db: Db, trash?: Collection>) { + super(db, getCollectionName('nps_vote'), trash); + } -type T = INpsVote; -export class NpsVoteRaw extends BaseRaw { modelIndexes(): IndexSpecification[] { return [{ key: { npsId: 1, status: 1, sentAt: 1 } }, { key: { npsId: 1, identifier: 1 }, unique: true }]; } - findNotSentByNpsId(npsId: string, options?: WithoutProjection>): Cursor { + findNotSentByNpsId(npsId: string, options?: WithoutProjection>): Cursor { const query = { npsId, status: INpsVoteStatus.NEW, @@ -17,7 +23,7 @@ export class NpsVoteRaw extends BaseRaw { return this.col.find(query, options).sort({ ts: 1 }).limit(1000); } - findByNpsIdAndStatus(npsId: string, status: INpsVoteStatus, options?: WithoutProjection>): Cursor { + findByNpsIdAndStatus(npsId: string, status: INpsVoteStatus, options?: WithoutProjection>): Cursor { const query = { npsId, status, @@ -25,14 +31,14 @@ export class NpsVoteRaw extends BaseRaw { return this.col.find(query, options); } - findByNpsId(npsId: string, options?: WithoutProjection>): Cursor { + findByNpsId(npsId: string, options?: WithoutProjection>): Cursor { const query = { npsId, }; return this.col.find(query, options); } - save(vote: Omit): Promise { + save(vote: Omit): Promise { const { npsId, identifier } = vote; const query = { diff --git a/apps/meteor/server/models/raw/OAuthApps.ts b/apps/meteor/server/models/raw/OAuthApps.ts new file mode 100644 index 000000000000..56935c7e95ca --- /dev/null +++ b/apps/meteor/server/models/raw/OAuthApps.ts @@ -0,0 +1,19 @@ +import type { IOAuthApps, RocketChatRecordDeleted } from '@rocket.chat/core-typings'; +import type { IOAuthAppsModel } from '@rocket.chat/model-typings'; +import type { Db, Collection } from 'mongodb'; +import { getCollectionName } from '@rocket.chat/models'; + +import { BaseRaw } from './BaseRaw'; + +export class OAuthAppsRaw extends BaseRaw implements IOAuthAppsModel { + constructor(db: Db, trash?: Collection>) { + super(db, getCollectionName('oauth_apps'), trash); + } + + findOneAuthAppByIdOrClientId(props: { clientId: string } | { appId: string }): Promise { + return this.findOne({ + ...('appId' in props && { _id: props.appId }), + ...('clientId' in props && { _id: props.clientId }), + }); + } +} diff --git a/apps/meteor/server/models/raw/OEmbedCache.ts b/apps/meteor/server/models/raw/OEmbedCache.ts new file mode 100644 index 000000000000..3e148bbf7451 --- /dev/null +++ b/apps/meteor/server/models/raw/OEmbedCache.ts @@ -0,0 +1,35 @@ +import type { IOEmbedCache, RocketChatRecordDeleted } from '@rocket.chat/core-typings'; +import type { IOEmbedCacheModel } from '@rocket.chat/model-typings'; +import type { Collection, Db, DeleteWriteOpResultObject, IndexSpecification } from 'mongodb'; +import { getCollectionName } from '@rocket.chat/models'; + +import { BaseRaw } from './BaseRaw'; + +export class OEmbedCacheRaw extends BaseRaw implements IOEmbedCacheModel { + constructor(db: Db, trash?: Collection>) { + super(db, getCollectionName('oembed_cache'), trash); + } + + protected modelIndexes(): IndexSpecification[] { + return [{ key: { updatedAt: 1 } }]; + } + + async createWithIdAndData(_id: string, data: any): Promise { + const record = { + _id, + data, + updatedAt: new Date(), + }; + record._id = (await this.insertOne(record)).insertedId; + return record; + } + + removeAfterDate(date: Date): Promise { + const query = { + updatedAt: { + $lte: date, + }, + }; + return this.deleteMany(query); + } +} diff --git a/apps/meteor/app/models/server/raw/OmnichannelQueue.ts b/apps/meteor/server/models/raw/OmnichannelQueue.ts similarity index 68% rename from apps/meteor/app/models/server/raw/OmnichannelQueue.ts rename to apps/meteor/server/models/raw/OmnichannelQueue.ts index ef79f55baca0..1b02b093d1fd 100644 --- a/apps/meteor/app/models/server/raw/OmnichannelQueue.ts +++ b/apps/meteor/server/models/raw/OmnichannelQueue.ts @@ -1,11 +1,17 @@ -/* eslint-disable @typescript-eslint/explicit-function-return-type */ -import type { IOmnichannelQueueStatus } from '@rocket.chat/core-typings'; +import type { IOmnichannelQueueStatus, RocketChatRecordDeleted } from '@rocket.chat/core-typings'; +import type { IOmnichannelQueueModel } from '@rocket.chat/model-typings'; +import type { Collection, Db } from 'mongodb'; +import { getCollectionName } from '@rocket.chat/models'; import { BaseRaw } from './BaseRaw'; const UNIQUE_QUEUE_ID = 'queue'; -export class OmnichannelQueueRaw extends BaseRaw { - initQueue() { +export class OmnichannelQueueRaw extends BaseRaw implements IOmnichannelQueueModel { + constructor(db: Db, trash?: Collection>) { + super(db, getCollectionName('omnichannel_queue'), trash); + } + + initQueue(): any { return this.col.updateOne( { _id: UNIQUE_QUEUE_ID, @@ -25,7 +31,7 @@ export class OmnichannelQueueRaw extends BaseRaw { ); } - stopQueue() { + stopQueue(): any { return this.col.updateOne( { _id: UNIQUE_QUEUE_ID, @@ -39,7 +45,7 @@ export class OmnichannelQueueRaw extends BaseRaw { ); } - async lockQueue() { + async lockQueue(): Promise { const date = new Date(); const result = await this.col.findOneAndUpdate( { @@ -73,7 +79,7 @@ export class OmnichannelQueueRaw extends BaseRaw { return result.value; } - async unlockQueue() { + async unlockQueue(): Promise { const result = await this.col.findOneAndUpdate( { _id: UNIQUE_QUEUE_ID, diff --git a/apps/meteor/app/models/server/raw/PbxEvents.ts b/apps/meteor/server/models/raw/PbxEvents.ts similarity index 64% rename from apps/meteor/app/models/server/raw/PbxEvents.ts rename to apps/meteor/server/models/raw/PbxEvents.ts index 6b0c79a3e2a8..40f0a3f5ec12 100644 --- a/apps/meteor/app/models/server/raw/PbxEvents.ts +++ b/apps/meteor/server/models/raw/PbxEvents.ts @@ -1,9 +1,14 @@ -import { Cursor } from 'mongodb'; -import type { IPbxEvent } from '@rocket.chat/core-typings'; +import type { IPbxEvent, RocketChatRecordDeleted } from '@rocket.chat/core-typings'; +import type { IPbxEventsModel } from '@rocket.chat/model-typings'; +import type { Collection, Cursor, Db, IndexSpecification } from 'mongodb'; -import { BaseRaw, IndexSpecification } from './BaseRaw'; +import { BaseRaw } from './BaseRaw'; + +export class PbxEventsRaw extends BaseRaw implements IPbxEventsModel { + constructor(db: Db, trash?: Collection>) { + super(db, 'pbx_events', trash); + } -export class PbxEventsRaw extends BaseRaw { protected modelIndexes(): IndexSpecification[] { return [{ key: { uniqueId: 1 }, unique: true }]; } diff --git a/apps/meteor/app/models/server/raw/Permissions.ts b/apps/meteor/server/models/raw/Permissions.ts similarity index 71% rename from apps/meteor/app/models/server/raw/Permissions.ts rename to apps/meteor/server/models/raw/Permissions.ts index c7b1d772eb68..54259f5156b6 100644 --- a/apps/meteor/app/models/server/raw/Permissions.ts +++ b/apps/meteor/server/models/raw/Permissions.ts @@ -1,8 +1,15 @@ -import type { IPermission, IRole } from '@rocket.chat/core-typings'; +import type { IPermission, IRole, RocketChatRecordDeleted } from '@rocket.chat/core-typings'; +import type { IPermissionsModel } from '@rocket.chat/model-typings'; +import type { Collection, Db } from 'mongodb'; +import { getCollectionName } from '@rocket.chat/models'; import { BaseRaw } from './BaseRaw'; -export class PermissionsRaw extends BaseRaw { +export class PermissionsRaw extends BaseRaw implements IPermissionsModel { + constructor(db: Db, trash?: Collection>) { + super(db, getCollectionName('permissions'), trash); + } + async createOrUpdate(name: string, roles: IRole['_id'][]): Promise { const exists = await this.findOne>( { diff --git a/apps/meteor/server/models/raw/ReadReceipts.ts b/apps/meteor/server/models/raw/ReadReceipts.ts new file mode 100644 index 000000000000..0e3b76ba88c9 --- /dev/null +++ b/apps/meteor/server/models/raw/ReadReceipts.ts @@ -0,0 +1,20 @@ +import type { ReadReceipt, RocketChatRecordDeleted } from '@rocket.chat/core-typings'; +import type { IReadReceiptsModel } from '@rocket.chat/model-typings'; +import type { Collection, Cursor, Db, IndexSpecification } from 'mongodb'; +import { getCollectionName } from '@rocket.chat/models'; + +import { BaseRaw } from './BaseRaw'; + +export class ReadReceiptsRaw extends BaseRaw implements IReadReceiptsModel { + constructor(db: Db, trash?: Collection>) { + super(db, getCollectionName('read_receipts'), trash); + } + + protected modelIndexes(): IndexSpecification[] { + return [{ key: { roomId: 1, userId: 1, messageId: 1 }, unique: true }, { key: { messageId: 1 } }]; + } + + findByMessageId(messageId: string): Cursor { + return this.find({ messageId }); + } +} diff --git a/apps/meteor/server/models/raw/Reports.ts b/apps/meteor/server/models/raw/Reports.ts new file mode 100644 index 000000000000..2450fe6b8115 --- /dev/null +++ b/apps/meteor/server/models/raw/Reports.ts @@ -0,0 +1,22 @@ +import type { IMessage, IReport, RocketChatRecordDeleted } from '@rocket.chat/core-typings'; +import type { IReportsModel } from '@rocket.chat/model-typings'; +import type { Db, Collection } from 'mongodb'; +import { getCollectionName } from '@rocket.chat/models'; + +import { BaseRaw } from './BaseRaw'; + +export class ReportsRaw extends BaseRaw implements IReportsModel { + constructor(db: Db, trash?: Collection>) { + super(db, getCollectionName('reports'), trash); + } + + createWithMessageDescriptionAndUserId(message: IMessage, description: string, userId: string): ReturnType['insertOne']> { + const record: Pick = { + message, + description, + ts: new Date(), + userId, + }; + return this.insertOne(record); + } +} diff --git a/apps/meteor/app/models/server/raw/Roles.ts b/apps/meteor/server/models/raw/Roles.ts similarity index 84% rename from apps/meteor/app/models/server/raw/Roles.ts rename to apps/meteor/server/models/raw/Roles.ts index 0d774be584fc..7602883ebcd8 100644 --- a/apps/meteor/app/models/server/raw/Roles.ts +++ b/apps/meteor/server/models/raw/Roles.ts @@ -1,6 +1,10 @@ +import type { IRole, IRoom, IUser, RocketChatRecordDeleted } from '@rocket.chat/core-typings'; +import type { IRolesModel } from '@rocket.chat/model-typings'; +import { getCollectionName, Subscriptions, Users } from '@rocket.chat/models'; import type { Collection, Cursor, + Db, FilterQuery, FindOneOptions, InsertOneWriteOpResult, @@ -8,20 +12,12 @@ import type { WithId, WithoutProjection, } from 'mongodb'; -import type { IRole, IUser, IRoom } from '@rocket.chat/core-typings'; import { BaseRaw } from './BaseRaw'; -import { SubscriptionsRaw } from './Subscriptions'; -import { UsersRaw } from './Users'; -type ScopedModelRoles = { - Subscriptions: SubscriptionsRaw; - Users: UsersRaw; -}; - -export class RolesRaw extends BaseRaw { - constructor(public readonly col: Collection, private readonly models: ScopedModelRoles, trash?: Collection) { - super(col, trash); +export class RolesRaw extends BaseRaw implements IRolesModel { + constructor(db: Db, trash?: Collection>) { + super(db, getCollectionName('roles'), trash); } findByUpdatedDate(updatedAfterDate: Date, options?: FindOneOptions): Cursor { @@ -51,11 +47,11 @@ export class RolesRaw extends BaseRaw { } switch (role.scope) { case 'Subscriptions': - await this.models.Subscriptions.addRolesByUserId(userId, [role._id], scope); + await Subscriptions.addRolesByUserId(userId, [role._id], scope); break; case 'Users': default: - await this.models.Users.addRolesByUserId(userId, [role._id]); + await Users.addRolesByUserId(userId, [role._id]); } } return true; @@ -75,13 +71,13 @@ export class RolesRaw extends BaseRaw { switch (role.scope) { case 'Subscriptions': - if (await this.models.Subscriptions.isUserInRole(userId, roleId, scope)) { + if (await Subscriptions.isUserInRole(userId, roleId, scope)) { return true; } break; case 'Users': default: - if (await this.models.Users.isUserInRole(userId, roleId)) { + if (await Users.isUserInRole(userId, roleId)) { return true; } } @@ -103,11 +99,11 @@ export class RolesRaw extends BaseRaw { switch (role.scope) { case 'Subscriptions': - scope && (await this.models.Subscriptions.removeRolesByUserId(userId, [roleId], scope)); + scope && (await Subscriptions.removeRolesByUserId(userId, [roleId], scope)); break; case 'Users': default: - await this.models.Users.removeRolesByUserId(userId, [roleId]); + await Users.removeRolesByUserId(userId, [roleId]); } } return true; @@ -216,10 +212,10 @@ export class RolesRaw extends BaseRaw { switch (role.scope) { case 'Subscriptions': - return this.models.Subscriptions.findUsersInRoles([role._id], scope, options); + return Subscriptions.findUsersInRoles([role._id], scope, options); case 'Users': default: - return this.models.Users.findUsersInRoles([role._id], null, options); + return Users.findUsersInRoles([role._id], null, options); } } @@ -253,10 +249,10 @@ export class RolesRaw extends BaseRaw { switch (role.scope) { case 'Subscriptions': - return this.models.Subscriptions.isUserInRoleScope(uid, scope); + return Subscriptions.isUserInRoleScope(uid, scope); case 'Users': default: - return this.models.Users.isUserInRoleScope(uid); + return Users.isUserInRoleScope(uid); } } } diff --git a/apps/meteor/app/models/server/raw/Rooms.js b/apps/meteor/server/models/raw/Rooms.js similarity index 98% rename from apps/meteor/app/models/server/raw/Rooms.js rename to apps/meteor/server/models/raw/Rooms.js index 807b3d365aea..2195a68b93ed 100644 --- a/apps/meteor/app/models/server/raw/Rooms.js +++ b/apps/meteor/server/models/raw/Rooms.js @@ -1,9 +1,14 @@ import { ReadPreference } from 'mongodb'; import { escapeRegExp } from '@rocket.chat/string-helpers'; +import { getCollectionName } from '@rocket.chat/models'; import { BaseRaw } from './BaseRaw'; export class RoomsRaw extends BaseRaw { + constructor(db, trash) { + super(db, getCollectionName('room'), trash); + } + findOneByRoomIdAndUserId(rid, uid, options = {}) { const query = { '_id': rid, diff --git a/apps/meteor/app/models/server/raw/ServerEvents.ts b/apps/meteor/server/models/raw/ServerEvents.ts similarity index 69% rename from apps/meteor/app/models/server/raw/ServerEvents.ts rename to apps/meteor/server/models/raw/ServerEvents.ts index e169524574d5..ce9505a5761f 100644 --- a/apps/meteor/app/models/server/raw/ServerEvents.ts +++ b/apps/meteor/server/models/raw/ServerEvents.ts @@ -1,8 +1,16 @@ -import { IServerEvent, ServerEventType } from '@rocket.chat/core-typings'; +import type { IServerEvent, RocketChatRecordDeleted } from '@rocket.chat/core-typings'; +import { ServerEventType } from '@rocket.chat/core-typings'; +import type { IServerEventsModel } from '@rocket.chat/model-typings'; +import type { Collection, Db, IndexSpecification } from 'mongodb'; +import { getCollectionName } from '@rocket.chat/models'; -import { BaseRaw, IndexSpecification } from './BaseRaw'; +import { BaseRaw } from './BaseRaw'; + +export class ServerEventsRaw extends BaseRaw implements IServerEventsModel { + constructor(db: Db, trash?: Collection>) { + super(db, getCollectionName('server_events'), trash); + } -export class ServerEventsRaw extends BaseRaw { protected modelIndexes(): IndexSpecification[] { return [{ key: { t: 1, ip: 1, ts: -1 } }, { key: { 't': 1, 'u.username': 1, 'ts': -1 } }]; } diff --git a/apps/meteor/app/models/server/raw/Sessions.ts b/apps/meteor/server/models/raw/Sessions.ts similarity index 97% rename from apps/meteor/app/models/server/raw/Sessions.ts rename to apps/meteor/server/models/raw/Sessions.ts index fa955bc06f1a..99c8f58acea3 100644 --- a/apps/meteor/app/models/server/raw/Sessions.ts +++ b/apps/meteor/server/models/raw/Sessions.ts @@ -1,24 +1,30 @@ -import { +import type { + DeviceSessionAggregation, + DeviceSessionAggregationResult, + ISession, + IUser, + OSSessionAggregation, + OSSessionAggregationResult, + RocketChatRecordDeleted, + UserSessionAggregation, + UserSessionAggregationResult, +} from '@rocket.chat/core-typings'; +import type { ISessionsModel, ModelOptionalId } from '@rocket.chat/model-typings'; +import type { AggregationCursor, BulkWriteOperation, BulkWriteOpResultObject, Collection, - UpdateWriteOpResult, - FilterQuery, Cursor, + Db, + FilterQuery, + IndexSpecification, + UpdateWriteOpResult, } from 'mongodb'; -import type { - ISession, - UserSessionAggregation, - DeviceSessionAggregation, - OSSessionAggregation, - UserSessionAggregationResult, - DeviceSessionAggregationResult, - OSSessionAggregationResult, - IUser, -} from '@rocket.chat/core-typings'; +import { getCollectionName } from '@rocket.chat/models'; -import { BaseRaw, IndexSpecification, ModelOptionalId } from './BaseRaw'; +import { BaseRaw } from './BaseRaw'; +import { readSecondaryPreferred } from '../../database/readSecondaryPreferred'; type DestructuredDate = { year: number; month: number; day: number }; type DestructuredDateWithType = { @@ -736,13 +742,13 @@ export const aggregates = { }, }; -export class SessionsRaw extends BaseRaw { +export class SessionsRaw extends BaseRaw implements ISessionsModel { private secondaryCollection: Collection; - constructor(public readonly col: Collection, public readonly colSecondary: Collection, trash?: Collection) { - super(col, trash); + constructor(db: Db, trash?: Collection>) { + super(db, getCollectionName('sessions'), trash); - this.secondaryCollection = colSecondary; + this.secondaryCollection = db.collection(getCollectionName('sessions'), { readPreference: readSecondaryPreferred(db) }); } protected modelIndexes(): IndexSpecification[] { diff --git a/apps/meteor/app/models/server/raw/Settings.ts b/apps/meteor/server/models/raw/Settings.ts similarity index 86% rename from apps/meteor/app/models/server/raw/Settings.ts rename to apps/meteor/server/models/raw/Settings.ts index 90b047798767..4597460cecf2 100644 --- a/apps/meteor/app/models/server/raw/Settings.ts +++ b/apps/meteor/server/models/raw/Settings.ts @@ -1,9 +1,15 @@ -import { Cursor, FilterQuery, UpdateQuery, WriteOpResult } from 'mongodb'; -import type { ISetting, ISettingColor, ISettingSelectOption } from '@rocket.chat/core-typings'; +import type { ISetting, ISettingColor, ISettingSelectOption, RocketChatRecordDeleted } from '@rocket.chat/core-typings'; +import type { ISettingsModel } from '@rocket.chat/model-typings'; +import type { Collection, Cursor, Db, FilterQuery, UpdateQuery, WriteOpResult } from 'mongodb'; +import { getCollectionName } from '@rocket.chat/models'; import { BaseRaw } from './BaseRaw'; -export class SettingsRaw extends BaseRaw { +export class SettingsRaw extends BaseRaw implements ISettingsModel { + constructor(db: Db, trash?: Collection>) { + super(db, getCollectionName('settings'), trash); + } + async getValueById(_id: string): Promise { const setting = await this.findOne>({ _id }, { projection: { value: 1 } }); diff --git a/apps/meteor/server/models/raw/SmarshHistory.ts b/apps/meteor/server/models/raw/SmarshHistory.ts new file mode 100644 index 000000000000..4f9d8791f2e4 --- /dev/null +++ b/apps/meteor/server/models/raw/SmarshHistory.ts @@ -0,0 +1,12 @@ +import type { ISmarshHistory, RocketChatRecordDeleted } from '@rocket.chat/core-typings'; +import type { ISmarshHistoryModel } from '@rocket.chat/model-typings'; +import type { Db, Collection } from 'mongodb'; +import { getCollectionName } from '@rocket.chat/models'; + +import { BaseRaw } from './BaseRaw'; + +export class SmarshHistoryRaw extends BaseRaw implements ISmarshHistoryModel { + constructor(db: Db, trash?: Collection>) { + super(db, getCollectionName('smarsh_history'), trash); + } +} diff --git a/apps/meteor/server/models/raw/Statistics.ts b/apps/meteor/server/models/raw/Statistics.ts new file mode 100644 index 000000000000..73274da37bbd --- /dev/null +++ b/apps/meteor/server/models/raw/Statistics.ts @@ -0,0 +1,27 @@ +import type { IStats, RocketChatRecordDeleted } from '@rocket.chat/core-typings'; +import type { IStatisticsModel } from '@rocket.chat/model-typings'; +import { getCollectionName } from '@rocket.chat/models'; +import type { Collection, Db, IndexSpecification } from 'mongodb'; + +import { BaseRaw } from './BaseRaw'; + +export class StatisticsRaw extends BaseRaw implements IStatisticsModel { + constructor(db: Db, trashCollection: Collection>) { + super(db, getCollectionName('statistics'), trashCollection); + } + + protected modelIndexes(): IndexSpecification[] { + return [{ key: { createdAt: -1 } }]; + } + + async findLast(): Promise { + const options = { + sort: { + createdAt: -1, + }, + limit: 1, + }; + const records = await this.find({}, options).toArray(); + return records?.[0]; + } +} diff --git a/apps/meteor/app/models/server/raw/Subscriptions.ts b/apps/meteor/server/models/raw/Subscriptions.ts similarity index 74% rename from apps/meteor/app/models/server/raw/Subscriptions.ts rename to apps/meteor/server/models/raw/Subscriptions.ts index be58d90b50dd..28e7ed1b3221 100644 --- a/apps/meteor/app/models/server/raw/Subscriptions.ts +++ b/apps/meteor/server/models/raw/Subscriptions.ts @@ -1,14 +1,14 @@ -import { FindOneOptions, Cursor, UpdateQuery, FilterQuery, UpdateWriteOpResult, Collection, WithoutProjection } from 'mongodb'; +import type { IRole, IRoom, ISubscription, IUser, RocketChatRecordDeleted } from '@rocket.chat/core-typings'; +import type { ISubscriptionsModel } from '@rocket.chat/model-typings'; +import type { Collection, Cursor, Db, FilterQuery, FindOneOptions, UpdateQuery, UpdateWriteOpResult, WithoutProjection } from 'mongodb'; +import { getCollectionName, Users } from '@rocket.chat/models'; import { compact } from 'lodash'; -import type { ISubscription, IRole, IUser, IRoom } from '@rocket.chat/core-typings'; import { BaseRaw } from './BaseRaw'; -import { UsersRaw } from './Users'; -type T = ISubscription; -export class SubscriptionsRaw extends BaseRaw { - constructor(public readonly col: Collection, private readonly models: { Users: UsersRaw }, trash?: Collection) { - super(col, trash); +export class SubscriptionsRaw extends BaseRaw implements ISubscriptionsModel { + constructor(db: Db, trash?: Collection>) { + super(db, getCollectionName('subscription'), trash); } async getBadgeCount(uid: string): Promise { @@ -27,7 +27,7 @@ export class SubscriptionsRaw extends BaseRaw { return result?.total || 0; } - findOneByRoomIdAndUserId(rid: string, uid: string, options: FindOneOptions = {}): Promise { + findOneByRoomIdAndUserId(rid: string, uid: string, options: FindOneOptions = {}): Promise { const query = { rid, 'u._id': uid, @@ -36,7 +36,7 @@ export class SubscriptionsRaw extends BaseRaw { return this.findOne(query, options); } - findByUserIdAndRoomIds(userId: string, roomIds: Array, options: FindOneOptions = {}): Cursor { + findByUserIdAndRoomIds(userId: string, roomIds: Array, options: FindOneOptions = {}): Cursor { const query = { 'u._id': userId, 'rid': { @@ -47,7 +47,7 @@ export class SubscriptionsRaw extends BaseRaw { return this.find(query, options); } - findByRoomIdAndNotUserId(roomId: string, userId: string, options: FindOneOptions = {}): Cursor { + findByRoomIdAndNotUserId(roomId: string, userId: string, options: FindOneOptions = {}): Cursor { const query = { 'rid': roomId, 'u._id': { @@ -58,7 +58,7 @@ export class SubscriptionsRaw extends BaseRaw { return this.find(query, options); } - findByLivechatRoomIdAndNotUserId(roomId: string, userId: string, options: FindOneOptions = {}): Cursor { + findByLivechatRoomIdAndNotUserId(roomId: string, userId: string, options: FindOneOptions = {}): Cursor { const query = { 'rid': roomId, 'servedBy._id': { @@ -80,7 +80,7 @@ export class SubscriptionsRaw extends BaseRaw { return cursor.count(); } - async isUserInRole(uid: IUser['_id'], roleId: IRole['_id'], rid?: IRoom['_id']): Promise { + async isUserInRole(uid: IUser['_id'], roleId: IRole['_id'], rid?: IRoom['_id']): Promise { if (rid == null) { return null; } @@ -94,13 +94,18 @@ export class SubscriptionsRaw extends BaseRaw { return this.findOne(query, { projection: { roles: 1 } }); } - setAsReadByRoomIdAndUserId(rid: string, uid: string, alert = false, options: FindOneOptions = {}): ReturnType['update']> { - const query: FilterQuery = { + setAsReadByRoomIdAndUserId( + rid: string, + uid: string, + alert = false, + options: FindOneOptions = {}, + ): ReturnType['update']> { + const query: FilterQuery = { rid, 'u._id': uid, }; - const update: UpdateQuery = { + const update: UpdateQuery = { $set: { open: true, alert, @@ -157,9 +162,7 @@ export class SubscriptionsRaw extends BaseRaw { const users = compact(subscriptions.map((subscription) => subscription.u?._id).filter(Boolean)); - return !options - ? this.models.Users.find({ _id: { $in: users } }) - : this.models.Users.find({ _id: { $in: users } } as FilterQuery, options); + return Users.find

({ _id: { $in: users } }, options || {}); } addRolesByUserId(uid: IUser['_id'], roles: IRole['_id'][], rid?: IRoom['_id']): Promise { diff --git a/apps/meteor/app/models/server/raw/Team.ts b/apps/meteor/server/models/raw/Team.ts similarity index 89% rename from apps/meteor/app/models/server/raw/Team.ts rename to apps/meteor/server/models/raw/Team.ts index 385dcea5deb4..9c2792c97fd4 100644 --- a/apps/meteor/app/models/server/raw/Team.ts +++ b/apps/meteor/server/models/raw/Team.ts @@ -1,9 +1,25 @@ -import { WithoutProjection, FindOneOptions, Cursor, UpdateWriteOpResult, DeleteWriteOpResultObject, FilterQuery } from 'mongodb'; -import { ITeam, TEAM_TYPE } from '@rocket.chat/core-typings'; - -import { BaseRaw, IndexSpecification } from './BaseRaw'; +import type { ITeam, RocketChatRecordDeleted, TEAM_TYPE } from '@rocket.chat/core-typings'; +import type { ITeamModel } from '@rocket.chat/model-typings'; +import { getCollectionName } from '@rocket.chat/models'; +import type { + Collection, + Cursor, + Db, + DeleteWriteOpResultObject, + FilterQuery, + FindOneOptions, + IndexSpecification, + UpdateWriteOpResult, + WithoutProjection, +} from 'mongodb'; + +import { BaseRaw } from './BaseRaw'; + +export class TeamRaw extends BaseRaw implements ITeamModel { + constructor(db: Db, trash?: Collection>) { + super(db, getCollectionName('team'), trash); + } -export class TeamRaw extends BaseRaw { protected modelIndexes(): IndexSpecification[] { return [{ key: { name: 1 }, unique: true }]; } diff --git a/apps/meteor/app/models/server/raw/TeamMember.ts b/apps/meteor/server/models/raw/TeamMember.ts similarity index 85% rename from apps/meteor/app/models/server/raw/TeamMember.ts rename to apps/meteor/server/models/raw/TeamMember.ts index d2ac14c03c7f..dfc3475ed767 100644 --- a/apps/meteor/app/models/server/raw/TeamMember.ts +++ b/apps/meteor/server/models/raw/TeamMember.ts @@ -1,18 +1,26 @@ -import { - WithoutProjection, - FindOneOptions, +import type { IRole, ITeamMember, IUser, RocketChatRecordDeleted } from '@rocket.chat/core-typings'; +import type { ITeamMemberModel } from '@rocket.chat/model-typings'; +import { getCollectionName } from '@rocket.chat/models'; +import type { + Collection, Cursor, - InsertOneWriteOpResult, - UpdateWriteOpResult, + Db, DeleteWriteOpResultObject, FilterQuery, + FindOneOptions, + IndexSpecification, + InsertOneWriteOpResult, + UpdateWriteOpResult, + WithoutProjection, } from 'mongodb'; -import type { ITeamMember, IUser, IRole } from '@rocket.chat/core-typings'; -import { BaseRaw, IndexSpecification } from './BaseRaw'; +import { BaseRaw } from './BaseRaw'; + +export class TeamMemberRaw extends BaseRaw implements ITeamMemberModel { + constructor(db: Db, trash?: Collection>) { + super(db, getCollectionName('team_member'), trash); + } -type T = ITeamMember; -export class TeamMemberRaw extends BaseRaw { protected modelIndexes(): IndexSpecification[] { return [ { @@ -96,7 +104,7 @@ export class TeamMemberRaw extends BaseRaw { return options ? this.col.find({ teamId, roles: role }, options) : this.col.find({ teamId, roles: role }); } - findByUserIdAndTeamIds(userId: string, teamIds: Array, options: FindOneOptions = {}): Cursor { + findByUserIdAndTeamIds(userId: string, teamIds: Array, options: FindOneOptions = {}): Cursor { const query = { userId, teamId: { @@ -107,7 +115,7 @@ export class TeamMemberRaw extends BaseRaw { return this.col.find(query, options); } - findMembersInfoByTeamId(teamId: string, limit: number, skip: number, query?: FilterQuery): Cursor { + findMembersInfoByTeamId(teamId: string, limit: number, skip: number, query?: FilterQuery): Cursor { return this.col.find({ ...query, teamId }, { limit, skip, @@ -117,10 +125,10 @@ export class TeamMemberRaw extends BaseRaw { createdBy: 1, createdAt: 1, }, - } as FindOneOptions); + } as FindOneOptions); } - updateOneByUserIdAndTeamId(userId: string, teamId: string, update: Partial): Promise { + updateOneByUserIdAndTeamId(userId: string, teamId: string, update: Partial): Promise { return this.updateOne({ userId, teamId }, { $set: update }); } @@ -128,7 +136,7 @@ export class TeamMemberRaw extends BaseRaw { teamId: string, userId: string, createdBy: Pick, - ): Promise> { + ): Promise> { return this.insertOne({ teamId, userId, diff --git a/apps/meteor/app/models/server/raw/Uploads.ts b/apps/meteor/server/models/raw/Uploads.ts similarity index 70% rename from apps/meteor/app/models/server/raw/Uploads.ts rename to apps/meteor/server/models/raw/Uploads.ts index f9f227277240..3a670a3800f0 100644 --- a/apps/meteor/app/models/server/raw/Uploads.ts +++ b/apps/meteor/server/models/raw/Uploads.ts @@ -1,10 +1,16 @@ // TODO: Lib imports should not exists inside the raw models +import type { IUpload, RocketChatRecordDeleted } from '@rocket.chat/core-typings'; +import type { InsertionModel, IUploadsModel } from '@rocket.chat/model-typings'; +import { getCollectionName } from '@rocket.chat/models'; import { escapeRegExp } from '@rocket.chat/string-helpers'; -import { +import type { + Collection, CollectionInsertOneOptions, Cursor, + Db, DeleteWriteOpResultObject, FilterQuery, + IndexSpecification, InsertOneWriteOpResult, UpdateOneOptions, UpdateQuery, @@ -12,11 +18,10 @@ import { WithId, WriteOpResult, } from 'mongodb'; -import { IUpload as T } from '@rocket.chat/core-typings'; -import { BaseRaw, IndexSpecification, InsertionModel } from './BaseRaw'; +import { BaseRaw } from './BaseRaw'; -const fillTypeGroup = (fileData: Partial): void => { +const fillTypeGroup = (fileData: Partial): void => { if (!fileData.type) { return; } @@ -24,12 +29,16 @@ const fillTypeGroup = (fileData: Partial): void => { fileData.typeGroup = fileData.type.split('/').shift(); }; -export class UploadsRaw extends BaseRaw { +export class UploadsRaw extends BaseRaw implements IUploadsModel { + constructor(db: Db, trash?: Collection>) { + super(db, getCollectionName('uploads'), trash); + } + protected modelIndexes(): IndexSpecification[] { return [{ key: { rid: 1 } }, { key: { uploadedAt: 1 } }, { key: { typeGroup: 1 } }]; } - findNotHiddenFilesOfRoom(roomId: string, searchText: string, fileType: string, limit: number): Cursor { + findNotHiddenFilesOfRoom(roomId: string, searchText: string, fileType: string, limit: number): Cursor { const fileQuery = { rid: roomId, complete: true, @@ -63,14 +72,14 @@ export class UploadsRaw extends BaseRaw { return this.find(fileQuery, fileOptions); } - insert(fileData: InsertionModel, options?: CollectionInsertOneOptions): Promise>> { + insert(fileData: InsertionModel, options?: CollectionInsertOneOptions): Promise>> { fillTypeGroup(fileData); return super.insertOne(fileData, options); } update( - filter: FilterQuery, - update: UpdateQuery | Partial, + filter: FilterQuery, + update: UpdateQuery | Partial, options?: UpdateOneOptions & { multi?: boolean }, ): Promise { if ('$set' in update && update.$set) { @@ -82,7 +91,12 @@ export class UploadsRaw extends BaseRaw { return super.update(filter, update, options); } - async insertFileInit(userId: string, store: string, file: { name: string }, extra: object): Promise>> { + async insertFileInit( + userId: string, + store: string, + file: { name: string }, + extra: object, + ): Promise>> { const fileData = { userId, store, diff --git a/apps/meteor/server/models/raw/UserDataFiles.ts b/apps/meteor/server/models/raw/UserDataFiles.ts new file mode 100644 index 000000000000..8c6912f69a46 --- /dev/null +++ b/apps/meteor/server/models/raw/UserDataFiles.ts @@ -0,0 +1,35 @@ +import type { IUserDataFile, RocketChatRecordDeleted } from '@rocket.chat/core-typings'; +import type { IUserDataFilesModel } from '@rocket.chat/model-typings'; +import type { Collection, Db, FindOneOptions, IndexSpecification, InsertOneWriteOpResult, WithId, WithoutProjection } from 'mongodb'; +import { getCollectionName } from '@rocket.chat/models'; + +import { BaseRaw } from './BaseRaw'; + +export class UserDataFilesRaw extends BaseRaw implements IUserDataFilesModel { + constructor(db: Db, trash?: Collection>) { + super(db, getCollectionName('user_data_files'), trash); + } + + protected modelIndexes(): IndexSpecification[] { + return [{ key: { userId: 1 } }]; + } + + findLastFileByUser(userId: string, options: WithoutProjection> = {}): Promise { + const query = { + userId, + }; + + options.sort = { _updatedAt: -1 }; + return this.findOne(query, options); + } + + // INSERT + create(data: IUserDataFile): Promise>> { + const userDataFile = { + createdAt: new Date(), + ...data, + }; + + return this.insertOne(userDataFile); + } +} diff --git a/apps/meteor/app/models/server/raw/Users.js b/apps/meteor/server/models/raw/Users.js similarity index 99% rename from apps/meteor/app/models/server/raw/Users.js rename to apps/meteor/server/models/raw/Users.js index 111f9ceadad3..c7387f492a9b 100644 --- a/apps/meteor/app/models/server/raw/Users.js +++ b/apps/meteor/server/models/raw/Users.js @@ -3,8 +3,8 @@ import { escapeRegExp } from '@rocket.chat/string-helpers'; import { BaseRaw } from './BaseRaw'; export class UsersRaw extends BaseRaw { - constructor(...args) { - super(...args); + constructor(db, trash) { + super(db, 'users', trash); this.defaultFields = { __rooms: 0, diff --git a/apps/meteor/server/models/raw/UsersSessions.ts b/apps/meteor/server/models/raw/UsersSessions.ts new file mode 100644 index 000000000000..dd82b169a8ac --- /dev/null +++ b/apps/meteor/server/models/raw/UsersSessions.ts @@ -0,0 +1,28 @@ +import type { IUserSession, RocketChatRecordDeleted } from '@rocket.chat/core-typings'; +import type { IUsersSessionsModel } from '@rocket.chat/model-typings'; +import type { Collection, Db } from 'mongodb'; + +import { BaseRaw } from './BaseRaw'; + +export class UsersSessionsRaw extends BaseRaw implements IUsersSessionsModel { + constructor(db: Db, trash?: Collection>) { + super(db, 'usersSessions', trash, { + preventSetUpdatedAt: true, + }); + } + + clearConnectionsFromInstanceId(instanceId: string[]): ReturnType['updateMany']> { + return this.col.updateMany( + {}, + { + $pull: { + connections: { + instanceId: { + $nin: instanceId, + }, + }, + }, + }, + ); + } +} diff --git a/apps/meteor/app/models/server/raw/VoipRooms.ts b/apps/meteor/server/models/raw/VoipRoom.ts similarity index 86% rename from apps/meteor/app/models/server/raw/VoipRooms.ts rename to apps/meteor/server/models/raw/VoipRoom.ts index b552cae20c38..c31e7872f8b3 100644 --- a/apps/meteor/app/models/server/raw/VoipRooms.ts +++ b/apps/meteor/server/models/raw/VoipRoom.ts @@ -1,10 +1,16 @@ -import { FilterQuery, WithoutProjection, FindOneOptions, WriteOpResult, Cursor } from 'mongodb'; -import type { IVoipRoom, IRoomClosingInfo } from '@rocket.chat/core-typings'; +import type { IRoomClosingInfo, IVoipRoom, RocketChatRecordDeleted } from '@rocket.chat/core-typings'; +import type { IVoipRoomModel } from '@rocket.chat/model-typings'; +import type { Collection, Cursor, Db, FilterQuery, FindOneOptions, WithoutProjection, WriteOpResult } from 'mongodb'; +import { getCollectionName } from '@rocket.chat/models'; +import { Logger } from '../../lib/logger/Logger'; import { BaseRaw } from './BaseRaw'; -import { Logger } from '../../../../server/lib/logger/Logger'; -export class VoipRoomsRaw extends BaseRaw { +export class VoipRoomRaw extends BaseRaw implements IVoipRoomModel { + constructor(db: Db, trash?: Collection>) { + super(db, getCollectionName('room'), trash); + } + logger = new Logger('VoipRoomsRaw'); async findOneOpenByVisitorToken(visitorToken: string, options: FindOneOptions = {}): Promise { diff --git a/apps/meteor/server/models/raw/WebdavAccounts.ts b/apps/meteor/server/models/raw/WebdavAccounts.ts new file mode 100644 index 000000000000..53cef3fd5af6 --- /dev/null +++ b/apps/meteor/server/models/raw/WebdavAccounts.ts @@ -0,0 +1,44 @@ +import type { IWebdavAccount, RocketChatRecordDeleted } from '@rocket.chat/core-typings'; +import type { IWebdavAccountsModel } from '@rocket.chat/model-typings'; +import type { Collection, Cursor, Db, DeleteWriteOpResultObject, FindOneOptions, IndexSpecification } from 'mongodb'; +import { getCollectionName } from '@rocket.chat/models'; + +import { BaseRaw } from './BaseRaw'; + +export class WebdavAccountsRaw extends BaseRaw implements IWebdavAccountsModel { + constructor(db: Db, trash?: Collection>) { + super(db, getCollectionName('webdav_accounts'), trash); + } + + protected modelIndexes(): IndexSpecification[] { + return [{ key: { userId: 1 } }]; + } + + findOneByIdAndUserId(_id: string, userId: string, options: FindOneOptions): Promise { + return this.findOne({ _id, userId }, options); + } + + findOneByUserIdServerUrlAndUsername( + { + userId, + serverURL, + username, + }: { + userId: string; + serverURL: string; + username: string; + }, + options: FindOneOptions, + ): Promise { + return this.findOne({ userId, serverURL, username }, options); + } + + findWithUserId(userId: string, options: FindOneOptions): Cursor { + const query = { userId }; + return this.find(query, options); + } + + removeByUserAndId(_id: string, userId: string): Promise { + return this.deleteOne({ _id, userId }); + } +} diff --git a/apps/meteor/server/models/startup.ts b/apps/meteor/server/models/startup.ts new file mode 100644 index 000000000000..9df2c47a0f0a --- /dev/null +++ b/apps/meteor/server/models/startup.ts @@ -0,0 +1,55 @@ +import './Analytics'; +import './Avatars'; +import './Banners'; +import './BannersDismiss'; +import './CredentialTokens'; +import './CustomSounds'; +import './CustomUserStatus'; +import './EmailInbox'; +import './EmailMessageHistory'; +import './EmojiCustom'; +import './ExportOperations'; +import './FederationKeys'; +import './FederationServers'; +import './ImportData'; +import './InstanceStatus'; +import './IntegrationHistory'; +import './Integrations'; +import './Invites'; +import './LivechatAgentActivity'; +import './LivechatBusinessHours'; +import './LivechatCustomField'; +import './LivechatDepartment'; +import './LivechatDepartmentAgents'; +import './LivechatInquiry'; +import './LivechatRooms'; +import './LivechatTrigger'; +import './LivechatVisitors'; +import './LoginServiceConfiguration'; +import './Messages'; +import './NotificationQueue'; +import './Nps'; +import './NpsVote'; +import './OAuthApps'; +import './OEmbedCache'; +import './OmnichannelQueue'; +import './PbxEvents'; +import './Permissions'; +import './ReadReceipts'; +import './Reports'; +import './Roles'; +import './Rooms'; +import './ServerEvents'; +import './Sessions'; +import './Settings'; +import './SmarshHistory'; +import './Statistics'; +import './Subscriptions'; +import './Team'; +import './TeamMember'; +import './Uploads'; +import './UserDataFiles'; +import './Users'; +import './UsersSessions'; +import './VoipRoom'; +import './WebdavAccounts'; diff --git a/apps/meteor/server/modules/notifications/notifications.module.ts b/apps/meteor/server/modules/notifications/notifications.module.ts index 8230428e75aa..48dc20a1358f 100644 --- a/apps/meteor/server/modules/notifications/notifications.module.ts +++ b/apps/meteor/server/modules/notifications/notifications.module.ts @@ -1,21 +1,11 @@ import type { IStreamer, IStreamerConstructor, IPublication } from 'meteor/rocketchat:streamer'; import type { ISubscription, IOmnichannelRoom, IUser } from '@rocket.chat/core-typings'; +import { Rooms, Subscriptions, Users, Settings } from '@rocket.chat/models'; import { Authorization } from '../../sdk'; -import { RoomsRaw } from '../../../app/models/server/raw/Rooms'; -import { SubscriptionsRaw } from '../../../app/models/server/raw/Subscriptions'; import { emit, StreamPresence } from '../../../app/notifications/server/lib/Presence'; -import { UsersRaw } from '../../../app/models/server/raw/Users'; -import { SettingsRaw } from '../../../app/models/server/raw/Settings'; import { SystemLogger } from '../../lib/logger/system'; -interface IModelsParam { - Rooms: RoomsRaw; - Subscriptions: SubscriptionsRaw; - Users: UsersRaw; - Settings: SettingsRaw; -} - export class NotificationsModule { public readonly streamLogged: IStreamer; @@ -96,7 +86,7 @@ export class NotificationsModule { this.streamLocal = new this.Streamer('local'); } - async configure({ Rooms, Subscriptions, Users, Settings }: IModelsParam): Promise { + async configure(): Promise { const notifyUser = this.notifyUser.bind(this); this.streamRoomMessage.allowWrite('none'); diff --git a/apps/meteor/server/modules/watchers/watchers.module.ts b/apps/meteor/server/modules/watchers/watchers.module.ts index f3567981dc14..75a8d5eb5183 100644 --- a/apps/meteor/server/modules/watchers/watchers.module.ts +++ b/apps/meteor/server/modules/watchers/watchers.module.ts @@ -18,45 +18,47 @@ import type { IPbxEvent, } from '@rocket.chat/core-typings'; import { ISetting, SettingValue } from '@rocket.chat/core-typings'; +import { + IBaseModel, + IEmailInboxModel, + IInstanceStatusModel, + IIntegrationHistoryModel, + IIntegrationsModel, + ILivechatDepartmentAgentsModel, + ILivechatInquiryModel, + ILoginServiceConfigurationModel, + IMessagesModel, + IPbxEventsModel, + IPermissionsModel, + IRolesModel, + IRoomsModel, + ISettingsModel, + ISubscriptionsModel, + IUsersModel, + IUsersSessionsModel, +} from '@rocket.chat/model-typings'; -import { SubscriptionsRaw } from '../../../app/models/server/raw/Subscriptions'; -import { UsersRaw } from '../../../app/models/server/raw/Users'; -import { SettingsRaw } from '../../../app/models/server/raw/Settings'; -import { PermissionsRaw } from '../../../app/models/server/raw/Permissions'; -import { MessagesRaw } from '../../../app/models/server/raw/Messages'; -import { RolesRaw } from '../../../app/models/server/raw/Roles'; -import { RoomsRaw } from '../../../app/models/server/raw/Rooms'; -import { IBaseRaw } from '../../../app/models/server/raw/BaseRaw'; -import { LivechatInquiryRaw } from '../../../app/models/server/raw/LivechatInquiry'; -import { UsersSessionsRaw } from '../../../app/models/server/raw/UsersSessions'; import { subscriptionFields, roomFields } from './publishFields'; -import { LoginServiceConfigurationRaw } from '../../../app/models/server/raw/LoginServiceConfiguration'; -import { InstanceStatusRaw } from '../../../app/models/server/raw/InstanceStatus'; -import { IntegrationHistoryRaw } from '../../../app/models/server/raw/IntegrationHistory'; -import { LivechatDepartmentAgentsRaw } from '../../../app/models/server/raw/LivechatDepartmentAgents'; -import { IntegrationsRaw } from '../../../app/models/server/raw/Integrations'; import { EventSignatures } from '../../sdk/lib/Events'; -import { EmailInboxRaw } from '../../../app/models/server/raw/EmailInbox'; -import { PbxEventsRaw } from '../../../app/models/server/raw/PbxEvents'; import { isPresenceMonitorEnabled } from '../../lib/isPresenceMonitorEnabled'; interface IModelsParam { - Subscriptions: SubscriptionsRaw; - Permissions: PermissionsRaw; - Users: UsersRaw; - Settings: SettingsRaw; - Messages: MessagesRaw; - LivechatInquiry: LivechatInquiryRaw; - LivechatDepartmentAgents: LivechatDepartmentAgentsRaw; - UsersSessions: UsersSessionsRaw; - Roles: RolesRaw; - Rooms: RoomsRaw; - LoginServiceConfiguration: LoginServiceConfigurationRaw; - InstanceStatus: InstanceStatusRaw; - IntegrationHistory: IntegrationHistoryRaw; - Integrations: IntegrationsRaw; - EmailInbox: EmailInboxRaw; - PbxEvent: PbxEventsRaw; + Subscriptions: ISubscriptionsModel; + Permissions: IPermissionsModel; + Users: IUsersModel; + Settings: ISettingsModel; + Messages: IMessagesModel; + LivechatInquiry: ILivechatInquiryModel; + LivechatDepartmentAgents: ILivechatDepartmentAgentsModel; + UsersSessions: IUsersSessionsModel; + Roles: IRolesModel; + Rooms: IRoomsModel; + LoginServiceConfiguration: ILoginServiceConfigurationModel; + InstanceStatus: IInstanceStatusModel; + IntegrationHistory: IIntegrationHistoryModel; + Integrations: IIntegrationsModel; + EmailInbox: IEmailInboxModel; + PbxEvents: IPbxEventsModel; } interface IChange { @@ -68,7 +70,7 @@ interface IChange { unset?: Record; } -type Watcher = (model: IBaseRaw, fn: (event: IChange) => void) => void; +type Watcher = (model: IBaseModel, fn: (event: IChange) => void) => void; type BroadcastCallback = (event: T, ...args: Parameters) => Promise; @@ -105,7 +107,7 @@ export function initWatchers(models: IModelsParam, broadcast: BroadcastCallback, IntegrationHistory, Integrations, EmailInbox, - PbxEvent, + PbxEvents, } = models; const getSettingCached = mem(async (setting: string): Promise => Settings.getValueById(setting), { maxAge: 10000 }); @@ -416,10 +418,10 @@ export function initWatchers(models: IModelsParam, broadcast: BroadcastCallback, broadcast('watch.emailInbox', { clientAction, data, id }); }); - watch(PbxEvent, async ({ clientAction, id, data: eventData }) => { + watch(PbxEvents, async ({ clientAction, id, data: eventData }) => { // For now, we just care about insertions here if (clientAction === 'inserted') { - const data = eventData ?? (await PbxEvent.findOneById(id)); + const data = eventData ?? (await PbxEvents.findOneById(id)); if (!data || !['ContactStatus', 'Hangup'].includes(data.event)) { // For now, we'll only care about agent connect/disconnect events // Other events are not handled by watchers but by service diff --git a/apps/meteor/server/publications/settings/index.ts b/apps/meteor/server/publications/settings/index.ts index 08c8dd2c8aba..20eb314823da 100644 --- a/apps/meteor/server/publications/settings/index.ts +++ b/apps/meteor/server/publications/settings/index.ts @@ -1,10 +1,10 @@ import { Meteor } from 'meteor/meteor'; import type { ISetting } from '@rocket.chat/core-typings'; +import { Settings } from '@rocket.chat/models'; import { hasPermission, hasAtLeastOnePermission } from '../../../app/authorization/server'; import { getSettingPermissionId } from '../../../app/authorization/lib'; import { SettingsEvents } from '../../../app/settings/server'; -import { Settings } from '../../../app/models/server/raw'; Meteor.methods({ async 'public-settings/get'(updatedAt) { diff --git a/apps/meteor/server/publications/subscription/index.js b/apps/meteor/server/publications/subscription/index.js index 123141848e80..84728e043534 100644 --- a/apps/meteor/server/publications/subscription/index.js +++ b/apps/meteor/server/publications/subscription/index.js @@ -1,6 +1,6 @@ import { Meteor } from 'meteor/meteor'; -import { Subscriptions } from '../../../app/models'; +import { Subscriptions } from '../../../app/models/server'; import { subscriptionFields } from '../../modules/watchers/watchers.module'; Meteor.methods({ diff --git a/apps/meteor/server/routes/avatar/room.js b/apps/meteor/server/routes/avatar/room.js index 9453ff4b4da4..14bb9fecfe77 100644 --- a/apps/meteor/server/routes/avatar/room.js +++ b/apps/meteor/server/routes/avatar/room.js @@ -1,10 +1,10 @@ import { Meteor } from 'meteor/meteor'; import { Cookies } from 'meteor/ostrio:cookies'; +import { Avatars } from '@rocket.chat/models'; import { renderSVGLetters, serveAvatar, wasFallbackModified, setCacheAndDispositionHeaders } from './utils'; import { FileUpload } from '../../../app/file-upload'; import { Rooms } from '../../../app/models/server'; -import { Avatars } from '../../../app/models/server/raw'; import { roomCoordinator } from '../../lib/rooms/roomCoordinator'; const cookie = new Cookies(); diff --git a/apps/meteor/server/routes/avatar/user.js b/apps/meteor/server/routes/avatar/user.js index 0cc199ee6914..81e9307611e7 100644 --- a/apps/meteor/server/routes/avatar/user.js +++ b/apps/meteor/server/routes/avatar/user.js @@ -1,10 +1,10 @@ import { Meteor } from 'meteor/meteor'; +import { Avatars } from '@rocket.chat/models'; import { renderSVGLetters, serveAvatar, wasFallbackModified, setCacheAndDispositionHeaders } from './utils'; import { FileUpload } from '../../../app/file-upload'; import { settings } from '../../../app/settings/server'; import { Users } from '../../../app/models/server'; -import { Avatars } from '../../../app/models/server/raw'; // request /avatar/@name forces returning the svg export const userAvatar = Meteor.bindEnvironment(async function (req, res) { diff --git a/apps/meteor/server/sdk/types/ITeamService.ts b/apps/meteor/server/sdk/types/ITeamService.ts index 607413f82889..345061803679 100644 --- a/apps/meteor/server/sdk/types/ITeamService.ts +++ b/apps/meteor/server/sdk/types/ITeamService.ts @@ -23,8 +23,8 @@ export interface ITeamMemberParams { export interface IUserInfo { _id: string; username?: string; - name: string; - status: string; + name?: string; + status?: string; settings?: Record; } diff --git a/apps/meteor/server/services/analytics/service.ts b/apps/meteor/server/services/analytics/service.ts index 85b4c19a593e..993db2ef59c3 100644 --- a/apps/meteor/server/services/analytics/service.ts +++ b/apps/meteor/server/services/analytics/service.ts @@ -1,30 +1,23 @@ -import type { Db } from 'mongodb'; import type { IAnalyticsSeatRequest } from '@rocket.chat/core-typings'; +import { Analytics } from '@rocket.chat/models'; import { ServiceClassInternal } from '../../sdk/types/ServiceClass'; import { IAnalyticsService } from '../../sdk/types/IAnalyticsService'; -import { AnalyticsRaw } from '../../../app/models/server/raw/Analytics'; export class AnalyticsService extends ServiceClassInternal implements IAnalyticsService { protected name = 'analytics'; - private Analytics: AnalyticsRaw; - - constructor(db: Db) { - super(); - this.Analytics = new AnalyticsRaw(db.collection('rocketchat_analytics')); - } - async saveSeatRequest(): Promise { - this.Analytics.update({ type: 'seat-request' }, { $inc: { count: 1 } }, { upsert: true }); + Analytics.update({ type: 'seat-request' }, { $inc: { count: 1 } }, { upsert: true }); } async getSeatRequestCount(): Promise { - const result = await this.Analytics.findOne({ type: 'seat-request' }, {}); + const result = (await Analytics.findOne({ type: 'seat-request' }, {})) as IAnalyticsSeatRequest | null; + return result?.count ? result.count : 0; } async resetSeatRequestCount(): Promise { - await this.Analytics.update({ type: 'seat-request' }, { $set: { count: 0 } }, { upsert: true }); + await Analytics.update({ type: 'seat-request' }, { $set: { count: 0 } }, { upsert: true }); } } diff --git a/apps/meteor/server/services/authorization/canAccessRoom.ts b/apps/meteor/server/services/authorization/canAccessRoom.ts index 5cc7b67002a6..4ff441cf63c8 100644 --- a/apps/meteor/server/services/authorization/canAccessRoom.ts +++ b/apps/meteor/server/services/authorization/canAccessRoom.ts @@ -1,11 +1,11 @@ import { TEAM_TYPE, ITeam } from '@rocket.chat/core-typings'; import type { IUser } from '@rocket.chat/core-typings'; +import { Subscriptions, Rooms, Settings, TeamMember, Team } from '@rocket.chat/models'; import { Authorization } from '../../sdk'; import { RoomAccessValidator } from '../../sdk/types/IAuthorization'; import { canAccessRoomLivechat } from './canAccessRoomLivechat'; import { canAccessRoomVoip } from './canAccessRoomVoip'; -import { Subscriptions, Rooms, Settings, TeamMembers, Team } from './service'; async function canAccessPublicRoom(user: Partial): Promise { if (!user?._id) { @@ -38,7 +38,7 @@ const roomAccessValidators: RoomAccessValidator[] = [ // otherwise access is allowed only to members of the team const membership = user?._id && - (await TeamMembers.findOneByUserIdAndTeamId(user._id, room.teamId, { + (await TeamMember.findOneByUserIdAndTeamId(user._id, room.teamId, { projection: { _id: 1 }, })); return !!membership; diff --git a/apps/meteor/server/services/authorization/canAccessRoomLivechat.ts b/apps/meteor/server/services/authorization/canAccessRoomLivechat.ts index dc92693bbf91..5b0ec051543c 100644 --- a/apps/meteor/server/services/authorization/canAccessRoomLivechat.ts +++ b/apps/meteor/server/services/authorization/canAccessRoomLivechat.ts @@ -1,9 +1,9 @@ import type { IOmnichannelRoom } from '@rocket.chat/core-typings'; +import { Rooms } from '@rocket.chat/models'; import { IAuthorizationLivechat } from '../../sdk/types/IAuthorizationLivechat'; import { proxifyWithWait } from '../../sdk/lib/proxify'; import { RoomAccessValidator } from '../../sdk/types/IAuthorization'; -import { Rooms } from './service'; export const AuthorizationLivechat = proxifyWithWait('authorization-livechat'); diff --git a/apps/meteor/server/services/authorization/canAccessRoomVoip.ts b/apps/meteor/server/services/authorization/canAccessRoomVoip.ts index 2b74db061fa6..88be97895656 100644 --- a/apps/meteor/server/services/authorization/canAccessRoomVoip.ts +++ b/apps/meteor/server/services/authorization/canAccessRoomVoip.ts @@ -1,7 +1,8 @@ +import { Rooms } from '@rocket.chat/models'; + import { IAuthorizationVoip } from '../../sdk/types/IAuthorizationVoip'; import { proxifyWithWait } from '../../sdk/lib/proxify'; import { RoomAccessValidator } from '../../sdk/types/IAuthorization'; -import { Rooms } from './service'; export const AuthorizationVoip = proxifyWithWait('authorization-livechat'); diff --git a/apps/meteor/server/services/authorization/service.ts b/apps/meteor/server/services/authorization/service.ts index b12f23373327..c05ce96bbcf1 100644 --- a/apps/meteor/server/services/authorization/service.ts +++ b/apps/meteor/server/services/authorization/service.ts @@ -1,38 +1,22 @@ import { Db, Collection } from 'mongodb'; import mem from 'mem'; import type { IUser, IRole, IRoom, ISubscription } from '@rocket.chat/core-typings'; +import { Subscriptions, Rooms, Users, Roles } from '@rocket.chat/models'; import { IAuthorization, RoomAccessValidator } from '../../sdk/types/IAuthorization'; import { ServiceClass } from '../../sdk/types/ServiceClass'; import { AuthorizationUtils } from '../../../app/authorization/lib/AuthorizationUtils'; import { canAccessRoom } from './canAccessRoom'; -import { SubscriptionsRaw } from '../../../app/models/server/raw/Subscriptions'; -import { SettingsRaw } from '../../../app/models/server/raw/Settings'; -import { RoomsRaw } from '../../../app/models/server/raw/Rooms'; -import { TeamMemberRaw } from '../../../app/models/server/raw/TeamMember'; -import { TeamRaw } from '../../../app/models/server/raw/Team'; -import { RolesRaw } from '../../../app/models/server/raw/Roles'; -import { UsersRaw } from '../../../app/models/server/raw/Users'; import { License } from '../../sdk'; import './canAccessRoomLivechat'; -export let Subscriptions: SubscriptionsRaw; -export let Settings: SettingsRaw; -export let Rooms: RoomsRaw; -export let TeamMembers: TeamMemberRaw; -export let Team: TeamRaw; - // Register as class export class Authorization extends ServiceClass implements IAuthorization { protected name = 'authorization'; private Permissions: Collection; - private Users: UsersRaw; - - private Roles: RolesRaw; - private getRolesCached = mem(this.getRoles.bind(this), { maxAge: 1000, cacheKey: JSON.stringify, @@ -48,22 +32,6 @@ export class Authorization extends ServiceClass implements IAuthorization { this.Permissions = db.collection('rocketchat_permissions'); - this.Users = new UsersRaw(db.collection('users')); - - Subscriptions = new SubscriptionsRaw(db.collection('rocketchat_subscription'), { - Users: this.Users, - }); - - this.Roles = new RolesRaw(db.collection('rocketchat_roles'), { - Users: this.Users, - Subscriptions, - }); - - Settings = new SettingsRaw(db.collection('rocketchat_settings')); - Rooms = new RoomsRaw(db.collection('rocketchat_room')); - TeamMembers = new TeamMemberRaw(db.collection('rocketchat_team_member')); - Team = new TeamRaw(db.collection('rocketchat_team')); - const clearCache = (): void => { mem.clear(this.getRolesCached); mem.clear(this.rolesHasPermissionCached); @@ -143,7 +111,7 @@ export class Authorization extends ServiceClass implements IAuthorization { private getPublicRoles = mem( async (): Promise => { - const roles = await this.Roles.find>( + const roles = await Roles.find>( { scope: 'Users', description: { $exists: true, $ne: '' } }, { projection: { _id: 1 } }, ).toArray(); @@ -165,7 +133,7 @@ export class Authorization extends ServiceClass implements IAuthorization { }, }; - const users = await this.Users.findUsersInRoles(roleIds, null, options).toArray(); + const users = await Users.findUsersInRoles(roleIds, null, options).toArray(); return users.map((user) => ({ ...user, @@ -185,7 +153,7 @@ export class Authorization extends ServiceClass implements IAuthorization { } private async getRoles(uid: string, scope?: IRoom['_id']): Promise { - const { roles: userRoles = [] } = (await this.Users.findOneById(uid, { projection: { roles: 1 } })) || {}; + const { roles: userRoles = [] } = (await Users.findOneById(uid, { projection: { roles: 1 } })) || {}; const { roles: subscriptionsRoles = [] } = (scope && (await Subscriptions.findOne>({ 'rid': scope, 'u._id': uid }, { projection: { roles: 1 } }))) || diff --git a/apps/meteor/server/services/banner/service.ts b/apps/meteor/server/services/banner/service.ts index f4890cb9bfd1..0be57c48e912 100644 --- a/apps/meteor/server/services/banner/service.ts +++ b/apps/meteor/server/services/banner/service.ts @@ -1,38 +1,21 @@ -import { Db } from 'mongodb'; import { v4 as uuidv4 } from 'uuid'; import { BannerPlatform, IBanner, IBannerDismiss, Optional } from '@rocket.chat/core-typings'; import type { IUser } from '@rocket.chat/core-typings'; +import { Banners, BannersDismiss, Users } from '@rocket.chat/models'; import { ServiceClassInternal } from '../../sdk/types/ServiceClass'; -import { BannersRaw } from '../../../app/models/server/raw/Banners'; -import { BannersDismissRaw } from '../../../app/models/server/raw/BannersDismiss'; -import { UsersRaw } from '../../../app/models/server/raw/Users'; import { IBannerService } from '../../sdk/types/IBannerService'; import { api } from '../../sdk/api'; export class BannerService extends ServiceClassInternal implements IBannerService { protected name = 'banner'; - private Banners: BannersRaw; - - private BannersDismiss: BannersDismissRaw; - - private Users: UsersRaw; - - constructor(db: Db) { - super(); - - this.Banners = new BannersRaw(db.collection('rocketchat_banner')); - this.BannersDismiss = new BannersDismissRaw(db.collection('rocketchat_banner_dismiss')); - this.Users = new UsersRaw(db.collection('users')); - } - async getById(bannerId: string): Promise { - return this.Banners.findOneById(bannerId); + return Banners.findOneById(bannerId); } async discardDismissal(bannerId: string): Promise { - const result = await this.Banners.findOneById(bannerId); + const result = await Banners.findOneById(bannerId); if (!result) { return false; @@ -42,7 +25,7 @@ export class BannerService extends ServiceClassInternal implements IBannerServic const snapshot = await this.create({ ...banner, snapshot: _id, active: false }); // create a snapshot - await this.BannersDismiss.updateMany({ bannerId }, { $set: { bannerId: snapshot._id } }); + await BannersDismiss.updateMany({ bannerId }, { $set: { bannerId: snapshot._id } }); return true; } @@ -52,12 +35,12 @@ export class BannerService extends ServiceClassInternal implements IBannerServic doc.view.appId = 'banner-core'; doc.view.viewId = bannerId; - await this.Banners.create({ + await Banners.create({ ...doc, _id: bannerId, }); - const banner = await this.Banners.findOneById(bannerId); + const banner = await Banners.findOneById(bannerId); if (!banner) { throw new Error('error-creating-banner'); } @@ -68,17 +51,17 @@ export class BannerService extends ServiceClassInternal implements IBannerServic } async getBannersForUser(userId: string, platform: BannerPlatform, bannerId?: string): Promise { - const user = await this.Users.findOneById>(userId, { + const user = await Users.findOneById>(userId, { projection: { roles: 1 }, }); const { roles } = user || { roles: [] }; - const banners = await this.Banners.findActiveByRoleOrId(roles, platform, bannerId).toArray(); + const banners = await Banners.findActiveByRoleOrId(roles, platform, bannerId).toArray(); const bannerIds = banners.map(({ _id }) => _id); - const result = await this.BannersDismiss.findByUserIdAndBannerId>(userId, bannerIds, { + const result = await BannersDismiss.findByUserIdAndBannerId>(userId, bannerIds, { projection: { bannerId: 1, _id: 0 }, }).toArray(); @@ -92,12 +75,12 @@ export class BannerService extends ServiceClassInternal implements IBannerServic throw new Error('Invalid params'); } - const banner = await this.Banners.findOneById(bannerId); + const banner = await Banners.findOneById(bannerId); if (!banner) { throw new Error('Banner not found'); } - const user = await this.Users.findOneById>(userId, { + const user = await Users.findOneById>(userId, { projection: { username: 1 }, }); if (!user) { @@ -119,13 +102,13 @@ export class BannerService extends ServiceClassInternal implements IBannerServic _updatedAt: today, }; - await this.BannersDismiss.insertOne(doc); + await BannersDismiss.insertOne(doc); return true; } async disable(bannerId: string): Promise { - const result = await this.Banners.disable(bannerId); + const result = await Banners.disable(bannerId); if (result) { api.broadcast('banner.disabled', bannerId); @@ -135,7 +118,7 @@ export class BannerService extends ServiceClassInternal implements IBannerServic } async enable(bannerId: string, doc: Partial> = {}): Promise { - const result = await this.Banners.findOneById(bannerId); + const result = await Banners.findOneById(bannerId); if (!result) { return false; @@ -143,7 +126,7 @@ export class BannerService extends ServiceClassInternal implements IBannerServic const { _id, ...banner } = result; - this.Banners.update({ _id }, { ...banner, ...doc, active: true }); // reenable the banner + Banners.update({ _id }, { ...banner, ...doc, active: true }); // reenable the banner api.broadcast('banner.enabled', bannerId); return true; diff --git a/apps/meteor/server/services/meteor/service.ts b/apps/meteor/server/services/meteor/service.ts index a402c0307443..b52e9c0ed84d 100644 --- a/apps/meteor/server/services/meteor/service.ts +++ b/apps/meteor/server/services/meteor/service.ts @@ -3,12 +3,12 @@ import { ServiceConfiguration } from 'meteor/service-configuration'; import { UserPresenceMonitor, UserPresence } from 'meteor/konecty:user-presence'; import { MongoInternals } from 'meteor/mongo'; import type { IUser } from '@rocket.chat/core-typings'; +import { Users } from '@rocket.chat/models'; import { metrics } from '../../../app/metrics'; import { ServiceClassInternal } from '../../sdk/types/ServiceClass'; import { AutoUpdateRecord, IMeteor } from '../../sdk/types/IMeteor'; import { api } from '../../sdk/api'; -import { Users } from '../../../app/models/server/raw/index'; import { Livechat } from '../../../app/livechat/server'; import { settings } from '../../../app/settings/server'; import { setValue, updateValue } from '../../../app/settings/server/raw'; diff --git a/apps/meteor/server/services/nps/getAndCreateNpsSurvey.ts b/apps/meteor/server/services/nps/getAndCreateNpsSurvey.ts index e1f96cba36dd..a4de08f90e22 100644 --- a/apps/meteor/server/services/nps/getAndCreateNpsSurvey.ts +++ b/apps/meteor/server/services/nps/getAndCreateNpsSurvey.ts @@ -18,7 +18,7 @@ type NpsSurveyData = { }; export const getAndCreateNpsSurvey = Meteor.bindEnvironment(async function getNpsSurvey(npsId: string) { - const token: string = getWorkspaceAccessToken(); + const token = getWorkspaceAccessToken(); if (!token) { return false; } diff --git a/apps/meteor/server/services/nps/sendNpsResults.ts b/apps/meteor/server/services/nps/sendNpsResults.ts index c880f4932a9d..62751c691a0b 100644 --- a/apps/meteor/server/services/nps/sendNpsResults.ts +++ b/apps/meteor/server/services/nps/sendNpsResults.ts @@ -12,7 +12,7 @@ type NPSResultPayload = { }; export const sendNpsResults = Meteor.bindEnvironment(function sendNpsResults(npsId: string, data: NPSResultPayload) { - const token: string = getWorkspaceAccessToken(); + const token = getWorkspaceAccessToken(); if (!token) { return false; } diff --git a/apps/meteor/server/services/nps/service.ts b/apps/meteor/server/services/nps/service.ts index 5da0aec936e7..8b247b1d953f 100644 --- a/apps/meteor/server/services/nps/service.ts +++ b/apps/meteor/server/services/nps/service.ts @@ -1,11 +1,8 @@ import { createHash } from 'crypto'; -import { Db } from 'mongodb'; import { NPSStatus, INpsVoteStatus, INpsVote, INps } from '@rocket.chat/core-typings'; +import { Nps, NpsVote, Settings } from '@rocket.chat/models'; -import { NpsRaw } from '../../../app/models/server/raw/Nps'; -import { NpsVoteRaw } from '../../../app/models/server/raw/NpsVote'; -import { SettingsRaw } from '../../../app/models/server/raw/Settings'; import { INPSService, NPSVotePayload, NPSCreatePayload } from '../../sdk/types/INPSService'; import { ServiceClassInternal } from '../../sdk/types/ServiceClass'; import { Banner, NPS } from '../../sdk'; @@ -15,27 +12,13 @@ import { getBannerForAdmins, notifyAdmins } from './notification'; export class NPSService extends ServiceClassInternal implements INPSService { protected name = 'nps'; - private Nps: NpsRaw; - - private Settings: SettingsRaw; - - private NpsVote: NpsVoteRaw; - - constructor(db: Db) { - super(); - - this.Nps = new NpsRaw(db.collection('rocketchat_nps')); - this.NpsVote = new NpsVoteRaw(db.collection('rocketchat_nps_vote')); - this.Settings = new SettingsRaw(db.collection('rocketchat_settings')); - } - async create(nps: NPSCreatePayload): Promise { - const npsEnabled = await this.Settings.getValueById('NPS_survey_enabled'); + const npsEnabled = await Settings.getValueById('NPS_survey_enabled'); if (!npsEnabled) { throw new Error('Server opted-out for NPS surveys'); } - const any = await this.Nps.findOne({}, { projection: { _id: 1 } }); + const any = await Nps.findOne({}, { projection: { _id: 1 } }); if (!any) { Banner.create(getBannerForAdmins(nps.startAt)); @@ -44,7 +27,7 @@ export class NPSService extends ServiceClassInternal implements INPSService { const { npsId, startAt, expireAt, createdBy } = nps; - const { result } = await this.Nps.save({ + const { result } = await Nps.save({ _id: npsId, startAt, expireAt, @@ -59,33 +42,33 @@ export class NPSService extends ServiceClassInternal implements INPSService { } async sendResults(): Promise { - const npsEnabled = await this.Settings.getValueById('NPS_survey_enabled'); + const npsEnabled = await Settings.getValueById('NPS_survey_enabled'); if (!npsEnabled) { return; } - const npsSending = await this.Nps.getOpenExpiredAlreadySending(); + const npsSending = await Nps.getOpenExpiredAlreadySending(); - const nps = npsSending || (await this.Nps.getOpenExpiredAndStartSending()); + const nps = npsSending || (await Nps.getOpenExpiredAndStartSending()); if (!nps) { return; } - const total = await this.NpsVote.findByNpsId(nps._id).count(); + const total = await NpsVote.findByNpsId(nps._id).count(); - const votesToSend = await this.NpsVote.findNotSentByNpsId(nps._id).toArray(); + const votesToSend = await NpsVote.findNotSentByNpsId(nps._id).toArray(); // if there is nothing to sent, check if something gone wrong if (votesToSend.length === 0) { // check if still has votes left to send - const totalSent = await this.NpsVote.findByNpsIdAndStatus(nps._id, INpsVoteStatus.SENT).count(); + const totalSent = await NpsVote.findByNpsIdAndStatus(nps._id, INpsVoteStatus.SENT).count(); if (totalSent === total) { - await this.Nps.updateStatusById(nps._id, NPSStatus.SENT); + await Nps.updateStatusById(nps._id, NPSStatus.SENT); return; } // update old votes (sent 5 minutes ago or more) in 'sending' status back to 'new' - await this.NpsVote.updateOldSendingToNewByNpsId(nps._id); + await NpsVote.updateOldSendingToNewByNpsId(nps._id); // try again in 5 minutes setTimeout(() => NPS.sendResults(), 5 * 60 * 1000); @@ -96,7 +79,7 @@ export class NPSService extends ServiceClassInternal implements INPSService { const sending = await Promise.all( votesToSend.map(async (vote) => { - const { value } = await this.NpsVote.col.findOneAndUpdate( + const { value } = await NpsVote.col.findOneAndUpdate( { _id: vote._id, status: INpsVoteStatus.NEW, @@ -137,21 +120,21 @@ export class NPSService extends ServiceClassInternal implements INPSService { }; sendNpsResults(nps._id, payload); - await this.NpsVote.updateVotesToSent(voteIds); + await NpsVote.updateVotesToSent(voteIds); } - const totalSent = await this.NpsVote.findByNpsIdAndStatus(nps._id, INpsVoteStatus.SENT).count(); + const totalSent = await NpsVote.findByNpsIdAndStatus(nps._id, INpsVoteStatus.SENT).count(); if (totalSent < total) { // send more in five minutes setTimeout(() => NPS.sendResults(), 5 * 60 * 1000); return; } - await this.Nps.updateStatusById(nps._id, NPSStatus.SENT); + await Nps.updateStatusById(nps._id, NPSStatus.SENT); } async vote({ userId, npsId, roles, score, comment }: NPSVotePayload): Promise { - const npsEnabled = await this.Settings.getValueById('NPS_survey_enabled'); + const npsEnabled = await Settings.getValueById('NPS_survey_enabled'); if (!npsEnabled) { return; } @@ -160,7 +143,7 @@ export class NPSService extends ServiceClassInternal implements INPSService { throw new Error('Invalid NPS id'); } - const nps = await this.Nps.findOneById>(npsId, { + const nps = await Nps.findOneById>(npsId, { projection: { status: 1, startAt: 1, expireAt: 1 }, }); if (!nps) { @@ -182,7 +165,7 @@ export class NPSService extends ServiceClassInternal implements INPSService { const identifier = createHash('sha256').update(`${userId}${npsId}`).digest('hex'); - const result = await this.NpsVote.save({ + const result = await NpsVote.save({ ts: new Date(), npsId, identifier, @@ -197,6 +180,6 @@ export class NPSService extends ServiceClassInternal implements INPSService { } async closeOpenSurveys(): Promise { - await this.Nps.closeAllByStatus(NPSStatus.OPEN); + await Nps.closeAllByStatus(NPSStatus.OPEN); } } diff --git a/apps/meteor/server/services/omnichannel-voip/service.ts b/apps/meteor/server/services/omnichannel-voip/service.ts index 8f79f22cb48a..49609de942e4 100644 --- a/apps/meteor/server/services/omnichannel-voip/service.ts +++ b/apps/meteor/server/services/omnichannel-voip/service.ts @@ -1,4 +1,4 @@ -import { Db, FindOneOptions } from 'mongodb'; +import { FindOneOptions } from 'mongodb'; import _ from 'underscore'; import type { IVoipExtensionBase, @@ -18,14 +18,12 @@ import { VoipClientEvents, } from '@rocket.chat/core-typings'; import type { PaginatedResult } from '@rocket.chat/rest-typings'; +import { Users, VoipRoom, PbxEvents } from '@rocket.chat/models'; import { IOmnichannelVoipService } from '../../sdk/types/IOmnichannelVoipService'; import { ServiceClassInternal } from '../../sdk/types/ServiceClass'; import { Logger } from '../../lib/logger/Logger'; import { Voip } from '../../sdk'; -import { UsersRaw } from '../../../app/models/server/raw/Users'; -import { VoipRoomsRaw } from '../../../app/models/server/raw/VoipRooms'; -import { PbxEventsRaw } from '../../../app/models/server/raw/PbxEvents'; import { sendMessage } from '../../../app/lib/server/functions/sendMessage'; import { FindVoipRoomsParams, IOmniRoomClosingMessage } from './internalTypes'; import { api } from '../../sdk/api'; @@ -35,18 +33,9 @@ export class OmnichannelVoipService extends ServiceClassInternal implements IOmn private logger: Logger; - private users: UsersRaw; - - private voipRoom: VoipRoomsRaw; - - private pbxEvents: PbxEventsRaw; - - constructor(db: Db) { + constructor() { super(); - this.users = new UsersRaw(db.collection('users')); - this.voipRoom = new VoipRoomsRaw(db.collection('rocketchat_room')); this.logger = new Logger('OmnichannelVoipService'); - this.pbxEvents = new PbxEventsRaw(db.collection('pbx_events')); // handle agent disconnections this.onEvent('watch.pbxevents', async ({ data }) => { @@ -69,12 +58,12 @@ export class OmnichannelVoipService extends ServiceClassInternal implements IOmn private async processCallerHangup(extension: string): Promise { this.logger.info(`Processing hangup event for call with agent on extension ${extension}`); - const agent = await this.users.findOneByExtension(extension); + const agent = await Users.findOneByExtension(extension); if (!agent) { this.logger.debug(`No agent found with extension ${extension}. Event won't proceed`); return; } - const currentRoom = await this.voipRoom.findOneByAgentId(agent._id); + const currentRoom = await VoipRoom.findOneByAgentId(agent._id); if (!currentRoom) { this.logger.debug(`No active call found for agent ${agent._id}`); return; @@ -85,14 +74,14 @@ export class OmnichannelVoipService extends ServiceClassInternal implements IOmn private async processAgentDisconnect(extension: string): Promise { this.logger.info(`Processing disconnection event for agent with extension ${extension}`); - const agent = await this.users.findOneByExtension(extension); + const agent = await Users.findOneByExtension(extension); if (!agent) { this.logger.debug(`No agent found with extension ${extension}. Event won't proceed`); // this should not even be possible, but just in case return; } - const openRooms = await this.voipRoom.findOpenByAgentId(agent._id).toArray(); + const openRooms = await VoipRoom.findOpenByAgentId(agent._id).toArray(); this.logger.info(`Closing ${openRooms.length} for agent with extension ${extension}`); // In the best scenario, an agent would only have one active voip room // this is to handle the "just in case" scenario of a server and agent failure multiple times @@ -116,7 +105,7 @@ export class OmnichannelVoipService extends ServiceClassInternal implements IOmn this.logger.debug(`Creating Voip room for visitor ${_id}`); // Use latest queue caller join event - const callStartPbxEvent = await this.pbxEvents.findOne( + const callStartPbxEvent = await PbxEvents.findOne( { phone: guest?.phone?.[0]?.phoneNumber, event: 'QueueCallerJoin', @@ -176,7 +165,7 @@ export class OmnichannelVoipService extends ServiceClassInternal implements IOmn }; this.logger.debug(`Room created for visitor ${_id}`); - return (await this.voipRoom.insertOne(room)).insertedId; + return (await VoipRoom.insertOne(room)).insertedId; } private async getAllocatedExtesionAllocationData(projection: Partial<{ [P in keyof IUser]: number }>): Promise { @@ -191,7 +180,7 @@ export class OmnichannelVoipService extends ServiceClassInternal implements IOmn const query = { extension: { $exists: true }, }; - return this.users.findUsersInRolesWithQuery(roles, query, options).toArray(); + return Users.findUsersInRolesWithQuery(roles, query, options).toArray(); } async getFreeExtensions(): Promise { @@ -227,7 +216,7 @@ export class OmnichannelVoipService extends ServiceClassInternal implements IOmn options: FindOneOptions = {}, ): Promise { this.logger.debug(`Attempting to find or create a room for visitor ${guest._id}`); - let room = await this.voipRoom.findOneById(rid, options); + let room = await VoipRoom.findOneById(rid, options); let newRoom = false; if (room && !room.open) { this.logger.debug(`Last room for visitor ${guest._id} closed. Creating new one`); @@ -236,7 +225,7 @@ export class OmnichannelVoipService extends ServiceClassInternal implements IOmn if (room == null) { const name = guest.name || guest.username; const roomId = await this.createVoipRoom(rid, name, agent, guest); - room = await this.voipRoom.findOneVoipRoomById(roomId); + room = await VoipRoom.findOneVoipRoomById(roomId); newRoom = true; this.logger.debug(`Room obtained for visitor ${guest._id} -> ${room?._id}`); } @@ -261,9 +250,9 @@ export class OmnichannelVoipService extends ServiceClassInternal implements IOmn callUniqueId: 1, }; if (!rid) { - return this.voipRoom.findOneByVisitorToken(token, { projection }); + return VoipRoom.findOneByVisitorToken(token, { projection }); } - return this.voipRoom.findOneByIdAndVisitorToken(rid, token, { projection }); + return VoipRoom.findOneByIdAndVisitorToken(rid, token, { projection }); } async closeRoom( @@ -292,7 +281,7 @@ export class OmnichannelVoipService extends ServiceClassInternal implements IOmn this.logger.debug(`Room ${room._id} closed and timers set`); this.logger.debug(`Room ${room._id} was closed at ${closeInfo.closedAt} (duration ${closeInfo.callDuration})`); - this.voipRoom.closeByRoomId(room._id, closeInfo); + VoipRoom.closeByRoomId(room._id, closeInfo); return true; } @@ -384,7 +373,7 @@ export class OmnichannelVoipService extends ServiceClassInternal implements IOmn queue, options: { offset = 0, count, fields, sort } = {}, }: FindVoipRoomsParams): Promise> { - const cursor = this.voipRoom.findRoomsWithCriteria({ + const cursor = VoipRoom.findRoomsWithCriteria({ agents, open, createdAt, @@ -417,9 +406,9 @@ export class OmnichannelVoipService extends ServiceClassInternal implements IOmn return; } - const agentCalledEvent = await this.pbxEvents.findOneByEvent(room.callUniqueId, 'AgentConnect'); + const agentCalledEvent = await PbxEvents.findOneByEvent(room.callUniqueId, 'AgentConnect'); // Update room with the agentconnect event information (hold time => time call was in queue) - await this.voipRoom.updateOne( + await VoipRoom.updateOne( { _id: room._id }, { $set: { @@ -448,7 +437,7 @@ export class OmnichannelVoipService extends ServiceClassInternal implements IOmn room.open && room.callUniqueId && // Check if call exists by looking if we have pbx events of it - (await this.pbxEvents.findOneByUniqueId(room.callUniqueId)) + (await PbxEvents.findOneByUniqueId(room.callUniqueId)) ) { this.logger.debug(`Room is valid. Sending event ${event}`); await sendMessage(user, message, room); @@ -464,7 +453,7 @@ export class OmnichannelVoipService extends ServiceClassInternal implements IOmn offset?: number, sort?: Record, ): Promise<{ agents: ILivechatAgent[]; total: number }> { - const cursor = this.users.getAvailableAgentsIncludingExt(includeExtension, text, { count, skip: offset, sort }); + const cursor = Users.getAvailableAgentsIncludingExt(includeExtension, text, { count, skip: offset, sort }); const agents = await cursor.toArray(); const total = await cursor.count(); diff --git a/apps/meteor/server/services/room/service.ts b/apps/meteor/server/services/room/service.ts index cb402cb6d9d5..3c5741ae36ee 100644 --- a/apps/meteor/server/services/room/service.ts +++ b/apps/meteor/server/services/room/service.ts @@ -1,23 +1,14 @@ -import { Db } from 'mongodb'; import type { IRoom, IUser } from '@rocket.chat/core-typings'; +import { Users } from '@rocket.chat/models'; import { ServiceClassInternal } from '../../sdk/types/ServiceClass'; import { ICreateRoomParams, IRoomService } from '../../sdk/types/IRoomService'; import { Authorization } from '../../sdk'; -import { UsersRaw } from '../../../app/models/server/raw/Users'; import { createRoom } from '../../../app/lib/server/functions/createRoom'; // TODO remove this import export class RoomService extends ServiceClassInternal implements IRoomService { protected name = 'room'; - private Users: UsersRaw; - - constructor(db: Db) { - super(); - - this.Users = new UsersRaw(db.collection('users')); - } - async create(uid: string, params: ICreateRoomParams): Promise { const { type, name, members = [], readOnly, extraData, options } = params; @@ -26,7 +17,7 @@ export class RoomService extends ServiceClassInternal implements IRoomService { throw new Error('no-permission'); } - const user = await this.Users.findOneById>(uid, { + const user = await Users.findOneById>(uid, { projection: { username: 1 }, }); if (!user || !user.username) { diff --git a/apps/meteor/server/services/startup.ts b/apps/meteor/server/services/startup.ts index a996b234425e..12f1bb8c5f51 100644 --- a/apps/meteor/server/services/startup.ts +++ b/apps/meteor/server/services/startup.ts @@ -18,18 +18,18 @@ import { isRunningMs } from '../lib/isRunningMs'; const { db } = MongoInternals.defaultRemoteCollectionDriver().mongo; -api.registerService(new AnalyticsService(db)); +api.registerService(new AnalyticsService()); api.registerService(new AuthorizationLivechat()); -api.registerService(new BannerService(db)); +api.registerService(new BannerService()); api.registerService(new LDAPService()); api.registerService(new MediaService()); api.registerService(new MeteorService()); -api.registerService(new NPSService(db)); -api.registerService(new RoomService(db)); +api.registerService(new NPSService()); +api.registerService(new RoomService()); api.registerService(new SAUMonitorService()); api.registerService(new VoipService(db)); -api.registerService(new OmnichannelVoipService(db)); -api.registerService(new TeamService(db)); +api.registerService(new OmnichannelVoipService()); +api.registerService(new TeamService()); api.registerService(new UiKitCoreApp()); // if the process is running in micro services mode we don't need to register services that will run separately diff --git a/apps/meteor/server/services/team/service.ts b/apps/meteor/server/services/team/service.ts index 9ed9fce67d49..5a82ca834529 100644 --- a/apps/meteor/server/services/team/service.ts +++ b/apps/meteor/server/services/team/service.ts @@ -1,18 +1,14 @@ -import { Db, FindOneOptions, FilterQuery, WithoutProjection } from 'mongodb'; +import { FindOneOptions, FilterQuery, WithoutProjection } from 'mongodb'; import { escapeRegExp } from '@rocket.chat/string-helpers'; import type { IRoom, IUser, ISubscription } from '@rocket.chat/core-typings'; import { IPaginationOptions, IQueryOptions, IRecordsWithTotal, ITeam, ITeamMember, ITeamStats, TEAM_TYPE } from '@rocket.chat/core-typings'; +import { Team, Rooms, Subscriptions, Users, TeamMember } from '@rocket.chat/models'; +import type { InsertionModel } from '@rocket.chat/model-typings'; import { checkUsernameAvailability } from '../../../app/lib/server/functions'; import { addUserToRoom } from '../../../app/lib/server/functions/addUserToRoom'; import { removeUserFromRoom } from '../../../app/lib/server/functions/removeUserFromRoom'; import { getSubscribedRoomsForUserWithDetails } from '../../../app/lib/server/functions/getRoomsWithSingleOwner'; -import type { InsertionModel } from '../../../app/models/server/raw/BaseRaw'; -import { RoomsRaw } from '../../../app/models/server/raw/Rooms'; -import { SubscriptionsRaw } from '../../../app/models/server/raw/Subscriptions'; -import { TeamRaw } from '../../../app/models/server/raw/Team'; -import { TeamMemberRaw } from '../../../app/models/server/raw/TeamMember'; -import { UsersRaw } from '../../../app/models/server/raw/Users'; import { Messages } from '../../../app/models/server'; import { Room, Authorization } from '../../sdk'; import { @@ -32,39 +28,17 @@ import { saveRoomType } from '../../../app/channel-settings/server/functions/sav export class TeamService extends ServiceClassInternal implements ITeamService { protected name = 'team'; - private TeamModel: TeamRaw; - - private RoomsModel: RoomsRaw; - - private SubscriptionsModel: SubscriptionsRaw; - - private Users: UsersRaw; - - private TeamMembersModel: TeamMemberRaw; - - constructor(db: Db) { - super(); - - this.RoomsModel = new RoomsRaw(db.collection('rocketchat_room')); - this.Users = new UsersRaw(db.collection('users')); - this.SubscriptionsModel = new SubscriptionsRaw(db.collection('rocketchat_subscription'), { - Users: this.Users, - }); - this.TeamModel = new TeamRaw(db.collection('rocketchat_team')); - this.TeamMembersModel = new TeamMemberRaw(db.collection('rocketchat_team_member')); - } - async create(uid: string, { team, room = { name: team.name, extraData: {} }, members, owner }: ITeamCreateParams): Promise { if (!checkUsernameAvailability(team.name)) { throw new Error('team-name-already-exists'); } - const existingRoom = await this.RoomsModel.findOneByName(team.name, { projection: { _id: 1 } }); + const existingRoom = await Rooms.findOneByName(team.name, { projection: { _id: 1 } }); if (existingRoom && existingRoom._id !== room.id) { throw new Error('room-name-already-exists'); } - const createdBy = await this.Users.findOneById>(uid, { + const createdBy = await Users.findOneById>(uid, { projection: { username: 1 }, }); if (!createdBy) { @@ -73,9 +47,12 @@ export class TeamService extends ServiceClassInternal implements ITeamService { // TODO add validations to `data` and `members` - const membersResult = await this.Users.findActiveByIdsOrUsernames(members, { - projection: { username: 1, _id: 1 }, - }).toArray(); + const membersResult = + !members || !Array.isArray(members) || members.length === 0 + ? [] + : await Users.findActiveByIdsOrUsernames(members, { + projection: { username: 1 }, + }).toArray(); const memberUsernames = membersResult.map(({ username }) => username); const memberIds = membersResult.map(({ _id }) => _id); @@ -88,7 +65,7 @@ export class TeamService extends ServiceClassInternal implements ITeamService { }; try { - const result = await this.TeamModel.insertOne(teamData); + const result = await Team.insertOne(teamData); const teamId = result.insertedId; // the same uid can be passed at 3 positions: owner, member list or via caller // if the owner is present, remove it from the members list @@ -115,11 +92,11 @@ export class TeamService extends ServiceClassInternal implements ITeamService { createdBy, }); - await this.TeamMembersModel.insertMany(membersList); + await TeamMember.insertMany(membersList); let roomId = room.id; if (roomId) { - await this.RoomsModel.setTeamMainById(roomId, teamId); + await Rooms.setTeamMainById(roomId, teamId); Messages.createUserConvertChannelToTeamWithRoomIdAndUser(roomId, team.name, createdBy); } else { const roomType: IRoom['t'] = team.type === TEAM_TYPE.PRIVATE ? 'p' : 'c'; @@ -128,7 +105,7 @@ export class TeamService extends ServiceClassInternal implements ITeamService { ...room, type: roomType, name: team.name, - members: memberUsernames, + members: memberUsernames as string[], extraData: { ...room.extraData, teamId, @@ -140,7 +117,7 @@ export class TeamService extends ServiceClassInternal implements ITeamService { roomId = createdRoom._id; } - await this.TeamModel.updateMainRoomForTeam(teamId, roomId); + await Team.updateMainRoomForTeam(teamId, roomId); teamData.roomId = roomId; return { @@ -153,14 +130,14 @@ export class TeamService extends ServiceClassInternal implements ITeamService { } async update(uid: string, teamId: string, updateData: ITeamUpdateData): Promise { - const team = await this.TeamModel.findOneById>(teamId, { + const team = await Team.findOneById>(teamId, { projection: { roomId: 1 }, }); if (!team) { return; } - const user = await this.Users.findOneById(uid); + const user = await Users.findOneById(uid); if (!user) { return; } @@ -175,11 +152,11 @@ export class TeamService extends ServiceClassInternal implements ITeamService { saveRoomType(team.roomId, type === TEAM_TYPE.PRIVATE ? 'p' : 'c', user); } - await this.TeamModel.updateNameAndType(teamId, updateData); + await Team.updateNameAndType(teamId, updateData); } async findBySubscribedUserIds(userId: string, callerId?: string): Promise { - const unfilteredTeams = await this.TeamMembersModel.findByUserId>(userId, { + const unfilteredTeams = await TeamMember.findByUserId>(userId, { projection: { teamId: 1, roles: 1 }, }).toArray(); const unfilteredTeamIds = unfilteredTeams.map(({ teamId }) => teamId); @@ -187,13 +164,13 @@ export class TeamService extends ServiceClassInternal implements ITeamService { let teamIds = unfilteredTeamIds; if (callerId) { - const publicTeams = await this.TeamModel.findByIdsAndType>(unfilteredTeamIds, TEAM_TYPE.PUBLIC, { + const publicTeams = await Team.findByIdsAndType>(unfilteredTeamIds, TEAM_TYPE.PUBLIC, { projection: { _id: 1 }, }).toArray(); const publicTeamIds = publicTeams.map(({ _id }) => _id); const privateTeamIds = unfilteredTeamIds.filter((teamId) => !publicTeamIds.includes(teamId)); - const privateTeams = await this.TeamMembersModel.findByUserIdAndTeamIds(callerId, privateTeamIds, { + const privateTeams = await TeamMember.findByUserIdAndTeamIds(callerId, privateTeamIds, { projection: { teamId: 1 }, }).toArray(); const visibleTeamIds = privateTeams.map(({ teamId }) => teamId).concat(publicTeamIds); @@ -202,7 +179,7 @@ export class TeamService extends ServiceClassInternal implements ITeamService { const ownedTeams = unfilteredTeams.filter(({ roles = [] }) => roles.includes('owner')).map(({ teamId }) => teamId); - const results = await this.TeamModel.findByIds(teamIds).toArray(); + const results = await Team.findByIds(teamIds).toArray(); return results.map((team) => ({ ...team, isOwner: ownedTeams.includes(team._id), @@ -224,14 +201,12 @@ export class TeamService extends ServiceClassInternal implements ITeamService { term = new RegExp(`^${escapeRegExp(term)}`, 'i'); } - const userTeams = await this.TeamMembersModel.findByUserId>(userId, { + const userTeams = await TeamMember.findByUserId>(userId, { projection: { teamId: 1 }, }).toArray(); const teamIds = userTeams.map(({ teamId }) => teamId); - return options - ? this.TeamModel.findByNameAndTeamIds(term, teamIds, options).toArray() - : this.TeamModel.findByNameAndTeamIds(term, teamIds).toArray(); + return Team.findByNameAndTeamIds(term, teamIds, options || {}).toArray(); } async list( @@ -239,7 +214,7 @@ export class TeamService extends ServiceClassInternal implements ITeamService { { offset, count }: IPaginationOptions = { offset: 0, count: 50 }, { sort, query }: IQueryOptions = { sort: {} }, ): Promise> { - const userTeams = await this.TeamMembersModel.findByUserId>(uid, { + const userTeams = await TeamMember.findByUserId>(uid, { projection: { teamId: 1 }, }).toArray(); @@ -251,7 +226,7 @@ export class TeamService extends ServiceClassInternal implements ITeamService { }; } - const cursor = this.TeamModel.findByIds( + const cursor = Team.findByIds( teamIds, { ...(sort && { sort }), @@ -264,8 +239,8 @@ export class TeamService extends ServiceClassInternal implements ITeamService { const records = await cursor.toArray(); const results: ITeamInfo[] = []; for await (const record of records) { - const rooms = this.RoomsModel.findByTeamId(record._id); - const users = this.TeamMembersModel.findByTeamId(record._id); + const rooms = Rooms.findByTeamId(record._id); + const users = TeamMember.findByTeamId(record._id); results.push({ ...record, rooms: await rooms.count(), @@ -280,7 +255,7 @@ export class TeamService extends ServiceClassInternal implements ITeamService { } async listAll({ offset, count }: IPaginationOptions = { offset: 0, count: 50 }): Promise> { - const cursor = this.TeamModel.find( + const cursor = Team.find( {}, { limit: count, @@ -292,8 +267,8 @@ export class TeamService extends ServiceClassInternal implements ITeamService { const results: ITeamInfo[] = []; for await (const record of records) { - const rooms = this.RoomsModel.findByTeamId(record._id); - const users = this.TeamMembersModel.findByTeamId(record._id); + const rooms = Rooms.findByTeamId(record._id); + const users = TeamMember.findByTeamId(record._id); results.push({ ...record, rooms: await rooms.count(), @@ -318,13 +293,13 @@ export class TeamService extends ServiceClassInternal implements ITeamService { options?: undefined | WithoutProjection> | FindOneOptions

, ): Promise { if (options === undefined) { - return this.TeamModel.findByNames(names).toArray(); + return Team.findByNames(names).toArray(); } - return this.TeamModel.findByNames(names, options).toArray(); + return Team.findByNames(names, options).toArray(); } async listByIds(ids: Array, options?: FindOneOptions): Promise { - return this.TeamModel.findByIds(ids, options).toArray(); + return Team.findByIds(ids, options).toArray(); } async addRooms(uid: string, rooms: Array, teamId: string): Promise> { @@ -338,16 +313,20 @@ export class TeamService extends ServiceClassInternal implements ITeamService { throw new Error('missing-userId'); } - const team = await this.TeamModel.findOneById>(teamId, { projection: { _id: 1, roomId: 1 } }); + const team = await Team.findOneById>(teamId, { projection: { _id: 1, roomId: 1 } }); if (!team) { throw new Error('invalid-team'); } // at this point, we already checked for the permission // so we just need to check if the user can see the room - const user = await this.Users.findOneById(uid); + const user = await Users.findOneById(uid); + if (!user) { + throw new Error('invalid-user'); + } + const rids = rooms.filter((rid) => rid && typeof rid === 'string'); - const validRooms = await this.RoomsModel.findManyByRoomIds(rids).toArray(); + const validRooms = await Rooms.findManyByRoomIds(rids).toArray(); if (validRooms.length < rids.length) { throw new Error('invalid-room'); } @@ -365,7 +344,7 @@ export class TeamService extends ServiceClassInternal implements ITeamService { throw new Error('room-already-on-team'); } - if (!(await this.SubscriptionsModel.isUserInRole(uid, 'owner', room._id))) { + if (!(await Subscriptions.isUserInRole(uid, 'owner', room._id))) { throw new Error('error-no-owner-channel'); } @@ -376,7 +355,7 @@ export class TeamService extends ServiceClassInternal implements ITeamService { room.teamId = teamId; } - this.RoomsModel.setTeamByIds(rids, teamId); + Rooms.setTeamByIds(rids, teamId); return validRooms; } @@ -391,12 +370,15 @@ export class TeamService extends ServiceClassInternal implements ITeamService { throw new Error('missing-userId'); } - const room = await this.RoomsModel.findOneById(rid); + const room = await Rooms.findOneById(rid); if (!room) { throw new Error('invalid-room'); } - const user = await this.Users.findOneById(uid); + const user = await Users.findOneById(uid); + if (!user) { + throw new Error('invalid-user'); + } if (!canRemoveAnyRoom) { const canSeeRoom = await Authorization.canAccessRoom(room, user); if (!canSeeRoom) { @@ -404,7 +386,7 @@ export class TeamService extends ServiceClassInternal implements ITeamService { } } - const team = await this.TeamModel.findOneById>(teamId, { projection: { _id: 1, roomId: 1 } }); + const team = await Team.findOneById>(teamId, { projection: { _id: 1, roomId: 1 } }); if (!team) { throw new Error('invalid-team'); } @@ -415,7 +397,7 @@ export class TeamService extends ServiceClassInternal implements ITeamService { delete room.teamId; delete room.teamDefault; - this.RoomsModel.unsetTeamById(room._id); + Rooms.unsetTeamById(room._id); if (room.t === 'c') { Messages.createUserRemoveRoomFromTeamWithRoomIdAndUser(team.roomId, room.name, user); @@ -431,21 +413,21 @@ export class TeamService extends ServiceClassInternal implements ITeamService { throw new Error('missing-teamId'); } - const team = await this.TeamModel.findOneById>(teamId, { projection: { roomId: 1 } }); + const team = await Team.findOneById>(teamId, { projection: { roomId: 1 } }); if (!team) { throw new Error('invalid-team'); } - const room = await this.RoomsModel.findOneById>(team.roomId, { projection: { name: 1 } }); + const room = await Rooms.findOneById>(team.roomId, { projection: { name: 1 } }); if (!room) { throw new Error('invalid-room'); } - const user = await this.Users.findOneById(uid); + const user = await Users.findOneById(uid); Messages.createUserConvertTeamToChannelWithRoomIdAndUser(team.roomId, room.name, user); - await this.RoomsModel.unsetTeamId(teamId); + await Rooms.unsetTeamId(teamId); } async updateRoom(uid: string, rid: string, isDefault: boolean, canUpdateAnyRoom = false): Promise { @@ -456,12 +438,15 @@ export class TeamService extends ServiceClassInternal implements ITeamService { throw new Error('missing-userId'); } - const room = await this.RoomsModel.findOneById(rid); + const room = await Rooms.findOneById(rid); if (!room) { throw new Error('invalid-room'); } - const user = await this.Users.findOneById(uid); + const user = await Users.findOneById(uid); + if (!user) { + throw new Error('invalid-user'); + } if (!canUpdateAnyRoom) { const canSeeRoom = await Authorization.canAccessRoom(room, user); if (!canSeeRoom) { @@ -473,7 +458,7 @@ export class TeamService extends ServiceClassInternal implements ITeamService { throw new Error('room-not-on-team'); } room.teamDefault = isDefault; - this.RoomsModel.setTeamDefaultById(rid, isDefault); + Rooms.setTeamDefaultById(rid, isDefault); if (room.teamDefault) { const teamMembers = await this.members(uid, room.teamId, true, undefined, undefined); @@ -497,9 +482,9 @@ export class TeamService extends ServiceClassInternal implements ITeamService { options?: undefined | WithoutProjection> | FindOneOptions

, ): Promise { if (options) { - this.TeamMembersModel.findByUserId(uid, options).toArray(); + TeamMember.findByUserId(uid, options).toArray(); } - return this.TeamMembersModel.findByUserId(uid).toArray(); + return TeamMember.findByUserId(uid).toArray(); } async listRooms( @@ -511,7 +496,7 @@ export class TeamService extends ServiceClassInternal implements ITeamService { if (!teamId) { throw new Error('missing-teamId'); } - const team = await this.TeamModel.findOneById>(teamId, { + const team = await Team.findOneById>(teamId, { projection: { _id: 1, type: 1 }, }); if (!team) { @@ -520,24 +505,24 @@ export class TeamService extends ServiceClassInternal implements ITeamService { const { getAllRooms, allowPrivateTeam, name, isDefault } = filter; - const isMember = await this.TeamMembersModel.findOneByUserIdAndTeamId(uid, teamId); + const isMember = await TeamMember.findOneByUserIdAndTeamId(uid, teamId); if (team.type === TEAM_TYPE.PRIVATE && !allowPrivateTeam && !isMember) { throw new Error('user-not-on-private-team'); } if (getAllRooms) { - const teamRoomsCursor = this.RoomsModel.findByTeamIdContainingNameAndDefault(teamId, name, isDefault, undefined, { skip, limit }); + const teamRoomsCursor = Rooms.findByTeamIdContainingNameAndDefault(teamId, name, isDefault, undefined, { skip, limit }); return { total: await teamRoomsCursor.count(), records: await teamRoomsCursor.toArray(), }; } - const user = await this.Users.findOneById<{ __rooms: string[] }>(uid, { + const user = await Users.findOneById<{ __rooms: string[] }>(uid, { projection: { __rooms: 1 }, }); const userRooms = user?.__rooms; - const validTeamRoomsCursor = this.RoomsModel.findByTeamIdContainingNameAndDefault(teamId, name, isDefault, userRooms, { skip, limit }); + const validTeamRoomsCursor = Rooms.findByTeamIdContainingNameAndDefault(teamId, name, isDefault, userRooms, { skip, limit }); return { total: await validTeamRoomsCursor.count(), @@ -556,18 +541,18 @@ export class TeamService extends ServiceClassInternal implements ITeamService { if (!teamId) { throw new Error('missing-teamId'); } - const team = await this.TeamModel.findOneById(teamId, {}); + const team = await Team.findOneById(teamId, {}); if (!team) { throw new Error('invalid-team'); } - const isMember = await this.TeamMembersModel.findOneByUserIdAndTeamId(uid, teamId); + const isMember = await TeamMember.findOneByUserIdAndTeamId(uid, teamId); if (team.type === TEAM_TYPE.PRIVATE && !allowPrivateTeam && !isMember) { throw new Error('user-not-on-private-team'); } const teamRooms: (IRoom & { userCanDelete?: boolean; - })[] = await this.RoomsModel.findByTeamId(teamId, { + })[] = await Rooms.findByTeamId(teamId, { projection: { _id: 1, t: 1 }, }).toArray(); @@ -585,9 +570,9 @@ export class TeamService extends ServiceClassInternal implements ITeamService { teamRoomIds = teamRooms.filter((room) => room.t === 'p' || room.t === 'c').map((room) => room._id); } - const subscriptionsCursor = this.SubscriptionsModel.findByUserIdAndRoomIds(userId, teamRoomIds); + const subscriptionsCursor = Subscriptions.findByUserIdAndRoomIds(userId, teamRoomIds); const subscriptionRoomIds = (await subscriptionsCursor.toArray()).map((subscription) => subscription.rid); - const availableRoomsCursor = this.RoomsModel.findManyByRoomIds(subscriptionRoomIds, { + const availableRoomsCursor = Rooms.findManyByRoomIds(subscriptionRoomIds, { skip, limit, }); @@ -623,14 +608,14 @@ export class TeamService extends ServiceClassInternal implements ITeamService { throw new Error('invalid-list-of-rooms'); } - const rooms = await this.RoomsModel.findByTeamIdAndRoomsId(teamId, rids, { + const rooms = await Rooms.findByTeamIdAndRoomsId(teamId, rids, { projection: { _id: 1 }, }).toArray(); return rooms.map(({ _id }: { _id: string }) => _id); } async getMembersByTeamIds(teamIds: Array, options: FindOneOptions): Promise> { - return this.TeamMembersModel.findByTeamIds(teamIds, options).toArray(); + return TeamMember.findByTeamIds(teamIds, options).toArray(); } async members( @@ -640,7 +625,7 @@ export class TeamService extends ServiceClassInternal implements ITeamService { { offset, count }: IPaginationOptions = { offset: 0, count: 50 }, query: FilterQuery = {}, ): Promise> { - const isMember = await this.TeamMembersModel.findOneByUserIdAndTeamId(uid, teamId); + const isMember = await TeamMember.findOneByUserIdAndTeamId(uid, teamId); if (!isMember && !canSeeAll) { return { total: 0, @@ -648,16 +633,19 @@ export class TeamService extends ServiceClassInternal implements ITeamService { }; } - const users = await this.Users.findActive({ ...query }).toArray(); + const users = await Users.findActive({ ...query }).toArray(); const userIds = users.map((m) => m._id); - const cursor = this.TeamMembersModel.findMembersInfoByTeamId(teamId, count, offset, { + const cursor = TeamMember.findMembersInfoByTeamId(teamId, count, offset, { userId: { $in: userIds }, }); - const records = await cursor.toArray(); const results: ITeamMemberInfo[] = []; - for await (const record of records) { + for await (const record of cursor) { const user = users.find((u) => u._id === record.userId); + if (!user) { + continue; + } + results.push({ user: { _id: user._id, @@ -682,12 +670,12 @@ export class TeamService extends ServiceClassInternal implements ITeamService { } async addMembers(uid: string, teamId: string, members: Array): Promise { - const createdBy = (await this.Users.findOneById(uid, { projection: { username: 1 } })) as Pick; + const createdBy = (await Users.findOneById(uid, { projection: { username: 1 } })) as Pick; if (!createdBy) { throw new Error('invalid-user'); } - const team = await this.TeamModel.findOneById>(teamId, { + const team = await Team.findOneById>(teamId, { projection: { roomId: 1 }, }); if (!team) { @@ -695,7 +683,7 @@ export class TeamService extends ServiceClassInternal implements ITeamService { } for await (const member of members) { - const user = (await this.Users.findOneById(member.userId, { projection: { username: 1 } })) as Pick; + const user = (await Users.findOneById(member.userId, { projection: { username: 1 } })) as Pick; await addUserToRoom(team.roomId, user, createdBy, false); if (member.roles) { @@ -713,15 +701,15 @@ export class TeamService extends ServiceClassInternal implements ITeamService { roles: member.roles ? member.roles : [], }; - await this.TeamMembersModel.updateOneByUserIdAndTeamId(member.userId, teamId, memberUpdate); + await TeamMember.updateOneByUserIdAndTeamId(member.userId, teamId, memberUpdate); } async removeMember(teamId: string, userId: string): Promise { - await this.TeamMembersModel.deleteByUserIdAndTeamId(userId, teamId); + await TeamMember.deleteByUserIdAndTeamId(userId, teamId); } async removeMembers(uid: string, teamId: string, members: Array): Promise { - const team = await this.TeamModel.findOneById>(teamId, { + const team = await Team.findOneById>(teamId, { projection: { _id: 1, roomId: 1 }, }); if (!team) { @@ -729,40 +717,42 @@ export class TeamService extends ServiceClassInternal implements ITeamService { } const membersIds = members.map((m) => m.userId); - const usersToRemove = await this.Users.findByIds(membersIds, { + const usersToRemove = await Users.findByIds(membersIds, { projection: { _id: 1, username: 1 }, }).toArray(); - const byUser = (await this.Users.findOneById(uid, { projection: { _id: 1, username: 1 } })) as Pick; + const byUser = (await Users.findOneById(uid, { projection: { _id: 1, username: 1 } })) as Pick; for await (const member of members) { if (!member.userId) { throw new Error('invalid-user'); } - const existingMember = await this.TeamMembersModel.findOneByUserIdAndTeamId(member.userId, team._id); + const existingMember = await TeamMember.findOneByUserIdAndTeamId(member.userId, team._id); if (!existingMember) { throw new Error('member-does-not-exist'); } if (existingMember.roles?.includes('owner')) { - const owners = this.TeamMembersModel.findByTeamIdAndRole(team._id, 'owner'); + const owners = TeamMember.findByTeamIdAndRole(team._id, 'owner'); const totalOwners = await owners.count(); if (totalOwners === 1) { throw new Error('last-owner-can-not-be-removed'); } } - this.TeamMembersModel.removeById(existingMember._id); + TeamMember.removeById(existingMember._id); const removedUser = usersToRemove.find((u) => u._id === existingMember.userId); - await removeUserFromRoom( - team.roomId, - removedUser, - uid !== member.userId - ? { - byUser, - } - : undefined, - ); + if (removedUser) { + await removeUserFromRoom( + team.roomId, + removedUser, + uid !== member.userId + ? { + byUser, + } + : undefined, + ); + } } return true; @@ -773,8 +763,8 @@ export class TeamService extends ServiceClassInternal implements ITeamService { await Promise.all( teamIds.map(async (teamId) => { - const team = await this.TeamModel.findOneById(teamId); - const user = await this.Users.findOneById(userId); + const team = await Team.findOneById(teamId); + const user = await Users.findOneById(userId); if (!team || !user) { return; @@ -788,8 +778,8 @@ export class TeamService extends ServiceClassInternal implements ITeamService { async removeMemberFromTeams(userId: string, teamIds: Array): Promise { await Promise.all( teamIds.map(async (teamId) => { - const team = await this.TeamModel.findOneById(teamId); - const user = await this.Users.findOneById(userId); + const team = await Team.findOneById(teamId); + const user = await Users.findOneById(userId); if (!team || !user) { return; @@ -804,11 +794,12 @@ export class TeamService extends ServiceClassInternal implements ITeamService { if (!teamId) { throw new Error('missing-teamId'); } - await this.TeamMembersModel.deleteByTeamId(teamId); + + await TeamMember.deleteByTeamId(teamId); } async addMember(inviter: Pick, userId: string, teamId: string): Promise { - const isAlreadyAMember = await this.TeamMembersModel.findOneByUserIdAndTeamId(userId, teamId, { + const isAlreadyAMember = await TeamMember.findOneByUserIdAndTeamId(userId, teamId, { projection: { _id: 1 }, }); @@ -821,7 +812,7 @@ export class TeamService extends ServiceClassInternal implements ITeamService { inviterData = { _id: inviter._id, username: inviter.username }; } - const member = (await this.TeamMembersModel.createOneByTeamIdAndUserId(teamId, userId, inviterData)).ops[0]; + const member = (await TeamMember.createOneByTeamIdAndUserId(teamId, userId, inviterData)).ops[0]; await this.addMembersToDefaultRooms(inviter, teamId, [member]); return true; @@ -836,14 +827,14 @@ export class TeamService extends ServiceClassInternal implements ITeamService { async getAllPublicTeams

( options?: undefined | WithoutProjection> | FindOneOptions

, ): Promise { - return options ? this.TeamModel.findByType(TEAM_TYPE.PUBLIC, options).toArray() : this.TeamModel.findByType(TEAM_TYPE.PUBLIC).toArray(); + return options ? Team.findByType(TEAM_TYPE.PUBLIC, options).toArray() : Team.findByType(TEAM_TYPE.PUBLIC).toArray(); } async getOneById

(teamId: string, options?: FindOneOptions

): Promise { if (options === undefined) { - return this.TeamModel.findOneById(teamId); + return Team.findOneById(teamId); } - return this.TeamModel.findOneById(teamId, options); + return Team.findOneById(teamId, options); } async getOneByName(teamName: string | RegExp): Promise; @@ -857,19 +848,19 @@ export class TeamService extends ServiceClassInternal implements ITeamService { options?: undefined | WithoutProjection> | FindOneOptions

, ): Promise { if (!options) { - return this.TeamModel.findOneByName(teamName); + return Team.findOneByName(teamName); } - return this.TeamModel.findOneByName(teamName, options); + return Team.findOneByName(teamName, options); } async getOneByMainRoomId(roomId: string): Promise | null> { - return this.TeamModel.findOneByMainRoomId>(roomId, { + return Team.findOneByMainRoomId>(roomId, { projection: { _id: 1 }, }); } async getOneByRoomId(roomId: string): Promise { - const room = await this.RoomsModel.findOneById(roomId); + const room = await Rooms.findOneById(roomId); if (!room) { throw new Error('invalid-room'); @@ -879,11 +870,11 @@ export class TeamService extends ServiceClassInternal implements ITeamService { throw new Error('room-not-on-team'); } - return this.TeamModel.findOneById(room.teamId); + return Team.findOneById(room.teamId); } async addRolesToMember(teamId: string, userId: string, roles: Array): Promise { - const isMember = await this.TeamMembersModel.findOneByUserIdAndTeamId(userId, teamId, { + const isMember = await TeamMember.findOneByUserIdAndTeamId(userId, teamId, { projection: { _id: 1 }, }); @@ -892,11 +883,11 @@ export class TeamService extends ServiceClassInternal implements ITeamService { return false; } - return !!(await this.TeamMembersModel.updateRolesByTeamIdAndUserId(teamId, userId, roles)); + return !!(await TeamMember.updateRolesByTeamIdAndUserId(teamId, userId, roles)); } async removeRolesFromMember(teamId: string, userId: string, roles: Array): Promise { - const isMember = await this.TeamMembersModel.findOneByUserIdAndTeamId(userId, teamId, { + const isMember = await TeamMember.findOneByUserIdAndTeamId(userId, teamId, { projection: { _id: 1 }, }); @@ -905,11 +896,11 @@ export class TeamService extends ServiceClassInternal implements ITeamService { return false; } - return !!(await this.TeamMembersModel.removeRolesByTeamIdAndUserId(teamId, userId, roles)); + return !!(await TeamMember.removeRolesByTeamIdAndUserId(teamId, userId, roles)); } async getInfoByName(teamName: string): Promise | null> { - return this.TeamModel.findOne>( + return Team.findOne>( { name: teamName, }, @@ -918,7 +909,7 @@ export class TeamService extends ServiceClassInternal implements ITeamService { } async getInfoById(teamId: string): Promise | null> { - return this.TeamModel.findOne>( + return Team.findOne>( { _id: teamId, }, @@ -931,8 +922,8 @@ export class TeamService extends ServiceClassInternal implements ITeamService { teamId: string, members: Array>, ): Promise { - const defaultRooms = await this.RoomsModel.findDefaultRoomsForTeam(teamId).toArray(); - const users = await this.Users.findActiveByIds(members.map((member) => member.userId)).toArray(); + const defaultRooms = await Rooms.findDefaultRoomsForTeam(teamId).toArray(); + const users = await Users.findActiveByIds(members.map((member) => member.userId)).toArray(); defaultRooms.map(async (room) => { // at this point, users are already part of the team so we won't check for membership @@ -944,31 +935,28 @@ export class TeamService extends ServiceClassInternal implements ITeamService { } async deleteById(teamId: string): Promise { - return !!(await this.TeamModel.deleteOneById(teamId)); + return !!(await Team.deleteOneById(teamId)); } async deleteByName(teamName: string): Promise { - return !!(await this.TeamModel.deleteOneByName(teamName)); + return !!(await Team.deleteOneByName(teamName)); } async getStatistics(): Promise { return { - totalTeams: await this.TeamModel.find({}).count(), - totalRoomsInsideTeams: await this.RoomsModel.findRoomsInsideTeams().count(), - totalDefaultRoomsInsideTeams: await this.RoomsModel.findRoomsInsideTeams(true).count(), + totalTeams: await Team.find({}).count(), + totalRoomsInsideTeams: await Rooms.findRoomsInsideTeams().count(), + totalDefaultRoomsInsideTeams: await Rooms.findRoomsInsideTeams(true).count(), }; } async autocomplete(uid: string, name: string): Promise { const nameRegex = new RegExp(`^${escapeRegExp(name).trim()}`, 'i'); - const subscriptions = await this.SubscriptionsModel.find>( - { 'u._id': uid }, - { projection: { rid: 1 } }, - ).toArray(); + const subscriptions = await Subscriptions.find>({ 'u._id': uid }, { projection: { rid: 1 } }).toArray(); const subscriptionIds = subscriptions.map(({ rid }) => rid); - const rooms = await this.RoomsModel.find( + const rooms = await Rooms.find( { teamMain: true, $and: [ diff --git a/apps/meteor/server/services/voip/connector/asterisk/ami/ContinuousMonitor.ts b/apps/meteor/server/services/voip/connector/asterisk/ami/ContinuousMonitor.ts index 92e84715746c..e6f33318bfbd 100644 --- a/apps/meteor/server/services/voip/connector/asterisk/ami/ContinuousMonitor.ts +++ b/apps/meteor/server/services/voip/connector/asterisk/ami/ContinuousMonitor.ts @@ -38,13 +38,12 @@ import { isICallHangupEvent, ICallHangup, } from '@rocket.chat/core-typings'; +import { Users, PbxEvents } from '@rocket.chat/models'; import { Command, CommandType } from '../Command'; import { Logger } from '../../../../../lib/logger/Logger'; import { CallbackContext } from './CallbackContext'; // import { sendMessage } from '../../../../../../app/lib/server/functions/sendMessage'; -import { UsersRaw } from '../../../../../../app/models/server/raw/Users'; -import { PbxEventsRaw } from '../../../../../../app/models/server/raw/PbxEvents'; import { api } from '../../../../../sdk/api'; import { ACDQueue } from './ACDQueue'; import { Commands } from '../Commands'; @@ -52,16 +51,10 @@ import { Commands } from '../Commands'; export class ContinuousMonitor extends Command { private logger: Logger; - private users: UsersRaw; - - private pbxEvents: PbxEventsRaw; - constructor(command: string, parametersNeeded: boolean, db: Db) { super(command, parametersNeeded, db); this._type = CommandType.AMI; this.logger = new Logger('ContinuousMonitor'); - this.users = new UsersRaw(db.collection('users')); - this.pbxEvents = new PbxEventsRaw(db.collection('pbx_events')); } private async getMembersFromQueueDetails(queueDetails: IQueueDetails): Promise { @@ -75,7 +68,7 @@ export class ContinuousMonitor extends Command { }); this.logger.debug(`Finding members of queue ${queueDetails.name} between users`); - return (await this.users.findByExtensions(extensionList).toArray()).map((u) => u._id); + return (await Users.findByExtensions(extensionList).toArray()).map((u) => u._id); } // Todo : Move this out of connector. This class is a busy class. @@ -92,7 +85,7 @@ export class ContinuousMonitor extends Command { const { queue } = event; const queueDetails = await this.getQueueDetails(queue); const { calls } = queueDetails; - const user = await this.users.findOneByExtension(extension, { + const user = await Users.findOneByExtension(extension, { projection: { _id: 1, username: 1, @@ -111,7 +104,7 @@ export class ContinuousMonitor extends Command { async processAgentCalled(event: IAgentCalledEvent): Promise { this.logger.debug(`Got new event queue.agentcalled at ${event.queue}`); const extension = event.interface.toLowerCase().replace('pjsip/', ''); - const user = await this.users.findOneByExtension(extension, { + const user = await Users.findOneByExtension(extension, { projection: { _id: 1, username: 1, @@ -142,7 +135,7 @@ export class ContinuousMonitor extends Command { // This event represents when an agent drops a call because of disconnection // May happen for any reason outside of our control, like closing the browswer // Or network/power issues - await this.pbxEvents.insertOne({ + await PbxEvents.insertOne({ event: eventName, uniqueId: `${eventName}-${event.contactstatus}-${now.getTime()}`, ts: now, @@ -155,7 +148,7 @@ export class ContinuousMonitor extends Command { // NOTE: using the uniqueId prop of event is not the recommented approach, since it's an opaque ID // However, since we're not using it for anything special, it's a "fair use" // uniqueId => {server}/{epoch}.{id of channel associated with this call} - await this.pbxEvents.insertOne({ + await PbxEvents.insertOne({ uniqueId: `${eventName}-${event.calleridnum}-${event.queue}-${event.uniqueid}`, event: eventName, ts: now, diff --git a/apps/meteor/server/startup/initialData.js b/apps/meteor/server/startup/initialData.js index ab79c351adfe..66c664606a70 100644 --- a/apps/meteor/server/startup/initialData.js +++ b/apps/meteor/server/startup/initialData.js @@ -1,5 +1,6 @@ import { Meteor } from 'meteor/meteor'; import { Accounts } from 'meteor/accounts-base'; +import { Settings } from '@rocket.chat/models'; import { RocketChatFile } from '../../app/file'; import { FileUpload } from '../../app/file-upload/server'; @@ -8,7 +9,6 @@ import { addUserRolesAsync } from '../lib/roles/addUserRoles'; import { Users, Rooms } from '../../app/models/server'; import { settings } from '../../app/settings/server'; import { checkUsernameAvailability, addUserToDefaultChannels } from '../../app/lib/server'; -import { Settings } from '../../app/models/server/raw'; import { validateEmail } from '../../lib/emailValidator'; Meteor.startup(async function () { diff --git a/apps/meteor/server/startup/migrations/v174.ts b/apps/meteor/server/startup/migrations/v174.ts index f9b063903599..33968748b212 100644 --- a/apps/meteor/server/startup/migrations/v174.ts +++ b/apps/meteor/server/startup/migrations/v174.ts @@ -1,4 +1,5 @@ -import { Permissions } from '../../../app/models/server/raw'; +import { Permissions } from '@rocket.chat/models'; + import { addMigration } from '../../lib/migrations'; const appRolePermissions = [ diff --git a/apps/meteor/server/startup/migrations/v175.js b/apps/meteor/server/startup/migrations/v175.js index 091d04720804..b5a3fed0dd68 100644 --- a/apps/meteor/server/startup/migrations/v175.js +++ b/apps/meteor/server/startup/migrations/v175.js @@ -1,6 +1,7 @@ +import { Settings } from '@rocket.chat/models'; + import { addMigration } from '../../lib/migrations'; import { theme } from '../../../app/theme/server/server'; -import { Settings } from '../../../app/models/server/raw'; addMigration({ version: 175, diff --git a/apps/meteor/server/startup/migrations/v176.ts b/apps/meteor/server/startup/migrations/v176.ts index 5dcbf7bc8980..ffcbbf3a456c 100644 --- a/apps/meteor/server/startup/migrations/v176.ts +++ b/apps/meteor/server/startup/migrations/v176.ts @@ -1,4 +1,5 @@ -import { Settings } from '../../../app/models/server/raw'; +import { Settings } from '@rocket.chat/models'; + import { addMigration } from '../../lib/migrations'; addMigration({ diff --git a/apps/meteor/server/startup/migrations/v177.ts b/apps/meteor/server/startup/migrations/v177.ts index 939334d89761..f7e56d59d749 100644 --- a/apps/meteor/server/startup/migrations/v177.ts +++ b/apps/meteor/server/startup/migrations/v177.ts @@ -1,4 +1,5 @@ -import { Settings } from '../../../app/models/server/raw'; +import { Settings } from '@rocket.chat/models'; + import { addMigration } from '../../lib/migrations'; addMigration({ diff --git a/apps/meteor/server/startup/migrations/v178.ts b/apps/meteor/server/startup/migrations/v178.ts index 503c3d66d1cd..2f6db4daa5e4 100644 --- a/apps/meteor/server/startup/migrations/v178.ts +++ b/apps/meteor/server/startup/migrations/v178.ts @@ -1,4 +1,5 @@ -import { Settings } from '../../../app/models/server/raw'; +import { Settings } from '@rocket.chat/models'; + import { addMigration } from '../../lib/migrations'; addMigration({ diff --git a/apps/meteor/server/startup/migrations/v182.js b/apps/meteor/server/startup/migrations/v182.js index 74a840c88a9a..7215b935e14b 100644 --- a/apps/meteor/server/startup/migrations/v182.js +++ b/apps/meteor/server/startup/migrations/v182.js @@ -1,5 +1,6 @@ +import { Analytics } from '@rocket.chat/models'; + import { addMigration } from '../../lib/migrations'; -import { Analytics } from '../../../app/models/server/raw'; addMigration({ version: 182, diff --git a/apps/meteor/server/startup/migrations/v183.js b/apps/meteor/server/startup/migrations/v183.js index f066e98ddc5e..bf3c26a13dcc 100644 --- a/apps/meteor/server/startup/migrations/v183.js +++ b/apps/meteor/server/startup/migrations/v183.js @@ -1,9 +1,9 @@ import { Meteor } from 'meteor/meteor'; import { Random } from 'meteor/random'; +import { Settings, Uploads } from '@rocket.chat/models'; import { addMigration } from '../../lib/migrations'; import { Rooms, Messages, Subscriptions, Users } from '../../../app/models/server'; -import { Settings, Uploads } from '../../../app/models/server/raw'; const unifyRooms = (room) => { // verify if other DM already exists diff --git a/apps/meteor/server/startup/migrations/v184.ts b/apps/meteor/server/startup/migrations/v184.ts index 7b1d3db13d5f..9b5b87edcc6f 100644 --- a/apps/meteor/server/startup/migrations/v184.ts +++ b/apps/meteor/server/startup/migrations/v184.ts @@ -1,4 +1,5 @@ -import { Settings } from '../../../app/models/server/raw'; +import { Settings } from '@rocket.chat/models'; + import { addMigration } from '../../lib/migrations'; addMigration({ diff --git a/apps/meteor/server/startup/migrations/v185.ts b/apps/meteor/server/startup/migrations/v185.ts index a7055b7e74e4..78e2a4be5990 100644 --- a/apps/meteor/server/startup/migrations/v185.ts +++ b/apps/meteor/server/startup/migrations/v185.ts @@ -1,4 +1,5 @@ -import { Settings } from '../../../app/models/server/raw'; +import { Settings } from '@rocket.chat/models'; + import { addMigration } from '../../lib/migrations'; addMigration({ diff --git a/apps/meteor/server/startup/migrations/v186.js b/apps/meteor/server/startup/migrations/v186.js index d4b33398f53a..b586dde4ac7a 100644 --- a/apps/meteor/server/startup/migrations/v186.js +++ b/apps/meteor/server/startup/migrations/v186.js @@ -1,5 +1,6 @@ +import { LivechatInquiry } from '@rocket.chat/models'; + import { addMigration } from '../../lib/migrations'; -import { LivechatInquiry } from '../../../app/models/server/raw'; addMigration({ version: 186, diff --git a/apps/meteor/server/startup/migrations/v187.js b/apps/meteor/server/startup/migrations/v187.js index 69978bf793a5..9de781a93364 100644 --- a/apps/meteor/server/startup/migrations/v187.js +++ b/apps/meteor/server/startup/migrations/v187.js @@ -1,7 +1,7 @@ import { Mongo } from 'meteor/mongo'; +import { NotificationQueue, Settings } from '@rocket.chat/models'; import { addMigration } from '../../lib/migrations'; -import { NotificationQueue, Settings } from '../../../app/models/server/raw'; function convertNotification(notification) { try { diff --git a/apps/meteor/server/startup/migrations/v188.ts b/apps/meteor/server/startup/migrations/v188.ts index ca82db62f34f..227ca1f7650a 100644 --- a/apps/meteor/server/startup/migrations/v188.ts +++ b/apps/meteor/server/startup/migrations/v188.ts @@ -1,4 +1,5 @@ -import { Permissions } from '../../../app/models/server/raw'; +import { Permissions } from '@rocket.chat/models'; + import { addMigration } from '../../lib/migrations'; const newRolePermissions = ['view-d-room', 'view-p-room']; diff --git a/apps/meteor/server/startup/migrations/v189.ts b/apps/meteor/server/startup/migrations/v189.ts index 310bad4bc224..1ecfdb099687 100644 --- a/apps/meteor/server/startup/migrations/v189.ts +++ b/apps/meteor/server/startup/migrations/v189.ts @@ -1,4 +1,5 @@ -import { Settings } from '../../../app/models/server/raw'; +import { Settings } from '@rocket.chat/models'; + import { addMigration } from '../../lib/migrations'; addMigration({ diff --git a/apps/meteor/server/startup/migrations/v190.js b/apps/meteor/server/startup/migrations/v190.js index b91411568dee..9c8c44065de1 100644 --- a/apps/meteor/server/startup/migrations/v190.js +++ b/apps/meteor/server/startup/migrations/v190.js @@ -1,5 +1,6 @@ +import { Settings, Subscriptions } from '@rocket.chat/models'; + import { addMigration } from '../../lib/migrations'; -import { Settings, Subscriptions } from '../../../app/models/server/raw'; addMigration({ version: 190, diff --git a/apps/meteor/server/startup/migrations/v191.ts b/apps/meteor/server/startup/migrations/v191.ts index f30c1699899f..f4edd41e0ac6 100644 --- a/apps/meteor/server/startup/migrations/v191.ts +++ b/apps/meteor/server/startup/migrations/v191.ts @@ -1,4 +1,5 @@ -import { Settings } from '../../../app/models/server/raw'; +import { Settings } from '@rocket.chat/models'; + import { addMigration } from '../../lib/migrations'; addMigration({ diff --git a/apps/meteor/server/startup/migrations/v192.js b/apps/meteor/server/startup/migrations/v192.js index 5434e6dbb8a5..6907afddc87e 100644 --- a/apps/meteor/server/startup/migrations/v192.js +++ b/apps/meteor/server/startup/migrations/v192.js @@ -1,6 +1,6 @@ import { addMigration } from '../../lib/migrations'; import { Messages, Rooms } from '../../../app/models/server'; -import { trash } from '../../../app/models/server/models/_BaseDb'; +import { trash } from '../../database/trash'; addMigration({ version: 192, diff --git a/apps/meteor/server/startup/migrations/v193.js b/apps/meteor/server/startup/migrations/v193.js index f89050e715ff..dc33ef72983c 100644 --- a/apps/meteor/server/startup/migrations/v193.js +++ b/apps/meteor/server/startup/migrations/v193.js @@ -1,5 +1,6 @@ +import { Rooms } from '@rocket.chat/models'; + import { addMigration } from '../../lib/migrations'; -import { Rooms } from '../../../app/models/server/raw'; addMigration({ version: 193, diff --git a/apps/meteor/server/startup/migrations/v194.js b/apps/meteor/server/startup/migrations/v194.js index 7914234b7c05..5d95db41ff46 100644 --- a/apps/meteor/server/startup/migrations/v194.js +++ b/apps/meteor/server/startup/migrations/v194.js @@ -1,5 +1,6 @@ +import { Settings } from '@rocket.chat/models'; + import { Users } from '../../../app/models/server'; -import { Settings } from '../../../app/models/server/raw'; import { addMigration } from '../../lib/migrations'; async function updateFieldMap() { diff --git a/apps/meteor/server/startup/migrations/v195.ts b/apps/meteor/server/startup/migrations/v195.ts index 538da04640e5..999b555d77a8 100644 --- a/apps/meteor/server/startup/migrations/v195.ts +++ b/apps/meteor/server/startup/migrations/v195.ts @@ -1,9 +1,9 @@ import moment from 'moment-timezone'; import { Mongo } from 'meteor/mongo'; import { ILivechatBusinessHour, IBusinessHourWorkHour, LivechatBusinessHourTypes } from '@rocket.chat/core-typings'; +import { LivechatBusinessHours, Permissions, Settings } from '@rocket.chat/models'; import { addMigration } from '../../lib/migrations'; -import { LivechatBusinessHours, Permissions, Settings } from '../../../app/models/server/raw'; const migrateCollection = async (): Promise => { const LivechatOfficeHour = new Mongo.Collection('rocketchat_livechat_office_hour'); diff --git a/apps/meteor/server/startup/migrations/v197.js b/apps/meteor/server/startup/migrations/v197.js index c7efcb96fd73..6dd5683216b8 100644 --- a/apps/meteor/server/startup/migrations/v197.js +++ b/apps/meteor/server/startup/migrations/v197.js @@ -1,8 +1,8 @@ import moment from 'moment-timezone'; import { LivechatBusinessHourTypes } from '@rocket.chat/core-typings'; +import { LivechatBusinessHours } from '@rocket.chat/models'; import { addMigration } from '../../lib/migrations'; -import { LivechatBusinessHours } from '../../../app/models/server/raw'; const updateBusinessHours = async () => { await LivechatBusinessHours.update( diff --git a/apps/meteor/server/startup/migrations/v198.ts b/apps/meteor/server/startup/migrations/v198.ts index 43f5e8c072ec..4c03af92f8ce 100644 --- a/apps/meteor/server/startup/migrations/v198.ts +++ b/apps/meteor/server/startup/migrations/v198.ts @@ -1,4 +1,5 @@ -import { Settings } from '../../../app/models/server/raw'; +import { Settings } from '@rocket.chat/models'; + import { addMigration } from '../../lib/migrations'; addMigration({ diff --git a/apps/meteor/server/startup/migrations/v199.js b/apps/meteor/server/startup/migrations/v199.js index 84f7e6d57f5b..41d151ea9626 100644 --- a/apps/meteor/server/startup/migrations/v199.js +++ b/apps/meteor/server/startup/migrations/v199.js @@ -1,7 +1,7 @@ import { Meteor } from 'meteor/meteor'; import Future from 'fibers/future'; +import { Users, Subscriptions } from '@rocket.chat/models'; -import { Users, Subscriptions } from '../../../app/models/server/raw'; import { addMigration } from '../../lib/migrations'; const batchSize = 5000; diff --git a/apps/meteor/server/startup/migrations/v201.js b/apps/meteor/server/startup/migrations/v201.js index b6c7a59e829d..c183f1bf769b 100644 --- a/apps/meteor/server/startup/migrations/v201.js +++ b/apps/meteor/server/startup/migrations/v201.js @@ -1,7 +1,7 @@ import { Meteor } from 'meteor/meteor'; import { TAPi18n } from 'meteor/rocketchat:tap-i18n'; +import { Settings } from '@rocket.chat/models'; -import { Settings } from '../../../app/models/server/raw'; import { addMigration } from '../../lib/migrations'; import { sendMessagesToAdmins } from '../../lib/sendMessagesToAdmins'; diff --git a/apps/meteor/server/startup/migrations/v202.js b/apps/meteor/server/startup/migrations/v202.js index 841d9ddbd11d..12163c14d59b 100644 --- a/apps/meteor/server/startup/migrations/v202.js +++ b/apps/meteor/server/startup/migrations/v202.js @@ -1,5 +1,6 @@ +import { Uploads } from '@rocket.chat/models'; + import { addMigration } from '../../lib/migrations'; -import { Uploads } from '../../../app/models/server/raw'; addMigration({ version: 202, diff --git a/apps/meteor/server/startup/migrations/v203.ts b/apps/meteor/server/startup/migrations/v203.ts index d5594ece72bb..669841c4b964 100644 --- a/apps/meteor/server/startup/migrations/v203.ts +++ b/apps/meteor/server/startup/migrations/v203.ts @@ -1,5 +1,6 @@ +import { Avatars } from '@rocket.chat/models'; + import { addMigration } from '../../lib/migrations'; -import { Avatars } from '../../../app/models/server/raw'; addMigration({ version: 203, diff --git a/apps/meteor/server/startup/migrations/v205.js b/apps/meteor/server/startup/migrations/v205.js index a69f23187dc3..735a2718af3c 100644 --- a/apps/meteor/server/startup/migrations/v205.js +++ b/apps/meteor/server/startup/migrations/v205.js @@ -1,4 +1,5 @@ -import { Settings } from '../../../app/models/server/raw'; +import { Settings } from '@rocket.chat/models'; + import { addMigration } from '../../lib/migrations'; addMigration({ diff --git a/apps/meteor/server/startup/migrations/v206.js b/apps/meteor/server/startup/migrations/v206.js index b4cebdc01dec..e5ffd3ef4c23 100644 --- a/apps/meteor/server/startup/migrations/v206.js +++ b/apps/meteor/server/startup/migrations/v206.js @@ -1,5 +1,6 @@ +import { Subscriptions, Messages } from '@rocket.chat/models'; + import { addMigration } from '../../lib/migrations'; -import { Subscriptions, Messages } from '../../../app/models/server/raw'; async function migrate() { const subs = await Subscriptions.find( diff --git a/apps/meteor/server/startup/migrations/v207.ts b/apps/meteor/server/startup/migrations/v207.ts index 96319a085670..ecf7281b1f63 100644 --- a/apps/meteor/server/startup/migrations/v207.ts +++ b/apps/meteor/server/startup/migrations/v207.ts @@ -1,4 +1,5 @@ -import { Settings } from '../../../app/models/server/raw'; +import { Settings } from '@rocket.chat/models'; + import { addMigration } from '../../lib/migrations'; addMigration({ diff --git a/apps/meteor/server/startup/migrations/v208.js b/apps/meteor/server/startup/migrations/v208.js index 73bc3384d5f7..efb801c388a7 100644 --- a/apps/meteor/server/startup/migrations/v208.js +++ b/apps/meteor/server/startup/migrations/v208.js @@ -1,5 +1,6 @@ +import { Users, Sessions } from '@rocket.chat/models'; + import { addMigration } from '../../lib/migrations'; -import { Users, Sessions } from '../../../app/models/server/raw'; async function migrateSessions() { const cursor = Users.find({ roles: 'anonymous' }, { projection: { _id: 1 } }); diff --git a/apps/meteor/server/startup/migrations/v211.js b/apps/meteor/server/startup/migrations/v211.js index dd26e82708d9..0319057ba27d 100644 --- a/apps/meteor/server/startup/migrations/v211.js +++ b/apps/meteor/server/startup/migrations/v211.js @@ -1,5 +1,6 @@ +import { Sessions } from '@rocket.chat/models'; + import { addMigration } from '../../lib/migrations'; -import { Sessions } from '../../../app/models/server/raw'; import { getMostImportantRole } from '../../../lib/roles/getMostImportantRole'; async function migrateSessions() { diff --git a/apps/meteor/server/startup/migrations/v213.js b/apps/meteor/server/startup/migrations/v213.js index 97eb9b63fd03..03251c510a90 100644 --- a/apps/meteor/server/startup/migrations/v213.js +++ b/apps/meteor/server/startup/migrations/v213.js @@ -1,5 +1,6 @@ +import { Subscriptions, Rooms } from '@rocket.chat/models'; + import { addMigration } from '../../lib/migrations'; -import { Subscriptions, Rooms } from '../../../app/models/server/raw'; const updateSubscriptions = async () => { const cursor = Subscriptions.find({ t: 'd' }, { projection: { rid: 1, u: 1 } }); diff --git a/apps/meteor/server/startup/migrations/v214.ts b/apps/meteor/server/startup/migrations/v214.ts index 439479b7ecee..7c4f8a3b8791 100644 --- a/apps/meteor/server/startup/migrations/v214.ts +++ b/apps/meteor/server/startup/migrations/v214.ts @@ -1,4 +1,5 @@ -import { Permissions } from '../../../app/models/server/raw'; +import { Permissions } from '@rocket.chat/models'; + import { addMigration } from '../../lib/migrations'; const roleId = 'admin'; diff --git a/apps/meteor/server/startup/migrations/v215.ts b/apps/meteor/server/startup/migrations/v215.ts index 78164d6655cf..f99cc6d6583e 100644 --- a/apps/meteor/server/startup/migrations/v215.ts +++ b/apps/meteor/server/startup/migrations/v215.ts @@ -1,4 +1,5 @@ -import { Settings } from '../../../app/models/server/raw'; +import { Settings } from '@rocket.chat/models'; + import { addMigration } from '../../lib/migrations'; const removed = ['advocacy', 'industry', 'publicRelations', 'healthcarePharmaceutical', 'helpCenter']; diff --git a/apps/meteor/server/startup/migrations/v216.js b/apps/meteor/server/startup/migrations/v216.js index 22db1e8b28af..1fd802260c79 100644 --- a/apps/meteor/server/startup/migrations/v216.js +++ b/apps/meteor/server/startup/migrations/v216.js @@ -1,4 +1,5 @@ -import { Settings } from '../../../app/models/server/raw'; +import { Settings } from '@rocket.chat/models'; + import { addMigration } from '../../lib/migrations'; addMigration({ diff --git a/apps/meteor/server/startup/migrations/v217.ts b/apps/meteor/server/startup/migrations/v217.ts index 715b3a968c72..f4aebd6236df 100644 --- a/apps/meteor/server/startup/migrations/v217.ts +++ b/apps/meteor/server/startup/migrations/v217.ts @@ -1,4 +1,5 @@ -import { Permissions } from '../../../app/models/server/raw'; +import { Permissions } from '@rocket.chat/models'; + import { addMigration } from '../../lib/migrations'; addMigration({ diff --git a/apps/meteor/server/startup/migrations/v218.ts b/apps/meteor/server/startup/migrations/v218.ts index c17991620cb2..ed7a954b2828 100644 --- a/apps/meteor/server/startup/migrations/v218.ts +++ b/apps/meteor/server/startup/migrations/v218.ts @@ -1,5 +1,6 @@ +import { Statistics } from '@rocket.chat/models'; + import { addMigration } from '../../lib/migrations'; -import { Statistics } from '../../../app/models/server/raw'; addMigration({ version: 218, diff --git a/apps/meteor/server/startup/migrations/v219.ts b/apps/meteor/server/startup/migrations/v219.ts index 0e748d309515..c0cb21e3a4f7 100644 --- a/apps/meteor/server/startup/migrations/v219.ts +++ b/apps/meteor/server/startup/migrations/v219.ts @@ -1,4 +1,5 @@ -import { Settings } from '../../../app/models/server/raw'; +import { Settings } from '@rocket.chat/models'; + import { addMigration } from '../../lib/migrations'; addMigration({ diff --git a/apps/meteor/server/startup/migrations/v220.ts b/apps/meteor/server/startup/migrations/v220.ts index e6d915f8c84d..c13c070d2894 100644 --- a/apps/meteor/server/startup/migrations/v220.ts +++ b/apps/meteor/server/startup/migrations/v220.ts @@ -1,4 +1,5 @@ -import { Settings } from '../../../app/models/server/raw'; +import { Settings } from '@rocket.chat/models'; + import { addMigration } from '../../lib/migrations'; addMigration({ diff --git a/apps/meteor/server/startup/migrations/v221.js b/apps/meteor/server/startup/migrations/v221.js index 211b894d24f6..f57b255a83e6 100644 --- a/apps/meteor/server/startup/migrations/v221.js +++ b/apps/meteor/server/startup/migrations/v221.js @@ -1,10 +1,10 @@ import { MongoInternals } from 'meteor/mongo'; import Future from 'fibers/future'; import { TEAM_TYPE } from '@rocket.chat/core-typings'; +import { Rooms } from '@rocket.chat/models'; +import { TeamRaw } from '../../models/raw/Team'; import { addMigration } from '../../lib/migrations'; -import { Rooms } from '../../../app/models/server/raw'; -import { TeamRaw } from '../../../app/models/server/raw/Team'; async function migrateTeamNames(fut) { const { mongo } = MongoInternals.defaultRemoteCollectionDriver(); diff --git a/apps/meteor/server/startup/migrations/v223.ts b/apps/meteor/server/startup/migrations/v223.ts index c6ad84e30749..60f9ef1f0fc0 100644 --- a/apps/meteor/server/startup/migrations/v223.ts +++ b/apps/meteor/server/startup/migrations/v223.ts @@ -1,4 +1,5 @@ -import { Permissions } from '../../../app/models/server/raw'; +import { Permissions } from '@rocket.chat/models'; + import { addMigration } from '../../lib/migrations'; const roleId = 'user'; diff --git a/apps/meteor/server/startup/migrations/v224.ts b/apps/meteor/server/startup/migrations/v224.ts index be266c225bd0..9a7481ff0920 100644 --- a/apps/meteor/server/startup/migrations/v224.ts +++ b/apps/meteor/server/startup/migrations/v224.ts @@ -1,4 +1,5 @@ -import { Permissions } from '../../../app/models/server/raw'; +import { Permissions } from '@rocket.chat/models'; + import { addMigration } from '../../lib/migrations'; addMigration({ diff --git a/apps/meteor/server/startup/migrations/v225.ts b/apps/meteor/server/startup/migrations/v225.ts index 196a9637de3c..3ea12a7cab68 100644 --- a/apps/meteor/server/startup/migrations/v225.ts +++ b/apps/meteor/server/startup/migrations/v225.ts @@ -1,6 +1,7 @@ +import { Settings } from '@rocket.chat/models'; + import { addMigration } from '../../lib/migrations'; import { Users } from '../../../app/models/server'; -import { Settings } from '../../../app/models/server/raw'; addMigration({ version: 225, diff --git a/apps/meteor/server/startup/migrations/v226.ts b/apps/meteor/server/startup/migrations/v226.ts index c94cc0b0d1e8..ff66bfeb9116 100644 --- a/apps/meteor/server/startup/migrations/v226.ts +++ b/apps/meteor/server/startup/migrations/v226.ts @@ -1,4 +1,5 @@ -import { Settings } from '../../../app/models/server/raw'; +import { Settings } from '@rocket.chat/models'; + import { addMigration } from '../../lib/migrations'; addMigration({ diff --git a/apps/meteor/server/startup/migrations/v228.ts b/apps/meteor/server/startup/migrations/v228.ts index 4d49253980f3..8e2394eb748a 100644 --- a/apps/meteor/server/startup/migrations/v228.ts +++ b/apps/meteor/server/startup/migrations/v228.ts @@ -1,4 +1,5 @@ -import { Permissions } from '../../../app/models/server/raw'; +import { Permissions } from '@rocket.chat/models'; + import { addMigration } from '../../lib/migrations'; addMigration({ diff --git a/apps/meteor/server/startup/migrations/v229.ts b/apps/meteor/server/startup/migrations/v229.ts index ef2788b07925..c56077b5c0d1 100644 --- a/apps/meteor/server/startup/migrations/v229.ts +++ b/apps/meteor/server/startup/migrations/v229.ts @@ -1,4 +1,5 @@ -import { Settings } from '../../../app/models/server/raw'; +import { Settings } from '@rocket.chat/models'; + import { addMigration } from '../../lib/migrations'; addMigration({ diff --git a/apps/meteor/server/startup/migrations/v230.ts b/apps/meteor/server/startup/migrations/v230.ts index 31e2e2bdeafe..f1d7608c3d5b 100644 --- a/apps/meteor/server/startup/migrations/v230.ts +++ b/apps/meteor/server/startup/migrations/v230.ts @@ -1,4 +1,5 @@ -import { Permissions } from '../../../app/models/server/raw'; +import { Permissions } from '@rocket.chat/models'; + import { addMigration } from '../../lib/migrations'; addMigration({ diff --git a/apps/meteor/server/startup/migrations/v231.ts b/apps/meteor/server/startup/migrations/v231.ts index 7b88cf7b0d95..d05f68d928df 100644 --- a/apps/meteor/server/startup/migrations/v231.ts +++ b/apps/meteor/server/startup/migrations/v231.ts @@ -1,12 +1,12 @@ import { ISectionBlock, BlockType } from '@rocket.chat/apps-engine/definition/uikit/blocks/Blocks'; import { TextObjectType } from '@rocket.chat/apps-engine/definition/uikit/blocks/Objects'; import { BannerPlatform } from '@rocket.chat/core-typings'; +import { Settings } from '@rocket.chat/models'; import { addMigration } from '../../lib/migrations'; import { Banner } from '../../sdk'; import { settings } from '../../../app/settings/server'; import { isEnterprise } from '../../../ee/app/license/server'; -import { Settings } from '../../../app/models/server/raw'; addMigration({ version: 231, diff --git a/apps/meteor/server/startup/migrations/v232.ts b/apps/meteor/server/startup/migrations/v232.ts index c63a5941a567..8c777e5e0828 100644 --- a/apps/meteor/server/startup/migrations/v232.ts +++ b/apps/meteor/server/startup/migrations/v232.ts @@ -1,9 +1,9 @@ import { BannerPlatform } from '@rocket.chat/core-typings'; import type { IUser } from '@rocket.chat/core-typings'; +import { Users, Settings } from '@rocket.chat/models'; import { addMigration } from '../../lib/migrations'; import { isEnterprise } from '../../../ee/app/license/server'; -import { Users, Settings } from '../../../app/models/server/raw'; import { Banner } from '../../sdk'; import { settings } from '../../../app/settings/server'; diff --git a/apps/meteor/server/startup/migrations/v233.ts b/apps/meteor/server/startup/migrations/v233.ts index f73faa6591ac..aed178886a25 100644 --- a/apps/meteor/server/startup/migrations/v233.ts +++ b/apps/meteor/server/startup/migrations/v233.ts @@ -1,4 +1,5 @@ -import { Settings } from '../../../app/models/server/raw'; +import { Settings } from '@rocket.chat/models'; + import { addMigration } from '../../lib/migrations'; addMigration({ diff --git a/apps/meteor/server/startup/migrations/v234.ts b/apps/meteor/server/startup/migrations/v234.ts index 8909a16e21c1..7db1855e989e 100644 --- a/apps/meteor/server/startup/migrations/v234.ts +++ b/apps/meteor/server/startup/migrations/v234.ts @@ -1,4 +1,5 @@ -import { Settings } from '../../../app/models/server/raw'; +import { Settings } from '@rocket.chat/models'; + import { addMigration } from '../../lib/migrations'; addMigration({ diff --git a/apps/meteor/server/startup/migrations/v235.ts b/apps/meteor/server/startup/migrations/v235.ts index 9c1c0241d99c..9344e60c37e9 100644 --- a/apps/meteor/server/startup/migrations/v235.ts +++ b/apps/meteor/server/startup/migrations/v235.ts @@ -1,6 +1,7 @@ +import { Settings } from '@rocket.chat/models'; + import { addMigration } from '../../lib/migrations'; import { Subscriptions, Users } from '../../../app/models/server'; -import { Settings } from '../../../app/models/server/raw'; addMigration({ version: 235, diff --git a/apps/meteor/server/startup/migrations/v236.ts b/apps/meteor/server/startup/migrations/v236.ts index 2f0ea88c17f2..33955ac04d74 100644 --- a/apps/meteor/server/startup/migrations/v236.ts +++ b/apps/meteor/server/startup/migrations/v236.ts @@ -1,4 +1,5 @@ -import { Settings } from '../../../app/models/server/raw'; +import { Settings } from '@rocket.chat/models'; + import { addMigration } from '../../lib/migrations'; addMigration({ diff --git a/apps/meteor/server/startup/migrations/v237.ts b/apps/meteor/server/startup/migrations/v237.ts index 3f44490c813b..e389c714be88 100644 --- a/apps/meteor/server/startup/migrations/v237.ts +++ b/apps/meteor/server/startup/migrations/v237.ts @@ -1,7 +1,8 @@ +import { Settings } from '@rocket.chat/models'; + import { addMigration } from '../../lib/migrations'; import { settings } from '../../../app/settings/server'; import { isEnterprise } from '../../../ee/app/license/server'; -import { Settings } from '../../../app/models/server/raw'; function copySettingValue(newName: string, oldName: string): void { const value = settings.get(oldName); diff --git a/apps/meteor/server/startup/migrations/v240.ts b/apps/meteor/server/startup/migrations/v240.ts index 296040d649d7..7cf11351ba1c 100644 --- a/apps/meteor/server/startup/migrations/v240.ts +++ b/apps/meteor/server/startup/migrations/v240.ts @@ -1,4 +1,5 @@ -import { Settings } from '../../../app/models/server/raw'; +import { Settings } from '@rocket.chat/models'; + import { addMigration } from '../../lib/migrations'; addMigration({ diff --git a/apps/meteor/server/startup/migrations/v242.ts b/apps/meteor/server/startup/migrations/v242.ts index 0c8539f47b67..10bf52882037 100644 --- a/apps/meteor/server/startup/migrations/v242.ts +++ b/apps/meteor/server/startup/migrations/v242.ts @@ -1,6 +1,7 @@ +import { Settings } from '@rocket.chat/models'; + import { addMigration } from '../../lib/migrations'; import { LivechatInquiry } from '../../../app/models/server'; -import { Settings } from '../../../app/models/server/raw'; function removeQueueTimeoutFromInquiries(): void { LivechatInquiry.update( diff --git a/apps/meteor/server/startup/migrations/v243.ts b/apps/meteor/server/startup/migrations/v243.ts index d81026995eb4..19e5e5a78714 100644 --- a/apps/meteor/server/startup/migrations/v243.ts +++ b/apps/meteor/server/startup/migrations/v243.ts @@ -1,6 +1,7 @@ +import { Settings } from '@rocket.chat/models'; + import { addMigration } from '../../lib/migrations'; import { Users } from '../../../app/models/server'; -import { Settings } from '../../../app/models/server/raw'; addMigration({ version: 243, diff --git a/apps/meteor/server/startup/migrations/v245.ts b/apps/meteor/server/startup/migrations/v245.ts index a3efd7bcc279..302945915279 100644 --- a/apps/meteor/server/startup/migrations/v245.ts +++ b/apps/meteor/server/startup/migrations/v245.ts @@ -1,5 +1,6 @@ +import { Permissions } from '@rocket.chat/models'; + import { addMigration } from '../../lib/migrations'; -import { Permissions } from '../../../app/models/server/raw'; addMigration({ version: 245, diff --git a/apps/meteor/server/startup/migrations/v249.ts b/apps/meteor/server/startup/migrations/v249.ts index c5b28e50561e..4e6f78010435 100644 --- a/apps/meteor/server/startup/migrations/v249.ts +++ b/apps/meteor/server/startup/migrations/v249.ts @@ -1,4 +1,5 @@ -import { Settings } from '../../../app/models/server/raw'; +import { Settings } from '@rocket.chat/models'; + import { addMigration } from '../../lib/migrations'; addMigration({ diff --git a/apps/meteor/server/startup/migrations/v250.ts b/apps/meteor/server/startup/migrations/v250.ts index c1aa413d7e35..f71efe441b13 100644 --- a/apps/meteor/server/startup/migrations/v250.ts +++ b/apps/meteor/server/startup/migrations/v250.ts @@ -1,5 +1,6 @@ +import { Permissions } from '@rocket.chat/models'; + import { addMigration } from '../../lib/migrations'; -import { Permissions } from '../../../app/models/server/raw'; addMigration({ version: 250, diff --git a/apps/meteor/server/startup/migrations/v251.ts b/apps/meteor/server/startup/migrations/v251.ts index 748cb9534d00..8271b181a640 100644 --- a/apps/meteor/server/startup/migrations/v251.ts +++ b/apps/meteor/server/startup/migrations/v251.ts @@ -1,5 +1,6 @@ +import { WebdavAccounts } from '@rocket.chat/models'; + import { addMigration } from '../../lib/migrations'; -import { WebdavAccounts } from '../../../app/models/server/raw'; addMigration({ version: 251, diff --git a/apps/meteor/server/startup/migrations/v252.ts b/apps/meteor/server/startup/migrations/v252.ts index d03270a583e2..b02211a9506d 100644 --- a/apps/meteor/server/startup/migrations/v252.ts +++ b/apps/meteor/server/startup/migrations/v252.ts @@ -1,6 +1,6 @@ import { IOmnichannelRoom, OmnichannelSourceType } from '@rocket.chat/core-typings'; +import { Rooms } from '@rocket.chat/models'; -import { Rooms } from '../../../app/models/server/raw'; import { addMigration } from '../../lib/migrations'; addMigration({ diff --git a/apps/meteor/server/startup/migrations/v253.ts b/apps/meteor/server/startup/migrations/v253.ts index f064f3bba79d..e2c0abeb24ac 100644 --- a/apps/meteor/server/startup/migrations/v253.ts +++ b/apps/meteor/server/startup/migrations/v253.ts @@ -1,5 +1,6 @@ +import { CannedResponse } from '@rocket.chat/models'; + import { addMigration } from '../../lib/migrations'; -import CannedResponse from '../../../ee/app/models/server/raw/CannedResponse'; // This will remove old indexes and re-create the new one addMigration({ diff --git a/apps/meteor/server/startup/migrations/v258.ts b/apps/meteor/server/startup/migrations/v258.ts index 7b3b6effcc63..465b23f3c543 100644 --- a/apps/meteor/server/startup/migrations/v258.ts +++ b/apps/meteor/server/startup/migrations/v258.ts @@ -1,6 +1,6 @@ import type { IRole } from '@rocket.chat/core-typings'; +import { Roles, Users, Subscriptions } from '@rocket.chat/models'; -import { Roles, Users, Subscriptions } from '../../../app/models/server/raw'; import { addMigration } from '../../lib/migrations'; addMigration({ diff --git a/apps/meteor/server/startup/migrations/v259.ts b/apps/meteor/server/startup/migrations/v259.ts index 99abc566fa75..2faf566997e9 100644 --- a/apps/meteor/server/startup/migrations/v259.ts +++ b/apps/meteor/server/startup/migrations/v259.ts @@ -1,5 +1,6 @@ +import { Settings } from '@rocket.chat/models'; + import { addMigration } from '../../lib/migrations'; -import { Settings } from '../../../app/models/server/raw'; import { Users } from '../../../app/models/server'; addMigration({ diff --git a/apps/meteor/server/startup/migrations/v260.ts b/apps/meteor/server/startup/migrations/v260.ts index 233334617aa1..b92e10bc7173 100644 --- a/apps/meteor/server/startup/migrations/v260.ts +++ b/apps/meteor/server/startup/migrations/v260.ts @@ -1,9 +1,9 @@ import { ILivechatVisitor } from '@rocket.chat/core-typings'; import { BulkWriteOperation, Cursor } from 'mongodb'; +import { LivechatVisitors } from '@rocket.chat/models'; import { addMigration } from '../../lib/migrations'; -import { LivechatVisitors, Users } from '../../../app/models/server'; -import { LivechatVisitors as VisitorsRaw } from '../../../app/models/server/raw'; +import { Users } from '../../../app/models/server'; const getNextPageCursor = (skip: number, limit: number): Cursor => { return LivechatVisitors.find({ 'visitorEmails.address': /[A-Z]/ }, { skip, limit, sort: { _id: 1 } }); @@ -12,9 +12,9 @@ const getNextPageCursor = (skip: number, limit: number): Cursor[] = []; - const count = LivechatVisitors.find({ 'visitorEmails.address': /[A-Z]/ }).count(); + const count = await LivechatVisitors.find({ 'visitorEmails.address': /[A-Z]/ }).count(); const limit = 5000; let skip = 0; @@ -32,7 +32,8 @@ addMigration({ }); if (updates.length) { - Promise.await(VisitorsRaw.col.bulkWrite(updates)); + // eslint-disable-next-line no-await-in-loop + await LivechatVisitors.col.bulkWrite(updates); } incrementSkip(limit); diff --git a/apps/meteor/server/startup/migrations/v261.ts b/apps/meteor/server/startup/migrations/v261.ts index 64bd372e7e39..3499572fec09 100644 --- a/apps/meteor/server/startup/migrations/v261.ts +++ b/apps/meteor/server/startup/migrations/v261.ts @@ -1,5 +1,6 @@ +import { Settings } from '@rocket.chat/models'; + import { addMigration } from '../../lib/migrations'; -import { Settings } from '../../../app/models/server/raw'; import { Users } from '../../../app/models/server'; addMigration({ diff --git a/apps/meteor/server/startup/migrations/v262.ts b/apps/meteor/server/startup/migrations/v262.ts index 47496885909d..dd485ce5152d 100644 --- a/apps/meteor/server/startup/migrations/v262.ts +++ b/apps/meteor/server/startup/migrations/v262.ts @@ -1,5 +1,6 @@ +import { Settings } from '@rocket.chat/models'; + import { addMigration } from '../../lib/migrations'; -import { Settings } from '../../../app/models/server/raw'; addMigration({ version: 262, diff --git a/apps/meteor/server/startup/migrations/v265.ts b/apps/meteor/server/startup/migrations/v265.ts index 66635838c165..fbf7e38cf7d9 100644 --- a/apps/meteor/server/startup/migrations/v265.ts +++ b/apps/meteor/server/startup/migrations/v265.ts @@ -1,10 +1,12 @@ +import { Integrations } from '@rocket.chat/models'; + import { addMigration } from '../../lib/migrations'; -import { Integrations } from '../../../app/models/server/raw'; addMigration({ version: 265, async up() { // Load all integrations that have an `avatarUrl` and don't have an `avatar` + const integrations = await Integrations.find<{ _id: string; avatarUrl: string }>( { avatarUrl: { diff --git a/apps/meteor/server/startup/migrations/v266.ts b/apps/meteor/server/startup/migrations/v266.ts index a2c016b1c571..c1ee7aac2c69 100644 --- a/apps/meteor/server/startup/migrations/v266.ts +++ b/apps/meteor/server/startup/migrations/v266.ts @@ -1,5 +1,6 @@ +import { Rooms } from '@rocket.chat/models'; + import { addMigration } from '../../lib/migrations'; -import { Rooms } from '../../../app/models/server/raw'; addMigration({ version: 266, diff --git a/apps/meteor/server/startup/migrations/v268.ts b/apps/meteor/server/startup/migrations/v268.ts index b3202af1a870..5d88f34eadbf 100644 --- a/apps/meteor/server/startup/migrations/v268.ts +++ b/apps/meteor/server/startup/migrations/v268.ts @@ -1,5 +1,6 @@ +import { Settings } from '@rocket.chat/models'; + import { addMigration } from '../../lib/migrations'; -import { Settings } from '../../../app/models/server/raw'; // Removes deprecated RDStation functionality from Omnichannel addMigration({ diff --git a/apps/meteor/server/startup/presence.js b/apps/meteor/server/startup/presence.js index 55bc5cda8b4f..dbc79e7603a5 100644 --- a/apps/meteor/server/startup/presence.js +++ b/apps/meteor/server/startup/presence.js @@ -1,7 +1,7 @@ import { Meteor } from 'meteor/meteor'; import { UserPresence } from 'meteor/konecty:user-presence'; +import { InstanceStatus, UsersSessions } from '@rocket.chat/models'; -import { InstanceStatus, UsersSessions } from '../../app/models/server/raw'; import { isPresenceMonitorEnabled } from '../lib/isPresenceMonitorEnabled'; Meteor.startup(function () { diff --git a/apps/meteor/server/stream/streamBroadcast.js b/apps/meteor/server/stream/streamBroadcast.js index c49db2f543e6..5a4cd0567b0a 100644 --- a/apps/meteor/server/stream/streamBroadcast.js +++ b/apps/meteor/server/stream/streamBroadcast.js @@ -3,13 +3,13 @@ import { UserPresence } from 'meteor/konecty:user-presence'; import { InstanceStatus } from 'meteor/konecty:multiple-instances-status'; import { check } from 'meteor/check'; import { DDP } from 'meteor/ddp'; +import { InstanceStatus as InstanceStatusRaw } from '@rocket.chat/models'; import { Logger } from '../lib/logger/Logger'; import { hasPermission } from '../../app/authorization/server'; import { settings } from '../../app/settings/server'; import { isDocker, getURL } from '../../app/utils/server'; import { Users } from '../../app/models/server'; -import { InstanceStatus as InstanceStatusRaw } from '../../app/models/server/raw'; import { StreamerCentral } from '../modules/streamer/streamer.module'; import { isPresenceMonitorEnabled } from '../lib/isPresenceMonitorEnabled'; diff --git a/apps/meteor/tests/e2e/11-admin.spec.ts b/apps/meteor/tests/e2e/11-admin.spec.ts index 95ed3527df92..d422dfb180d4 100644 --- a/apps/meteor/tests/e2e/11-admin.spec.ts +++ b/apps/meteor/tests/e2e/11-admin.spec.ts @@ -187,6 +187,7 @@ test.describe('[Administration]', () => { test('expect change site url reset button is showed', async () => { await admin.generalSiteUrl.type('something'); await expect(admin.generalSiteUrlReset).toBeVisible(); + await admin.generalSiteUrlReset.click(); }); test('expect change site name reset button is showed', async () => { diff --git a/apps/meteor/tests/unit/app/apps/server/messages.tests.js b/apps/meteor/tests/unit/app/apps/server/messages.tests.js index 91db1c7ace1e..574492831c55 100644 --- a/apps/meteor/tests/unit/app/apps/server/messages.tests.js +++ b/apps/meteor/tests/unit/app/apps/server/messages.tests.js @@ -7,7 +7,7 @@ import { MessagesMock } from './mocks/models/Messages.mock'; import { RoomsMock } from './mocks/models/Rooms.mock'; import { UsersMock } from './mocks/models/Users.mock'; -mock('../../../../../app/models', './mocks/models'); +mock('../../../../../app/models/server', './mocks/models'); mock('meteor/random', { id: () => 1, }); diff --git a/apps/meteor/tests/unit/app/models/server/raw/Sessions.tests.js b/apps/meteor/tests/unit/app/models/server/raw/Sessions.tests.js index 373e7637477f..05d26da43db4 100644 --- a/apps/meteor/tests/unit/app/models/server/raw/Sessions.tests.js +++ b/apps/meteor/tests/unit/app/models/server/raw/Sessions.tests.js @@ -3,7 +3,7 @@ import { MongoMemoryServer } from 'mongodb-memory-server'; const { MongoClient } = require('mongodb'); -const { aggregates } = require('../../../../../../app/models/server/raw/Sessions'); +const { aggregates } = require('../../../../../../server/models/raw/Sessions'); const sessions_dates = []; const baseDate = new Date(2018, 6, 1); diff --git a/apps/meteor/tests/unit/lib/utils/parseParameters.tests.ts b/apps/meteor/tests/unit/lib/utils/parseParameters.tests.ts new file mode 100644 index 000000000000..43e5bbd90dd0 --- /dev/null +++ b/apps/meteor/tests/unit/lib/utils/parseParameters.tests.ts @@ -0,0 +1,185 @@ +import { expect } from 'chai'; + +import { parseParameters } from '../../../../lib/utils/parseParameters'; + +describe('Parse Parameters', () => { + it('should return an empty array for an empty string', () => { + const result = parseParameters(''); + + expect(result).to.be.an('Array').with.lengthOf(0); + }); + + it('should return an array with one item', () => { + const value = 'value'; + const result = parseParameters(value); + + expect(result).to.be.an('Array').with.lengthOf(1).and.eql([value]); + }); + + it('should return an array with three items', () => { + const value1 = 'value1'; + const value2 = 'value2'; + const value3 = 'value3'; + + const parameters = `${value1} ${value2} ${value3}`; + const result = parseParameters(parameters); + + expect(result).to.be.an('Array').with.lengthOf(3).and.eql([value1, value2, value3]); + }); + + it('should ignore extra spaces by default', () => { + const value1 = 'value1'; + const value2 = 'value2'; + + const parameters = ` ${value1} ${value2} `; + const result = parseParameters(parameters); + + expect(result).to.be.an('Array').with.lengthOf(2).and.eql([value1, value2]); + }); + + it('should NOT ignore extra spaces when requested', () => { + const value1 = ''; + const value2 = ''; + const value3 = 'value3'; + const value4 = ''; + const value5 = ''; + const value6 = 'value6'; + const value7 = ''; + const value8 = ''; + + const parameters = `${value1} ${value2} ${value3} ${value4} ${value5} ${value6} ${value7} ${value8}`; + const result = parseParameters(parameters, false); + + expect(result).to.be.an('Array').with.lengthOf(8).and.eql([value1, value2, value3, value4, value5, value6, value7, value8]); + }); + + it('should return an array with one item without quotes', () => { + const value = 'value'; + const result = parseParameters(`"${value}"`); + + expect(result).to.be.an('Array').with.lengthOf(1).and.eql([value]); + }); + it('should return an array with three items without quotes', () => { + const value1 = 'value1'; + const value2 = 'value2'; + const value3 = 'value3'; + const result = parseParameters(`"${value1}" "${value2}" "${value3}"`); + + expect(result).to.be.an('Array').with.lengthOf(3).and.eql([value1, value2, value3]); + }); + + it('should not trim spaces inside quotes', () => { + const value1 = 'value1 '; + const value2 = ' value2'; + const value3 = ' value3 '; + + const parameters = `"${value1}" "${value2}" "${value3}"`; + const result = parseParameters(parameters); + + expect(result).to.be.an('Array').with.lengthOf(3).and.eql([value1, value2, value3]); + }); + + it('should split parameters even without spaces', () => { + const value1 = 'value1'; + const value2 = 'value2'; + const value3 = 'value3'; + const value4 = 'value4'; + + const parameters = `"${value1}""${value2}""${value3}" "${value4}"`; + const result = parseParameters(parameters); + + expect(result).to.be.an('Array').with.lengthOf(4).and.eql([value1, value2, value3, value4]); + }); + + it('should split parameters by both spaces and quotes in the same line', () => { + const value1 = 'value1'; + const value2 = 'value2'; + + const parameters = `"${value1}" ${value2}`; + const result = parseParameters(parameters); + + expect(result).to.be.an('Array').with.lengthOf(2).and.eql([value1, value2]); + }); + + it('should unescape quotes inside values', () => { + const value1 = `this is \\"value1\\" here`; + const value2 = `\\"value2\\"`; + + const parameters = `"${value1}" "${value2}"`; + const result = parseParameters(parameters); + + expect(result).to.be.an('Array').with.lengthOf(2); + expect(result[0]).to.be.equal(value1.replace(/\\\"/g, '"')); + expect(result[1]).to.be.equal(value2.replace(/\\\"/g, '"')); + }); + + it('should not ignore empty quoted parameters', () => { + const value1 = 'value1'; + const value2 = ''; + const value3 = 'value3'; + + const parameters = `"${value1}" "${value2}" "${value3}"`; + const result = parseParameters(parameters); + + expect(result).to.be.an('Array').with.lengthOf(3).and.eql([value1, value2, value3]); + }); + + it('should accept line breaks inside quotes', () => { + const value1 = `value1 + is multiline`; + const value2 = 'value2\nhas a multine too'; + const value3 = 'value3\rhas a carriage return'; + + const parameters = `"${value1}" "${value2}" "${value3}"`; + const result = parseParameters(parameters); + + expect(result).to.be.an('Array').with.lengthOf(3); + expect(result[0]).to.be.equal(value1); + expect(result[1]).to.be.equal(value2); + expect(result[2]).to.be.equal(value3); + }); + + it('should split on line breaks without quotes', () => { + const value1 = `value1`; + const value2 = 'value2'; + const value3 = 'value3'; + + const parameters = `${value1} +${value2} +${value3}`; + + const result = parseParameters(parameters); + + expect(result).to.be.an('Array').with.lengthOf(3); + expect(result[0]).to.be.equal(value1); + expect(result[1]).to.be.equal(value2); + expect(result[2]).to.be.equal(value3); + }); + + it('should accept tabs inside quotes', () => { + const value1 = `value1 is tabbed`; + const value2 = 'value2'; + + const parameters = `"${value1}" "${value2}"`; + const result = parseParameters(parameters); + + expect(result).to.be.an('Array').with.lengthOf(2); + expect(result[0]).to.be.equal(value1); + expect(result[1]).to.be.equal(value2); + }); + + it('should split on tabs without quotes', () => { + const value1 = `value1`; + const value2 = 'value2'; + const value3 = 'value3'; + + const parameters = `${value1} ${value2} ${value3}`; + + const result = parseParameters(parameters); + + expect(result).to.be.an('Array').with.lengthOf(3); + expect(result[0]).to.be.equal(value1); + expect(result[1]).to.be.equal(value2); + expect(result[2]).to.be.equal(value3); + }); +}); diff --git a/ee/apps/ddp-streamer/Dockerfile b/ee/apps/ddp-streamer/Dockerfile index a81e2cbb7047..6f03ce1d541e 100644 --- a/ee/apps/ddp-streamer/Dockerfile +++ b/ee/apps/ddp-streamer/Dockerfile @@ -8,6 +8,10 @@ COPY ./packages/core-typings/package.json packages/core-typings/package.json COPY ./packages/core-typings/dist packages/core-typings/dist COPY ./packages/rest-typings/package.json packages/rest-typings/package.json COPY ./packages/rest-typings/dist packages/rest-typings/dist +COPY ./packages/model-typings/package.json packages/model-typings/package.json +COPY ./packages/model-typings/dist packages/model-typings/dist +COPY ./packages/models/package.json packages/models/package.json +COPY ./packages/models/dist packages/models/dist COPY ./packages/ui-contexts/package.json packages/ui-contexts/package.json COPY ./packages/ui-contexts/dist packages/ui-contexts/dist diff --git a/ee/apps/ddp-streamer/package.json b/ee/apps/ddp-streamer/package.json index be83b6cfe9aa..16068c55f23b 100644 --- a/ee/apps/ddp-streamer/package.json +++ b/ee/apps/ddp-streamer/package.json @@ -15,6 +15,8 @@ "@rocket.chat/apps-engine": "^1.31.0", "@rocket.chat/core-typings": "workspace:^", "@rocket.chat/emitter": "~0.31.9", + "@rocket.chat/model-typings": "workspace:^", + "@rocket.chat/models": "workspace:^", "@rocket.chat/rest-typings": "workspace:^", "@rocket.chat/string-helpers": "~0.31.9", "@rocket.chat/ui-contexts": "workspace:^", diff --git a/ee/apps/ddp-streamer/src/streams.ts b/ee/apps/ddp-streamer/src/streams.ts index 5d88188d9fcb..c1113f08d7b1 100644 --- a/ee/apps/ddp-streamer/src/streams.ts +++ b/ee/apps/ddp-streamer/src/streams.ts @@ -1,23 +1,12 @@ -import type { ISubscription, IRoom, IUser, ISetting } from '@rocket.chat/core-typings'; - import { NotificationsModule } from '../../../../apps/meteor/server/modules/notifications/notifications.module'; import { Stream } from './Streamer'; -import { Collections, getConnection } from '../../../../apps/meteor/ee/server/services/mongo'; -import { RoomsRaw } from '../../../../apps/meteor/app/models/server/raw/Rooms'; -import { SubscriptionsRaw } from '../../../../apps/meteor/app/models/server/raw/Subscriptions'; -import { UsersRaw } from '../../../../apps/meteor/app/models/server/raw/Users'; -import { SettingsRaw } from '../../../../apps/meteor/app/models/server/raw/Settings'; +import { getConnection } from '../../../../apps/meteor/ee/server/services/mongo'; +import { registerServiceModels } from '../../../../apps/meteor/ee/server/lib/registerServiceModels'; export const notifications = new NotificationsModule(Stream); getConnection().then((db) => { - const Users = new UsersRaw(db.collection(Collections.User)); - notifications.configure({ - Rooms: new RoomsRaw(db.collection(Collections.Rooms)), - Subscriptions: new SubscriptionsRaw(db.collection(Collections.Subscriptions), { - Users, - }), - Users, - Settings: new SettingsRaw(db.collection(Collections.Settings)), - }); + registerServiceModels(db); + + notifications.configure(); }); diff --git a/package.json b/package.json index c01189159bbf..4ad871604c5e 100644 --- a/package.json +++ b/package.json @@ -56,5 +56,8 @@ "volta": { "node": "14.18.3", "yarn": "1.22.18" + }, + "resolutions": { + "minimist": "1.2.6" } } diff --git a/packages/core-typings/src/Federation.ts b/packages/core-typings/src/Federation.ts index 92b482e48a92..921af4dbba8d 100644 --- a/packages/core-typings/src/Federation.ts +++ b/packages/core-typings/src/Federation.ts @@ -3,3 +3,8 @@ import type { IRocketChatRecord } from './IRocketChatRecord'; export interface IFederationServer extends IRocketChatRecord { domain: string; } + +export type FederationKey = { + type: 'private' | 'public'; + key: string; +}; diff --git a/packages/core-typings/src/ILivechatVisitor.ts b/packages/core-typings/src/ILivechatVisitor.ts index d7e2772721e6..2759b96099c9 100644 --- a/packages/core-typings/src/ILivechatVisitor.ts +++ b/packages/core-typings/src/ILivechatVisitor.ts @@ -20,6 +20,10 @@ export interface IVisitorEmail { address: string; } +interface ILivechatData { + [k: string]: unknown; +} + export interface ILivechatVisitor extends IRocketChatRecord { username: string; ts: Date; @@ -32,6 +36,12 @@ export interface ILivechatVisitor extends IRocketChatRecord { ip?: string; host?: string; visitorEmails?: IVisitorEmail[]; + lastAgent?: { + username: string; + agentId: string; + ts: Date; + }; + livechatData?: ILivechatData; contactManager?: { username: string; }; diff --git a/packages/livechat/package.json b/packages/livechat/package.json index 14c3e5c79c8d..8026ed74fc95 100644 --- a/packages/livechat/package.json +++ b/packages/livechat/package.json @@ -76,7 +76,7 @@ "url-loader": "^4.1.0", "webpack": "^4.44.1", "webpack-cli": "^3.3.12", - "webpack-dev-server": "^3.11.0" + "webpack-dev-server": "^4.9.2" }, "dependencies": { "@rocket.chat/fuselage-tokens": "~0.31.11", diff --git a/packages/model-typings/package.json b/packages/model-typings/package.json new file mode 100644 index 000000000000..5759c40708da --- /dev/null +++ b/packages/model-typings/package.json @@ -0,0 +1,36 @@ +{ + "name": "@rocket.chat/model-typings", + "version": "0.0.1", + "private": true, + "devDependencies": { + "@types/jest": "^27.4.1", + "@types/mongodb": "^3.6.10", + "@types/node-rsa": "^1.1.1", + "eslint": "^8.12.0", + "jest": "^27.5.1", + "ts-jest": "^27.1.4", + "typescript": "~4.3.4" + }, + "scripts": { + "lint": "eslint --ext .js,.jsx,.ts,.tsx .", + "lint:fix": "eslint --ext .js,.jsx,.ts,.tsx . --fix", + "jest": "jest", + "build": "rm -rf dist && tsc -p tsconfig.json" + }, + "main": "./dist/index.js", + "typings": "./dist/index.d.ts", + "files": [ + "/dist" + ], + "eslintConfig": { + "extends": [ + "@rocket.chat/eslint-config" + ], + "ignorePatterns": [ + "**/dist" + ] + }, + "dependencies": { + "@rocket.chat/core-typings": "workspace:^" + } +} diff --git a/packages/model-typings/src/index.ts b/packages/model-typings/src/index.ts new file mode 100644 index 000000000000..e72bf92b0b4c --- /dev/null +++ b/packages/model-typings/src/index.ts @@ -0,0 +1,61 @@ +export * from './models/IAnalyticsModel'; +export * from './models/IAvatarsModel'; +export * from './models/IBannersDismissModel'; +export * from './models/IBannersModel'; +export * from './models/IBaseModel'; +export * from './models/ICannedResponseModel'; +export * from './models/ICredentialTokensModel'; +export * from './models/ICustomSoundsModel'; +export * from './models/ICustomUserStatusModel'; +export * from './models/IEmailInboxModel'; +export * from './models/IEmailMessageHistoryModel'; +export * from './models/IEmojiCustomModel'; +export * from './models/IExportOperationsModel'; +export * from './models/IFederationKeysModel'; +export * from './models/IFederationServersModel'; +export * from './models/IInstanceStatusModel'; +export * from './models/IIntegrationHistoryModel'; +export * from './models/IIntegrationsModel'; +export * from './models/IInvitesModel'; +export * from './models/IImportDataModel'; +export * from './models/ILivechatAgentActivityModel'; +export * from './models/ILivechatBusinessHoursModel'; +export * from './models/ILivechatCustomFieldModel'; +export * from './models/ILivechatDepartmentAgentsModel'; +export * from './models/ILivechatDepartmentModel'; +export * from './models/ILivechatInquiryModel'; +export * from './models/ILivechatPriorityModel'; +export * from './models/ILivechatRoomsModel'; +export * from './models/ILivechatTagModel'; +export * from './models/ILivechatTriggerModel'; +export * from './models/ILivechatUnitModel'; +export * from './models/ILivechatUnitMonitorsModel'; +export * from './models/ILivechatVisitorsModel'; +export * from './models/ILoginServiceConfigurationModel'; +export * from './models/IMessagesModel'; +export * from './models/INotificationQueueModel'; +export * from './models/INpsModel'; +export * from './models/INpsVoteModel'; +export * from './models/IOAuthAppsModel'; +export * from './models/IOEmbedCacheModel'; +export * from './models/IOmnichannelQueueModel'; +export * from './models/IPbxEventsModel'; +export * from './models/IPermissionsModel'; +export * from './models/IReadReceiptsModel'; +export * from './models/IReportsModel'; +export * from './models/IRolesModel'; +export * from './models/IRoomsModel'; +export * from './models/IServerEventsModel'; +export * from './models/ISessionsModel'; +export * from './models/ISettingsModel'; +export * from './models/ISmarshHistoryModel'; +export * from './models/IStatisticsModel'; +export * from './models/ISubscriptionsModel'; +export * from './models/ITeamMemberModel'; +export * from './models/ITeamModel'; +export * from './models/IUploadsModel'; +export * from './models/IUserDataFilesModel'; +export * from './models/IUsersModel'; +export * from './models/IUsersSessionsModel'; +export * from './models/IVoipRoomModel'; +export * from './models/IWebdavAccountsModel'; diff --git a/packages/model-typings/src/models/IAnalyticsModel.ts b/packages/model-typings/src/models/IAnalyticsModel.ts new file mode 100644 index 000000000000..ff818a9b78c6 --- /dev/null +++ b/packages/model-typings/src/models/IAnalyticsModel.ts @@ -0,0 +1,41 @@ +import type { IAnalytic, IRoom } from '@rocket.chat/core-typings'; +import type { AggregationCursor, Cursor, SortOptionObject, UpdateWriteOpResult } from 'mongodb'; + +import type { IBaseModel } from './IBaseModel'; + +export interface IAnalyticsModel extends IBaseModel { + saveMessageSent({ room, date }: { room: IRoom; date: IAnalytic['date'] }): Promise; + saveUserData({ date }: { date: IAnalytic['date'] }): Promise; + saveMessageDeleted({ room, date }: { room: { _id: string }; date: IAnalytic['date'] }): Promise; + getMessagesSentTotalByDate(params: { + start: IAnalytic['date']; + end: IAnalytic['date']; + options?: { sort?: SortOptionObject; count?: number }; + }): AggregationCursor<{ + _id: IAnalytic['date']; + messages: number; + }>; + getMessagesOrigin({ start, end }: { start: IAnalytic['date']; end: IAnalytic['date'] }): AggregationCursor<{ + t: IRoom['t']; + messages: number; + }>; + getMostPopularChannelsByMessagesSentQuantity(params: { + start: IAnalytic['date']; + end: IAnalytic['date']; + options?: { sort?: SortOptionObject; count?: number }; + }): AggregationCursor<{ + t: IRoom['t']; + name: string; + messages: number; + usernames: string[]; + }>; + getTotalOfRegisteredUsersByDate(params: { + start: IAnalytic['date']; + end: IAnalytic['date']; + options?: { sort?: SortOptionObject; count?: number }; + }): AggregationCursor<{ + _id: IAnalytic['date']; + users: number; + }>; + findByTypeBeforeDate({ type, date }: { type: IAnalytic['type']; date: IAnalytic['date'] }): Cursor; +} diff --git a/packages/model-typings/src/models/IAvatarsModel.ts b/packages/model-typings/src/models/IAvatarsModel.ts new file mode 100644 index 000000000000..9a0efc751044 --- /dev/null +++ b/packages/model-typings/src/models/IAvatarsModel.ts @@ -0,0 +1,13 @@ +import type { DeleteWriteOpResultObject, UpdateWriteOpResult } from 'mongodb'; +import type { IAvatar } from '@rocket.chat/core-typings'; + +import type { IBaseModel } from './IBaseModel'; + +export interface IAvatarsModel extends IBaseModel { + insertAvatarFileInit(name: string, userId: string, store: string, file: { name: string }, extra: object): Promise; + updateFileComplete(fileId: string, userId: string, file: object): Promise | undefined; + findOneByName(name: string): Promise; + findOneByRoomId(rid: string): Promise; + updateFileNameById(fileId: string, name: string): Promise; + deleteFile(fileId: string): Promise; +} diff --git a/packages/model-typings/src/models/IBannersDismissModel.ts b/packages/model-typings/src/models/IBannersDismissModel.ts new file mode 100644 index 000000000000..e53bce29c856 --- /dev/null +++ b/packages/model-typings/src/models/IBannersDismissModel.ts @@ -0,0 +1,26 @@ +import type { Cursor, FindOneOptions, WithoutProjection } from 'mongodb'; +import type { IBannerDismiss } from '@rocket.chat/core-typings'; + +import type { IBaseModel } from './IBaseModel'; + +export interface IBannersDismissModel extends IBaseModel { + findByUserIdAndBannerId(userId: string, bannerIds: string[]): Cursor; + + findByUserIdAndBannerId( + userId: string, + bannerIds: string[], + options: WithoutProjection>, + ): Cursor; + + findByUserIdAndBannerId

( + userId: string, + bannerIds: string[], + options: FindOneOptions

, + ): Cursor

; + + findByUserIdAndBannerId

( + userId: string, + bannerIds: string[], + options?: undefined | WithoutProjection> | FindOneOptions

, + ): Cursor

| Cursor; +} diff --git a/packages/model-typings/src/models/IBannersModel.ts b/packages/model-typings/src/models/IBannersModel.ts new file mode 100644 index 000000000000..90a9c2885c53 --- /dev/null +++ b/packages/model-typings/src/models/IBannersModel.ts @@ -0,0 +1,15 @@ +import type { Cursor, FindOneOptions, UpdateWriteOpResult, WithoutProjection, InsertOneWriteOpResult } from 'mongodb'; +import type { BannerPlatform, IBanner } from '@rocket.chat/core-typings'; + +import type { IBaseModel } from './IBaseModel'; + +export interface IBannersModel extends IBaseModel { + create(doc: IBanner): Promise>; + findActiveByRoleOrId( + roles: string[], + platform: BannerPlatform, + bannerId?: string, + options?: WithoutProjection>, + ): Cursor; + disable(bannerId: string): Promise; +} diff --git a/packages/model-typings/src/models/IBaseModel.ts b/packages/model-typings/src/models/IBaseModel.ts new file mode 100644 index 000000000000..01780f199f22 --- /dev/null +++ b/packages/model-typings/src/models/IBaseModel.ts @@ -0,0 +1,125 @@ +import type { + ChangeStream, + Collection, + CollectionInsertOneOptions, + CommonOptions, + Cursor, + DeleteWriteOpResultObject, + FilterQuery, + FindAndModifyWriteOpResultObject, + FindOneAndUpdateOption, + FindOneOptions, + InsertOneWriteOpResult, + InsertWriteOpResult, + ObjectId, + UpdateManyOptions, + UpdateOneOptions, + UpdateQuery, + UpdateWriteOpResult, + WithId, + WithoutProjection, + WriteOpResult, +} from 'mongodb'; +import type { RocketChatRecordDeleted } from '@rocket.chat/core-typings'; + +type EnhancedOmit = string | number extends keyof T + ? T // T has indexed type e.g. { _id: string; [k: string]: any; } or it is "any" + : T extends any + ? Pick> // discriminated unions + : never; + +type ExtractIdType = TSchema extends { _id: infer U } // user has defined a type for _id + ? {} extends U + ? Exclude + : unknown extends U + ? ObjectId + : U + : ObjectId; + +export type DefaultFields = Record | Record | void; +export type ResultFields = Defaults extends void + ? Base + : Defaults[keyof Defaults] extends 1 + ? Pick + : Omit; + +export type ModelOptionalId = EnhancedOmit & { _id?: ExtractIdType }; +export type InsertionModel = EnhancedOmit, '_updatedAt'> & { + _updatedAt?: Date; +}; + +export interface IBaseModel = undefined> { + col: Collection; + + findOneAndUpdate( + query: FilterQuery, + update: UpdateQuery | T, + options?: FindOneAndUpdateOption, + ): Promise>; + findOneById(_id: string, options?: WithoutProjection> | undefined): Promise; + findOneById

(_id: string, options: FindOneOptions

): Promise

; + findOneById

(_id: string, options?: any): Promise; + findOne(query?: FilterQuery | string, options?: undefined): Promise; + findOne(query: FilterQuery | string, options: WithoutProjection>): Promise; + findOne

(query: FilterQuery | string, options?: any): Promise; + find(query?: FilterQuery): Cursor>; + find(query: FilterQuery, options: WithoutProjection>): Cursor>; + find

(query: FilterQuery, options: FindOneOptions

): Cursor

; + update( + filter: FilterQuery, + update: UpdateQuery | Partial, + options?: UpdateOneOptions & { multi?: boolean }, + ): Promise; + updateOne( + filter: FilterQuery, + update: UpdateQuery | Partial, + options?: UpdateOneOptions & { multi?: boolean }, + ): Promise; + updateMany(filter: FilterQuery, update: UpdateQuery | Partial, options?: UpdateManyOptions): Promise; + insertMany(docs: Array>, options?: CollectionInsertOneOptions): Promise>>; + insertOne(doc: InsertionModel, options?: CollectionInsertOneOptions): Promise>>; + removeById(_id: string): Promise; + deleteOne(filter: FilterQuery, options?: CommonOptions & { bypassDocumentValidation?: boolean }): Promise; + deleteMany(filter: FilterQuery, options?: CommonOptions): Promise; + trashFind

>( + query: FilterQuery>, + options: FindOneOptions

? RocketChatRecordDeleted : P>, + ): Cursor> | undefined; + trashFindOneById(_id: string): Promise | null>; + trashFindOneById( + _id: string, + options: WithoutProjection>, + ): Promise> | null>; + trashFindOneById

( + _id: string, + options: FindOneOptions

? RocketChatRecordDeleted : P>, + ): Promise

; + trashFindOneById

>( + _id: string, + options?: + | undefined + | WithoutProjection> + | FindOneOptions

? RocketChatRecordDeleted : P>, + ): Promise | null>; + trashFindDeletedAfter(deletedAt: Date): Cursor>; + trashFindDeletedAfter( + deletedAt: Date, + query: FilterQuery>, + options: WithoutProjection>, + ): Cursor>; + trashFindDeletedAfter

>( + deletedAt: Date, + query: FilterQuery

, + options: FindOneOptions

? RocketChatRecordDeleted : P>, + ): Cursor>; + + trashFindDeletedAfter

>( + deletedAt: Date, + query?: FilterQuery>, + options?: + | WithoutProjection> + | FindOneOptions

? RocketChatRecordDeleted : P>, + ): Cursor>; + + watch(pipeline?: object[]): ChangeStream; +} diff --git a/packages/model-typings/src/models/ICannedResponseModel.ts b/packages/model-typings/src/models/ICannedResponseModel.ts new file mode 100644 index 000000000000..409cd959b7db --- /dev/null +++ b/packages/model-typings/src/models/ICannedResponseModel.ts @@ -0,0 +1,8 @@ +import type { IRocketChatRecord } from '@rocket.chat/core-typings'; + +import type { IBaseModel } from './IBaseModel'; + +// eslint-disable-next-line @typescript-eslint/no-empty-interface +export interface ICannedResponseModel extends IBaseModel { + // +} diff --git a/packages/model-typings/src/models/ICredentialTokensModel.ts b/packages/model-typings/src/models/ICredentialTokensModel.ts new file mode 100644 index 000000000000..9643a183dfcd --- /dev/null +++ b/packages/model-typings/src/models/ICredentialTokensModel.ts @@ -0,0 +1,8 @@ +import type { ICredentialToken } from '@rocket.chat/core-typings'; + +import type { IBaseModel } from './IBaseModel'; + +export interface ICredentialTokensModel extends IBaseModel { + create(_id: string, userInfo: ICredentialToken['userInfo']): Promise; + findOneNotExpiredById(_id: string): Promise; +} diff --git a/packages/model-typings/src/models/ICustomSoundsModel.ts b/packages/model-typings/src/models/ICustomSoundsModel.ts new file mode 100644 index 000000000000..07670b6e913c --- /dev/null +++ b/packages/model-typings/src/models/ICustomSoundsModel.ts @@ -0,0 +1,11 @@ +import type { Cursor, FindOneOptions, InsertOneWriteOpResult, UpdateWriteOpResult, WithId, WithoutProjection } from 'mongodb'; +import type { ICustomSound } from '@rocket.chat/core-typings'; + +import type { IBaseModel } from './IBaseModel'; + +export interface ICustomSoundsModel extends IBaseModel { + findByName(name: string, options: WithoutProjection>): Cursor; + findByNameExceptId(name: string, except: string, options: WithoutProjection>): Cursor; + setName(_id: string, name: string): Promise; + create(data: ICustomSound): Promise>>; +} diff --git a/packages/model-typings/src/models/ICustomUserStatusModel.ts b/packages/model-typings/src/models/ICustomUserStatusModel.ts new file mode 100644 index 000000000000..50be08da9378 --- /dev/null +++ b/packages/model-typings/src/models/ICustomUserStatusModel.ts @@ -0,0 +1,18 @@ +import type { Cursor, FindOneOptions, InsertOneWriteOpResult, UpdateWriteOpResult, WithId, WithoutProjection } from 'mongodb'; +import type { ICustomUserStatus } from '@rocket.chat/core-typings'; + +import type { IBaseModel } from './IBaseModel'; + +export interface ICustomUserStatusModel extends IBaseModel { + findOneByName(name: string, options?: undefined): Promise; + findOneByName(name: string, options?: WithoutProjection>): Promise; + findByName(name: string, options: WithoutProjection>): Cursor; + findByNameExceptId( + name: string, + except: string, + options: WithoutProjection>, + ): Cursor; + setName(_id: string, name: string): Promise; + setStatusType(_id: string, statusType: string): Promise; + create(data: ICustomUserStatus): Promise>>; +} diff --git a/packages/model-typings/src/models/IEmailInboxModel.ts b/packages/model-typings/src/models/IEmailInboxModel.ts new file mode 100644 index 000000000000..1bb235848535 --- /dev/null +++ b/packages/model-typings/src/models/IEmailInboxModel.ts @@ -0,0 +1,8 @@ +import type { IEmailInbox } from '@rocket.chat/core-typings'; + +import type { IBaseModel } from './IBaseModel'; + +// eslint-disable-next-line @typescript-eslint/no-empty-interface +export interface IEmailInboxModel extends IBaseModel { + // +} diff --git a/packages/model-typings/src/models/IEmailMessageHistoryModel.ts b/packages/model-typings/src/models/IEmailMessageHistoryModel.ts new file mode 100644 index 000000000000..926a88e68031 --- /dev/null +++ b/packages/model-typings/src/models/IEmailMessageHistoryModel.ts @@ -0,0 +1,8 @@ +import type { InsertOneWriteOpResult, WithId } from 'mongodb'; +import type { IEmailMessageHistory } from '@rocket.chat/core-typings'; + +import type { IBaseModel } from './IBaseModel'; + +export interface IEmailMessageHistoryModel extends IBaseModel { + create({ _id, email }: IEmailMessageHistory): Promise>>; +} diff --git a/packages/model-typings/src/models/IEmojiCustomModel.ts b/packages/model-typings/src/models/IEmojiCustomModel.ts new file mode 100644 index 000000000000..5ba031861f2e --- /dev/null +++ b/packages/model-typings/src/models/IEmojiCustomModel.ts @@ -0,0 +1,13 @@ +import type { Cursor, FindOneOptions, InsertOneWriteOpResult, UpdateWriteOpResult, WithId, WithoutProjection } from 'mongodb'; +import type { IEmojiCustom } from '@rocket.chat/core-typings'; + +import type { IBaseModel } from './IBaseModel'; + +export interface IEmojiCustomModel extends IBaseModel { + findByNameOrAlias(emojiName: string, options: WithoutProjection>): Cursor; + findByNameOrAliasExceptID(name: string, except: string, options: WithoutProjection>): Cursor; + setName(_id: string, name: string): Promise; + setAliases(_id: string, aliases: string[]): Promise; + setExtension(_id: string, extension: string): Promise; + create(data: IEmojiCustom): Promise>>; +} diff --git a/packages/model-typings/src/models/IExportOperationsModel.ts b/packages/model-typings/src/models/IExportOperationsModel.ts new file mode 100644 index 000000000000..708028d29618 --- /dev/null +++ b/packages/model-typings/src/models/IExportOperationsModel.ts @@ -0,0 +1,12 @@ +import type { Cursor, UpdateWriteOpResult } from 'mongodb'; +import type { IExportOperation } from '@rocket.chat/core-typings'; + +import type { IBaseModel } from './IBaseModel'; + +export interface IExportOperationsModel extends IBaseModel { + findOnePending(): Promise; + create(data: IExportOperation): Promise; + findLastOperationByUser(userId: string, fullExport: boolean): Promise; + findAllPendingBeforeMyRequest(requestDay: Date): Cursor; + updateOperation(data: IExportOperation): Promise; +} diff --git a/packages/model-typings/src/models/IFederationKeysModel.ts b/packages/model-typings/src/models/IFederationKeysModel.ts new file mode 100644 index 000000000000..dfe61a6fc534 --- /dev/null +++ b/packages/model-typings/src/models/IFederationKeysModel.ts @@ -0,0 +1,23 @@ +import type NodeRSA from 'node-rsa'; +import type { FederationKey } from '@rocket.chat/core-typings'; + +import type { IBaseModel } from './IBaseModel'; + +export interface IFederationKeysModel extends IBaseModel { + getKey(type: FederationKey['type']): Promise; + + loadKey(keyData: NodeRSA.Key, type: FederationKey['type']): NodeRSA; + + generateKeys(): Promise<{ + privateKey: '' | NodeRSA | null; + publicKey: '' | NodeRSA | null; + }>; + + getPrivateKey(): Promise<'' | NodeRSA | null>; + + getPrivateKeyString(): Promise; + + getPublicKey(): Promise<'' | NodeRSA | null>; + + getPublicKeyString(): Promise; +} diff --git a/packages/model-typings/src/models/IFederationServersModel.ts b/packages/model-typings/src/models/IFederationServersModel.ts new file mode 100644 index 000000000000..af3f06c86915 --- /dev/null +++ b/packages/model-typings/src/models/IFederationServersModel.ts @@ -0,0 +1,9 @@ +import type { UpdateWriteOpResult } from 'mongodb'; +import type { IFederationServer } from '@rocket.chat/core-typings'; + +import type { IBaseModel } from './IBaseModel'; + +export interface IFederationServersModel extends IBaseModel { + saveDomain(domain: string): Promise; + refreshServers(): Promise; +} diff --git a/packages/model-typings/src/models/IImportDataModel.ts b/packages/model-typings/src/models/IImportDataModel.ts new file mode 100644 index 000000000000..b9fd4255c0b3 --- /dev/null +++ b/packages/model-typings/src/models/IImportDataModel.ts @@ -0,0 +1,10 @@ +import type { Cursor } from 'mongodb'; +import type { IImportRecord, IImportUserRecord, IImportMessageRecord, IImportChannelRecord } from '@rocket.chat/core-typings'; + +import type { IBaseModel } from './IBaseModel'; + +export interface IImportDataModel extends IBaseModel { + getAllUsers(): Cursor; + getAllMessages(): Cursor; + getAllChannels(): Cursor; +} diff --git a/packages/model-typings/src/models/IInstanceStatusModel.ts b/packages/model-typings/src/models/IInstanceStatusModel.ts new file mode 100644 index 000000000000..9203c5d56e32 --- /dev/null +++ b/packages/model-typings/src/models/IInstanceStatusModel.ts @@ -0,0 +1,8 @@ +import type { IInstanceStatus } from '@rocket.chat/core-typings'; + +import type { IBaseModel } from './IBaseModel'; + +// eslint-disable-next-line @typescript-eslint/no-empty-interface +export interface IInstanceStatusModel extends IBaseModel { + // +} diff --git a/packages/model-typings/src/models/IIntegrationHistoryModel.ts b/packages/model-typings/src/models/IIntegrationHistoryModel.ts new file mode 100644 index 000000000000..86765893dd53 --- /dev/null +++ b/packages/model-typings/src/models/IIntegrationHistoryModel.ts @@ -0,0 +1,9 @@ +import type { IIntegrationHistory } from '@rocket.chat/core-typings'; + +import type { IBaseModel } from './IBaseModel'; + +export interface IIntegrationHistoryModel extends IBaseModel { + removeByIntegrationId(integrationId: string): ReturnType['deleteMany']>; + + findOneByIntegrationIdAndHistoryId(integrationId: string, historyId: string): Promise; +} diff --git a/packages/model-typings/src/models/IIntegrationsModel.ts b/packages/model-typings/src/models/IIntegrationsModel.ts new file mode 100644 index 000000000000..3cfe6bfcf953 --- /dev/null +++ b/packages/model-typings/src/models/IIntegrationsModel.ts @@ -0,0 +1,10 @@ +import type { IIntegration, IUser } from '@rocket.chat/core-typings'; + +import type { IBaseModel } from './IBaseModel'; + +export interface IIntegrationsModel extends IBaseModel { + findOneByUrl(url: string): Promise; + updateRoomName(oldRoomName: string, newRoomName: string): ReturnType['updateMany']>; + findOneByIdAndCreatedByIfExists(params: { _id: IIntegration['_id']; createdBy?: IUser['_id'] }): Promise; + disableByUserId(userId: string): ReturnType['updateMany']>; +} diff --git a/packages/model-typings/src/models/IInvitesModel.ts b/packages/model-typings/src/models/IInvitesModel.ts new file mode 100644 index 000000000000..c4dec9a41290 --- /dev/null +++ b/packages/model-typings/src/models/IInvitesModel.ts @@ -0,0 +1,10 @@ +import type { UpdateWriteOpResult } from 'mongodb'; +import type { IInvite } from '@rocket.chat/core-typings'; + +import type { IBaseModel } from './IBaseModel'; + +export interface IInvitesModel extends IBaseModel { + findOneByUserRoomMaxUsesAndExpiration(userId: string, rid: string, maxUses: number, daysToExpire: number): Promise; + increaseUsageById(_id: string, uses: number): Promise; + countUses(): Promise; +} diff --git a/packages/model-typings/src/models/ILivechatAgentActivityModel.ts b/packages/model-typings/src/models/ILivechatAgentActivityModel.ts new file mode 100644 index 000000000000..354e40568475 --- /dev/null +++ b/packages/model-typings/src/models/ILivechatAgentActivityModel.ts @@ -0,0 +1,29 @@ +import type { AggregationCursor, Cursor, FindAndModifyWriteOpResultObject, UpdateWriteOpResult } from 'mongodb'; +import type { ILivechatAgentActivity, IServiceHistory } from '@rocket.chat/core-typings'; + +import type { IBaseModel } from './IBaseModel'; + +export interface ILivechatAgentActivityModel extends IBaseModel { + findOneByAgendIdAndDate(agentId: string, date: ILivechatAgentActivity['date']): Promise; + createOrUpdate( + data: Partial>, + ): Promise | undefined>; + + updateLastStoppedAt( + params: Pick, + ): Promise; + updateServiceHistory( + params: Pick & { serviceHistory: IServiceHistory }, + ): Promise; + + findOpenSessions(): Cursor; + findAllAverageAvailableServiceTime(params: { date: Date; departmentId: string }): Promise; + + findAvailableServiceTimeHistory(params: { + start: string; + end: string; + fullReport: boolean; + onlyCount: boolean; + options: any; + }): AggregationCursor; +} diff --git a/packages/model-typings/src/models/ILivechatBusinessHoursModel.ts b/packages/model-typings/src/models/ILivechatBusinessHoursModel.ts new file mode 100644 index 000000000000..9483075348f8 --- /dev/null +++ b/packages/model-typings/src/models/ILivechatBusinessHoursModel.ts @@ -0,0 +1,39 @@ +import type { FindOneOptions, WithoutProjection } from 'mongodb'; +import type { ILivechatBusinessHour, LivechatBusinessHourTypes } from '@rocket.chat/core-typings'; + +import type { IBaseModel } from './IBaseModel'; + +export interface IWorkHoursCronJobsItem { + day: string; + times: string[]; +} + +export interface IWorkHoursCronJobsWrapper { + start: IWorkHoursCronJobsItem[]; + finish: IWorkHoursCronJobsItem[]; +} + +export interface ILivechatBusinessHoursModel extends IBaseModel { + findOneDefaultBusinessHour(options?: undefined): Promise; + findOneDefaultBusinessHour(options: WithoutProjection>): Promise; + findOneDefaultBusinessHour

(options: FindOneOptions

): Promise

; + findOneDefaultBusinessHour

(options?: any): Promise; + findActiveAndOpenBusinessHoursByDay(day: string, options?: any): Promise; + findDefaultActiveAndOpenBusinessHoursByDay(day: string, options?: any): Promise; + insertOne(data: Omit): Promise; + findHoursToScheduleJobs(): Promise; + + findActiveBusinessHoursToOpen( + day: string, + start: string, + type?: LivechatBusinessHourTypes, + options?: any, + ): Promise; + + findActiveBusinessHoursToClose( + day: string, + finish: string, + type?: LivechatBusinessHourTypes, + options?: any, + ): Promise; +} diff --git a/packages/model-typings/src/models/ILivechatCustomFieldModel.ts b/packages/model-typings/src/models/ILivechatCustomFieldModel.ts new file mode 100644 index 000000000000..20f1177c460c --- /dev/null +++ b/packages/model-typings/src/models/ILivechatCustomFieldModel.ts @@ -0,0 +1,8 @@ +import type { ILivechatCustomField } from '@rocket.chat/core-typings'; + +import type { IBaseModel } from './IBaseModel'; + +// eslint-disable-next-line @typescript-eslint/no-empty-interface +export interface ILivechatCustomFieldModel extends IBaseModel { + // +} diff --git a/packages/model-typings/src/models/ILivechatDepartmentAgentsModel.ts b/packages/model-typings/src/models/ILivechatDepartmentAgentsModel.ts new file mode 100644 index 000000000000..7fc6a803f121 --- /dev/null +++ b/packages/model-typings/src/models/ILivechatDepartmentAgentsModel.ts @@ -0,0 +1,68 @@ +import type { Cursor, WithoutProjection, FindOneOptions } from 'mongodb'; +import type { ILivechatDepartmentAgents } from '@rocket.chat/core-typings'; + +import type { IBaseModel } from './IBaseModel'; + +export interface ILivechatDepartmentAgentsModel extends IBaseModel { + findUsersInQueue(usersList: string[]): Cursor; + + findUsersInQueue( + usersList: string[], + options: WithoutProjection>, + ): Cursor; + + findUsersInQueue

( + usersList: string[], + options: FindOneOptions

, + ): Cursor

; + + findUsersInQueue

( + usersList: string[], + options?: + | undefined + | WithoutProjection> + | FindOneOptions

, + ): Cursor | Cursor

; + findByAgentId(agentId: string): Cursor; + findAgentsByDepartmentId(departmentId: string): Cursor; + + findAgentsByDepartmentId( + departmentId: string, + options: WithoutProjection>, + ): Cursor; + + findAgentsByDepartmentId

( + departmentId: string, + options: FindOneOptions

, + ): Cursor

; + + findAgentsByDepartmentId

( + departmentId: string, + options?: + | undefined + | WithoutProjection> + | FindOneOptions

, + ): Cursor | Cursor

; + findActiveDepartmentsByAgentId(agentId: string): Cursor; + + findActiveDepartmentsByAgentId( + agentId: string, + options: WithoutProjection>, + ): Cursor; + + findActiveDepartmentsByAgentId

( + agentId: string, + options: FindOneOptions

, + ): Cursor

; + + findActiveDepartmentsByAgentId

( + agentId: string, + options?: + | undefined + | WithoutProjection> + | FindOneOptions

, + ): Cursor | Cursor

; + + findByDepartmentIds(departmentIds: string[], options?: Record): Cursor; + findAgentsByAgentIdAndBusinessHourId(_agentId: string, _businessHourId: string): []; +} diff --git a/packages/model-typings/src/models/ILivechatDepartmentModel.ts b/packages/model-typings/src/models/ILivechatDepartmentModel.ts new file mode 100644 index 000000000000..fa8e53dba7b9 --- /dev/null +++ b/packages/model-typings/src/models/ILivechatDepartmentModel.ts @@ -0,0 +1,33 @@ +import type { FindOneOptions, Cursor, FilterQuery, WriteOpResult } from 'mongodb'; +import type { ILivechatDepartmentRecord } from '@rocket.chat/core-typings'; + +import type { IBaseModel } from './IBaseModel'; + +export interface ILivechatDepartmentModel extends IBaseModel { + findInIds(departmentsIds: string[], options: FindOneOptions): Cursor; + findByNameRegexWithExceptionsAndConditions( + searchTerm: string, + exceptions: string[], + conditions: FilterQuery, + options: FindOneOptions, + ): Cursor; + + findByBusinessHourId(businessHourId: string, options: FindOneOptions): Cursor; + + findEnabledByBusinessHourId( + businessHourId: string, + options: FindOneOptions, + ): Cursor; + + findEnabledByListOfBusinessHourIdsAndDepartmentIds( + businessHourIds: string[], + departmentIds: string[], + options: FindOneOptions, + ): Cursor; + + addBusinessHourToDepartmentsByIds(ids: string[], businessHourId: string): Promise; + + removeBusinessHourFromDepartmentsByIdsAndBusinessHourId(ids: string[], businessHourId: string): Promise; + + removeBusinessHourFromDepartmentsByBusinessHourId(businessHourId: string): Promise; +} diff --git a/packages/model-typings/src/models/ILivechatInquiryModel.ts b/packages/model-typings/src/models/ILivechatInquiryModel.ts new file mode 100644 index 000000000000..d0b989d84593 --- /dev/null +++ b/packages/model-typings/src/models/ILivechatInquiryModel.ts @@ -0,0 +1,15 @@ +import type { FindOneOptions, MongoDistinctPreferences, UpdateWriteOpResult } from 'mongodb'; +import type { IMessage, ILivechatInquiryRecord, LivechatInquiryStatus } from '@rocket.chat/core-typings'; + +import type { IBaseModel } from './IBaseModel'; + +export interface ILivechatInquiryModel extends IBaseModel { + findOneQueuedByRoomId(rid: string): Promise<(ILivechatInquiryRecord & { status: LivechatInquiryStatus.QUEUED }) | null>; + findOneByRoomId( + rid: string, + options: FindOneOptions, + ): Promise; + getDistinctQueuedDepartments(options: MongoDistinctPreferences): Promise; + setDepartmentByInquiryId(inquiryId: string, department: string): Promise; + setLastMessageByRoomId(rid: string, message: IMessage): Promise; +} diff --git a/packages/model-typings/src/models/ILivechatPriorityModel.ts b/packages/model-typings/src/models/ILivechatPriorityModel.ts new file mode 100644 index 000000000000..1ece4ef9b247 --- /dev/null +++ b/packages/model-typings/src/models/ILivechatPriorityModel.ts @@ -0,0 +1,7 @@ +import type { IRocketChatRecord } from '@rocket.chat/core-typings'; + +import type { IBaseModel } from './IBaseModel'; + +export interface ILivechatPriorityModel extends IBaseModel { + findOneByIdOrName(_idOrName: string, options?: any): any; +} diff --git a/packages/model-typings/src/models/ILivechatRoomsModel.ts b/packages/model-typings/src/models/ILivechatRoomsModel.ts new file mode 100644 index 000000000000..a56aa7b7a197 --- /dev/null +++ b/packages/model-typings/src/models/ILivechatRoomsModel.ts @@ -0,0 +1,97 @@ +import type { IRocketChatRecord } from '@rocket.chat/core-typings'; + +import type { IBaseModel } from './IBaseModel'; + +type Period = { + start: any; + end: any; +}; + +type WithDepartment = { + departmentId: any; +}; + +type WithOnlyCount = { + onlyCount?: boolean; +}; + +type WithOptions = { + options?: any; +}; + +export interface ILivechatRoomsModel extends IBaseModel { + getQueueMetrics(params: { departmentId: any; agentId: any; includeOfflineAgents: any; options?: any }): any; + + findAllNumberOfAbandonedRooms(params: Period & WithDepartment & WithOnlyCount & WithOptions): Promise; + + findPercentageOfAbandonedRooms(params: Period & WithDepartment & WithOnlyCount & WithOptions): Promise; + + findAllAverageOfChatDurationTime(params: Period & WithDepartment & WithOnlyCount & WithOptions): any; + + findAllAverageWaitingTime(params: Period & WithDepartment & WithOnlyCount & WithOptions): any; + + findAllRooms(params: Period & WithDepartment & WithOnlyCount & WithOptions & { answered: any }): any; + + findAllServiceTime(params: Period & WithDepartment & WithOnlyCount & WithOptions): any; + + findAllNumberOfTransferredRooms(params: Period & WithDepartment & WithOptions): any; + + countAllOpenChatsBetweenDate(params: Period & WithDepartment): any; + + countAllClosedChatsBetweenDate(params: Period & WithDepartment): any; + + countAllQueuedChatsBetweenDate(params: Period & WithDepartment): any; + + countAllOpenChatsByAgentBetweenDate(params: Period & WithDepartment): any; + + countAllOnHoldChatsByAgentBetweenDate(params: Period & WithDepartment): any; + + countAllClosedChatsByAgentBetweenDate(params: Period & WithDepartment): any; + + countAllOpenChatsByDepartmentBetweenDate(params: Period & WithDepartment): any; + + countAllClosedChatsByDepartmentBetweenDate(params: Period & WithDepartment): any; + + calculateResponseTimingsBetweenDates(params: Period & WithDepartment): any; + + calculateReactionTimingsBetweenDates(params: Period & WithDepartment): any; + + calculateDurationTimingsBetweenDates(params: Period & WithDepartment): any; + + findAllAverageOfServiceTime(params: Period & WithDepartment & WithOnlyCount & WithOptions): any; + + findByVisitorId(visitorId: any, options: any): any; + + findRoomsByVisitorIdAndMessageWithCriteria(params: { + visitorId: any; + searchText: any; + open: any; + served: any; + onlyCount?: boolean; + options?: any; + }): any; + + findRoomsWithCriteria(params: { + agents: any; + roomName: any; + departmentId: any; + open: any; + served: any; + createdAt: any; + closedAt: any; + tags: any; + customFields: any; + visitorId: any; + roomIds: any; + onhold: any; + options?: any; + }): any; + + getOnHoldConversationsBetweenDate(from: any, to: any, departmentId: any): any; + + findAllServiceTimeByAgent(params: Period & WithOptions & WithOnlyCount): any; + + findAllAverageServiceTimeByAgents(params: Period & WithOptions & WithOnlyCount): any; + + setDepartmentByRoomId(roomId: any, departmentId: any): any; +} diff --git a/packages/model-typings/src/models/ILivechatTagModel.ts b/packages/model-typings/src/models/ILivechatTagModel.ts new file mode 100644 index 000000000000..b2adaf37d31a --- /dev/null +++ b/packages/model-typings/src/models/ILivechatTagModel.ts @@ -0,0 +1,8 @@ +import type { IRocketChatRecord } from '@rocket.chat/core-typings'; + +import type { IBaseModel } from './IBaseModel'; + +// eslint-disable-next-line @typescript-eslint/no-empty-interface +export interface ILivechatTagModel extends IBaseModel { + // +} diff --git a/packages/model-typings/src/models/ILivechatTriggerModel.ts b/packages/model-typings/src/models/ILivechatTriggerModel.ts new file mode 100644 index 000000000000..577c8ecb83a5 --- /dev/null +++ b/packages/model-typings/src/models/ILivechatTriggerModel.ts @@ -0,0 +1,9 @@ +import type { Cursor, UpdateWriteOpResult } from 'mongodb'; +import type { ILivechatTrigger } from '@rocket.chat/core-typings'; + +import type { IBaseModel } from './IBaseModel'; + +export interface ILivechatTriggerModel extends IBaseModel { + findEnabled(): Cursor; + updateById(_id: string, data: ILivechatTrigger): Promise; +} diff --git a/packages/model-typings/src/models/ILivechatUnitModel.ts b/packages/model-typings/src/models/ILivechatUnitModel.ts new file mode 100644 index 000000000000..923c180052a3 --- /dev/null +++ b/packages/model-typings/src/models/ILivechatUnitModel.ts @@ -0,0 +1,6 @@ +import type { ILivechatDepartmentModel } from './ILivechatDepartmentModel'; + +// eslint-disable-next-line @typescript-eslint/no-empty-interface +export interface ILivechatUnitModel extends ILivechatDepartmentModel { + // +} diff --git a/packages/model-typings/src/models/ILivechatUnitMonitorsModel.ts b/packages/model-typings/src/models/ILivechatUnitMonitorsModel.ts new file mode 100644 index 000000000000..5f837a1e3478 --- /dev/null +++ b/packages/model-typings/src/models/ILivechatUnitMonitorsModel.ts @@ -0,0 +1,8 @@ +import type { ILivechatMonitor } from '@rocket.chat/core-typings'; + +import type { IBaseModel } from './IBaseModel'; + +// eslint-disable-next-line @typescript-eslint/no-empty-interface +export interface ILivechatUnitMonitorsModel extends IBaseModel { + // +} diff --git a/packages/model-typings/src/models/ILivechatVisitorsModel.ts b/packages/model-typings/src/models/ILivechatVisitorsModel.ts new file mode 100644 index 000000000000..a355ecc57a2d --- /dev/null +++ b/packages/model-typings/src/models/ILivechatVisitorsModel.ts @@ -0,0 +1,41 @@ +import type { + AggregationCursor, + Cursor, + FilterQuery, + FindOneOptions, + WithoutProjection, + UpdateWriteOpResult, + WriteOpResult, +} from 'mongodb'; +import type { ILivechatVisitor } from '@rocket.chat/core-typings'; + +import type { IBaseModel } from './IBaseModel'; + +export interface ILivechatVisitorsModel extends IBaseModel { + findById(_id: string, options: FindOneOptions): Cursor; + getVisitorByToken(token: string, options: WithoutProjection>): Promise; + getVisitorsBetweenDate({ start, end, department }: { start: Date; end: Date; department: string }): Cursor; + findByNameRegexWithExceptionsAndConditions

( + searchTerm: string, + exceptions: string[], + conditions: FilterQuery, + options: FindOneOptions

, + ): AggregationCursor< + P & { + custom_name: string; + } + >; + findVisitorsByEmailOrPhoneOrNameOrUsername( + _emailOrPhoneOrNameOrUsername: string, + options: FindOneOptions, + ): Cursor; + removeContactManagerByUsername(manager: string): Promise; + + updateLivechatDataByToken(token: string, key: string, value: unknown, overwrite: boolean): Promise; + + findOneGuestByEmailAddress(emailAddress: string): Promise; + + findOneVisitorByPhone(phone: string): Promise; + + removeDepartmentById(_id: string): Promise; +} diff --git a/packages/model-typings/src/models/ILoginServiceConfigurationModel.ts b/packages/model-typings/src/models/ILoginServiceConfigurationModel.ts new file mode 100644 index 000000000000..e515040dfa1b --- /dev/null +++ b/packages/model-typings/src/models/ILoginServiceConfigurationModel.ts @@ -0,0 +1,8 @@ +import type { ILoginServiceConfiguration } from '@rocket.chat/core-typings'; + +import type { IBaseModel } from './IBaseModel'; + +// eslint-disable-next-line @typescript-eslint/no-empty-interface +export interface ILoginServiceConfigurationModel extends IBaseModel { + // +} diff --git a/packages/model-typings/src/models/IMessagesModel.ts b/packages/model-typings/src/models/IMessagesModel.ts new file mode 100644 index 000000000000..7de672054095 --- /dev/null +++ b/packages/model-typings/src/models/IMessagesModel.ts @@ -0,0 +1,47 @@ +import type { IMessage, IRoom, IUser, ILivechatDepartment } from '@rocket.chat/core-typings'; +import type { AggregationCursor, Cursor, FindOneOptions, WithoutProjection, CollectionAggregationOptions } from 'mongodb'; + +import type { IBaseModel } from './IBaseModel'; + +export interface IMessagesModel extends IBaseModel { + findVisibleByMentionAndRoomId( + username: IUser['username'], + rid: IRoom['_id'], + options: WithoutProjection>, + ): Cursor; + findStarredByUserAtRoom( + userId: IUser['_id'], + roomId: IRoom['_id'], + options: WithoutProjection>, + ): Cursor; + + findByRoomIdAndType(roomId: IRoom['_id'], type: IMessage['t'], options?: WithoutProjection>): Cursor; + + findSnippetedByRoom(roomId: IRoom['_id'], options: WithoutProjection>): Cursor; + + findDiscussionsByRoom(rid: IRoom['_id'], options: WithoutProjection>): Cursor; + + findDiscussionsByRoomAndText(rid: IRoom['_id'], text: string, options: WithoutProjection>): Cursor; + + findAllNumberOfTransferredRooms(params: { + start: string; + end: string; + departmentId: ILivechatDepartment['_id']; + onlyCount: boolean; + options: any; + }): AggregationCursor; + + getTotalOfMessagesSentByDate(params: { start: Date; end: Date; options?: any }): Promise; + + findLivechatClosedMessages(rid: IRoom['_id'], options: WithoutProjection>): Cursor; + + countRoomsWithStarredMessages(options: CollectionAggregationOptions): Promise; + + countRoomsWithPinnedMessages(options: CollectionAggregationOptions): Promise; + + countE2EEMessages(options: WithoutProjection>): Promise; + + findPinned(options: WithoutProjection>): Cursor; + + findStarred(options: WithoutProjection>): Cursor; +} diff --git a/packages/model-typings/src/models/INotificationQueueModel.ts b/packages/model-typings/src/models/INotificationQueueModel.ts new file mode 100644 index 000000000000..fea420095a44 --- /dev/null +++ b/packages/model-typings/src/models/INotificationQueueModel.ts @@ -0,0 +1,12 @@ +import type { UpdateWriteOpResult } from 'mongodb'; +import type { INotification } from '@rocket.chat/core-typings'; + +import type { IBaseModel } from './IBaseModel'; + +export interface INotificationQueueModel extends IBaseModel { + unsetSendingById(_id: string): Promise; + setErrorById(_id: string, error: any): Promise; + clearScheduleByUserId(uid: string): Promise; + clearQueueByUserId(uid: string): Promise; + findNextInQueueOrExpired(expired: Date): Promise; +} diff --git a/packages/model-typings/src/models/INpsModel.ts b/packages/model-typings/src/models/INpsModel.ts new file mode 100644 index 000000000000..5ad211802367 --- /dev/null +++ b/packages/model-typings/src/models/INpsModel.ts @@ -0,0 +1,19 @@ +import type { UpdateWriteOpResult } from 'mongodb'; +import type { INps, NPSStatus } from '@rocket.chat/core-typings'; + +import type { IBaseModel } from './IBaseModel'; + +export interface INpsModel extends IBaseModel { + getOpenExpiredAndStartSending(): Promise; + getOpenExpiredAlreadySending(): Promise; + updateStatusById(_id: INps['_id'], status: INps['status']): Promise; + save({ + _id, + startAt, + expireAt, + createdBy, + status, + }: Pick): Promise; + + closeAllByStatus(status: NPSStatus): Promise; +} diff --git a/packages/model-typings/src/models/INpsVoteModel.ts b/packages/model-typings/src/models/INpsVoteModel.ts new file mode 100644 index 000000000000..9f807a24d58d --- /dev/null +++ b/packages/model-typings/src/models/INpsVoteModel.ts @@ -0,0 +1,13 @@ +import type { Cursor, FindOneOptions, UpdateWriteOpResult, WithoutProjection } from 'mongodb'; +import type { INpsVote, INpsVoteStatus } from '@rocket.chat/core-typings'; + +import type { IBaseModel } from './IBaseModel'; + +export interface INpsVoteModel extends IBaseModel { + findNotSentByNpsId(npsId: string, options?: WithoutProjection>): Cursor; + findByNpsIdAndStatus(npsId: string, status: INpsVoteStatus, options?: WithoutProjection>): Cursor; + findByNpsId(npsId: string, options?: WithoutProjection>): Cursor; + save(vote: Omit): Promise; + updateVotesToSent(voteIds: string[]): Promise; + updateOldSendingToNewByNpsId(npsId: string): Promise; +} diff --git a/packages/model-typings/src/models/IOAuthAppsModel.ts b/packages/model-typings/src/models/IOAuthAppsModel.ts new file mode 100644 index 000000000000..ffb5c6cd9230 --- /dev/null +++ b/packages/model-typings/src/models/IOAuthAppsModel.ts @@ -0,0 +1,7 @@ +import type { IOAuthApps } from '@rocket.chat/core-typings'; + +import type { IBaseModel } from './IBaseModel'; + +export interface IOAuthAppsModel extends IBaseModel { + findOneAuthAppByIdOrClientId(props: { clientId: string } | { appId: string }): Promise; +} diff --git a/packages/model-typings/src/models/IOEmbedCacheModel.ts b/packages/model-typings/src/models/IOEmbedCacheModel.ts new file mode 100644 index 000000000000..8db54d42c33a --- /dev/null +++ b/packages/model-typings/src/models/IOEmbedCacheModel.ts @@ -0,0 +1,10 @@ +import type { DeleteWriteOpResultObject } from 'mongodb'; +import type { IOEmbedCache } from '@rocket.chat/core-typings'; + +import type { IBaseModel } from './IBaseModel'; + +export interface IOEmbedCacheModel extends IBaseModel { + createWithIdAndData(_id: string, data: any): Promise; + + removeAfterDate(date: Date): Promise; +} diff --git a/packages/model-typings/src/models/IOmnichannelQueueModel.ts b/packages/model-typings/src/models/IOmnichannelQueueModel.ts new file mode 100644 index 000000000000..bcd4390eb128 --- /dev/null +++ b/packages/model-typings/src/models/IOmnichannelQueueModel.ts @@ -0,0 +1,10 @@ +import type { IOmnichannelQueueStatus } from '@rocket.chat/core-typings'; + +import type { IBaseModel } from './IBaseModel'; + +export interface IOmnichannelQueueModel extends IBaseModel { + initQueue(): any; + stopQueue(): any; + lockQueue(): Promise; + unlockQueue(): Promise; +} diff --git a/packages/model-typings/src/models/IPbxEventsModel.ts b/packages/model-typings/src/models/IPbxEventsModel.ts new file mode 100644 index 000000000000..a4154005d5a3 --- /dev/null +++ b/packages/model-typings/src/models/IPbxEventsModel.ts @@ -0,0 +1,10 @@ +import type { Cursor } from 'mongodb'; +import type { IPbxEvent } from '@rocket.chat/core-typings'; + +import type { IBaseModel } from './IBaseModel'; + +export interface IPbxEventsModel extends IBaseModel { + findByEvents(callUniqueId: string, events: string[]): Cursor; + findOneByEvent(callUniqueId: string, event: string): Promise; + findOneByUniqueId(callUniqueId: string): Promise; +} diff --git a/packages/model-typings/src/models/IPermissionsModel.ts b/packages/model-typings/src/models/IPermissionsModel.ts new file mode 100644 index 000000000000..cfa32e38e36a --- /dev/null +++ b/packages/model-typings/src/models/IPermissionsModel.ts @@ -0,0 +1,11 @@ +import type { IPermission, IRole } from '@rocket.chat/core-typings'; + +import type { IBaseModel } from './IBaseModel'; + +export interface IPermissionsModel extends IBaseModel { + createOrUpdate(name: string, roles: IRole['_id'][]): Promise; + create(id: string, roles: IRole['_id'][]): Promise; + addRole(permission: string, role: IRole['_id']): Promise; + setRoles(permission: string, roles: IRole['_id'][]): Promise; + removeRole(permission: string, role: IRole['_id']): Promise; +} diff --git a/packages/model-typings/src/models/IReadReceiptsModel.ts b/packages/model-typings/src/models/IReadReceiptsModel.ts new file mode 100644 index 000000000000..1398c39e9f74 --- /dev/null +++ b/packages/model-typings/src/models/IReadReceiptsModel.ts @@ -0,0 +1,8 @@ +import type { Cursor } from 'mongodb'; +import type { ReadReceipt } from '@rocket.chat/core-typings'; + +import type { IBaseModel } from './IBaseModel'; + +export interface IReadReceiptsModel extends IBaseModel { + findByMessageId(messageId: string): Cursor; +} diff --git a/packages/model-typings/src/models/IReportsModel.ts b/packages/model-typings/src/models/IReportsModel.ts new file mode 100644 index 000000000000..0d530175489d --- /dev/null +++ b/packages/model-typings/src/models/IReportsModel.ts @@ -0,0 +1,11 @@ +import type { IReport, IMessage } from '@rocket.chat/core-typings'; + +import type { IBaseModel } from './IBaseModel'; + +export interface IReportsModel extends IBaseModel { + createWithMessageDescriptionAndUserId( + message: IMessage, + description: string, + userId: string, + ): ReturnType['insertOne']>; +} diff --git a/packages/model-typings/src/models/IRolesModel.ts b/packages/model-typings/src/models/IRolesModel.ts new file mode 100644 index 000000000000..538b8f718d7e --- /dev/null +++ b/packages/model-typings/src/models/IRolesModel.ts @@ -0,0 +1,53 @@ +import type { Cursor, FindOneOptions, InsertOneWriteOpResult, UpdateWriteOpResult, WithId, WithoutProjection } from 'mongodb'; +import type { IRole, IUser, IRoom } from '@rocket.chat/core-typings'; + +import type { IBaseModel } from './IBaseModel'; + +export interface IRolesModel extends IBaseModel { + findByUpdatedDate(updatedAfterDate: Date, options?: FindOneOptions): Cursor; + addUserRoles(userId: IUser['_id'], roles: IRole['_id'][], scope?: IRoom['_id']): Promise; + isUserInRoles(userId: IUser['_id'], roles: IRole['_id'][], scope?: IRoom['_id']): Promise; + removeUserRoles(userId: IUser['_id'], roles: IRole['_id'][], scope?: IRoom['_id']): Promise; + findOneByIdOrName(_idOrName: IRole['_id'] | IRole['name'], options?: undefined): Promise; + + findOneByIdOrName(_idOrName: IRole['_id'] | IRole['name'], options: WithoutProjection>): Promise; + + findOneByIdOrName

(_idOrName: IRole['_id'] | IRole['name'], options: FindOneOptions

): Promise

; + + findOneByIdOrName

(_idOrName: IRole['_id'] | IRole['name'], options?: any): Promise; + findOneByName

(name: IRole['name'], options?: any): Promise; + findInIds

(ids: IRole['_id'][], options?: FindOneOptions): P extends Pick ? Cursor

: Cursor; + findAllExceptIds

(ids: IRole['_id'][], options?: FindOneOptions): P extends Pick ? Cursor

: Cursor; + updateById( + _id: IRole['_id'], + name: IRole['name'], + scope: IRole['scope'], + description?: IRole['description'], + mandatory2fa?: IRole['mandatory2fa'], + ): Promise; + findUsersInRole(roleId: IRole['_id'], scope?: IRoom['_id']): Promise>; + + findUsersInRole( + roleId: IRole['_id'], + scope: IRoom['_id'] | undefined, + options: WithoutProjection>, + ): Promise>; + + findUsersInRole

( + roleId: IRole['_id'], + scope: IRoom['_id'] | undefined, + options: FindOneOptions

, + ): Promise>; + + findUsersInRole

(roleId: IRole['_id'], scope: IRoom['_id'] | undefined, options?: any | undefined): Promise | Cursor

>; + + createWithRandomId( + name: IRole['name'], + scope?: IRole['scope'], + description?: string, + protectedRole?: boolean, + mandatory2fa?: boolean, + ): Promise>>; + + canAddUserToRole(uid: IUser['_id'], roleId: IRole['_id'], scope?: IRoom['_id']): Promise; +} diff --git a/packages/model-typings/src/models/IRoomsModel.ts b/packages/model-typings/src/models/IRoomsModel.ts new file mode 100644 index 000000000000..893e818abc5f --- /dev/null +++ b/packages/model-typings/src/models/IRoomsModel.ts @@ -0,0 +1,69 @@ +import type { Cursor, AggregationCursor } from 'mongodb'; +import type { IRoom, IOmnichannelGenericRoom } from '@rocket.chat/core-typings'; + +import type { IBaseModel } from './IBaseModel'; + +export interface IRoomsModel extends IBaseModel { + findOneByRoomIdAndUserId(rid: any, uid: any, options?: any): any; + + findManyByRoomIds(roomIds: any, options?: any): any; + + getMostRecentAverageChatDurationTime(numberMostRecentChats: any, department: any): Promise; + + findByNameContainingAndTypes(name: any, types: any, discussion?: boolean, teams?: boolean, showOnlyTeams?: boolean, options?: any): any; + + findByTypes(types: any, discussion?: boolean, teams?: boolean, onlyTeams?: boolean, options?: any): any; + + findByNameContaining(name: any, discussion?: boolean, teams?: boolean, onlyTeams?: boolean, options?: any): any; + + findByTeamId(teamId: any, options?: any): any; + + findByTeamIdContainingNameAndDefault(teamId: any, name: any, teamDefault: any, ids: any, options?: any): any; + + findByTeamIdAndRoomsId(teamId: any, rids: any, options?: any): any; + + findChannelAndPrivateByNameStarting(name: any, sIds: any, options: any): any; + + findRoomsByNameOrFnameStarting(name: any, options: any): any; + + findRoomsWithoutDiscussionsByRoomIds(name: any, roomIds: any, options: any): any; + + findChannelAndGroupListWithoutTeamsByNameStartingByOwner(uid: any, name: any, groupsToAccept: any, options: any): any; + + unsetTeamId(teamId: any, options?: any): any; + + unsetTeamById(rid: any, options?: any): any; + + setTeamById(rid: any, teamId: any, teamDefault: any, options?: any): any; + + setTeamMainById(rid: any, teamId: any, options?: any): any; + + setTeamByIds(rids: any, teamId: any, options?: any): any; + + setTeamDefaultById(rid: any, teamDefault: any, options?: any): any; + + findChannelsWithNumberOfMessagesBetweenDate(params: { + start: any; + end: any; + startOfLastWeek: any; + endOfLastWeek: any; + onlyCount?: boolean; + options?: any; + }): any; + + findOneByName(name: any, options?: any): any; + + findDefaultRoomsForTeam(teamId: any): Cursor; + + incUsersCountByIds(ids: any, inc: number): any; + + findOneByNameOrFname(name: any, options?: any): any; + + allRoomSourcesCount(): AggregationCursor<{ _id: Required; count: number }>; + + setAsFederated(roomId: any): any; + + findByE2E(options: any): any; + + findRoomsInsideTeams(autoJoin?: boolean): any; +} diff --git a/packages/model-typings/src/models/IServerEventsModel.ts b/packages/model-typings/src/models/IServerEventsModel.ts new file mode 100644 index 000000000000..e5240e2454ea --- /dev/null +++ b/packages/model-typings/src/models/IServerEventsModel.ts @@ -0,0 +1,12 @@ +import type { IServerEvent } from '@rocket.chat/core-typings'; + +import type { IBaseModel } from './IBaseModel'; + +export interface IServerEventsModel extends IBaseModel { + findLastFailedAttemptByIp(ip: string): Promise; + findLastFailedAttemptByUsername(username: string): Promise; + countFailedAttemptsByUsernameSince(username: string, since: Date): Promise; + countFailedAttemptsByIpSince(ip: string, since: Date): Promise; + countFailedAttemptsByIp(ip: string): Promise; + countFailedAttemptsByUsername(username: string): Promise; +} diff --git a/packages/model-typings/src/models/ISessionsModel.ts b/packages/model-typings/src/models/ISessionsModel.ts new file mode 100644 index 000000000000..6ec841744113 --- /dev/null +++ b/packages/model-typings/src/models/ISessionsModel.ts @@ -0,0 +1,98 @@ +import type { BulkWriteOpResultObject, UpdateWriteOpResult, Cursor } from 'mongodb'; +import type { + ISession, + UserSessionAggregationResult, + DeviceSessionAggregationResult, + OSSessionAggregationResult, + IUser, +} from '@rocket.chat/core-typings'; + +import type { IBaseModel, ModelOptionalId } from './IBaseModel'; + +export type DestructuredDate = { year: number; month: number; day: number }; +export type DestructuredDateWithType = { + year: number; + month: number; + day: number; + type?: 'month' | 'week'; +}; +export type DestructuredRange = { start: DestructuredDate; end: DestructuredDate }; +export type DateRange = { start: Date; end: Date }; + +export interface ISessionsModel extends IBaseModel { + getActiveUsersBetweenDates({ start, end }: DestructuredRange): Promise; + findLastLoginByIp(ip: string): Promise; + findOneBySessionId(sessionId: string): Promise; + + findSessionsNotClosedByDateWithoutLastActivity({ year, month, day }: DestructuredDate): Cursor; + getActiveUsersOfPeriodByDayBetweenDates({ start, end }: DestructuredRange): Promise< + { + day: number; + month: number; + year: number; + usersList: IUser['_id'][]; + users: number; + }[] + >; + + getBusiestTimeWithinHoursPeriod({ start, end, groupSize }: DateRange & { groupSize: number }): Promise< + { + hour: number; + users: number; + }[] + >; + + getTotalOfSessionsByDayBetweenDates({ start, end }: DestructuredRange): Promise< + { + day: number; + month: number; + year: number; + users: number; + }[] + >; + + getTotalOfSessionByHourAndDayBetweenDates({ start, end }: DateRange): Promise< + { + hour: number; + day: number; + month: number; + year: number; + users: number; + }[] + >; + + getUniqueUsersOfYesterday(): Promise; + + getUniqueUsersOfLastMonth(): Promise; + + getUniqueUsersOfLastWeek(): Promise; + + getUniqueDevicesOfYesterday(): Promise; + + getUniqueDevicesOfLastMonth(): Promise; + + getUniqueDevicesOfLastWeek(): Promise; + + getUniqueOSOfYesterday(): Promise; + + getUniqueOSOfLastMonth(): Promise; + + getUniqueOSOfLastWeek(): Promise; + + createOrUpdate(data: Omit): Promise; + + closeByInstanceIdAndSessionId(instanceId: string, sessionId: string): Promise; + + updateActiveSessionsByDateAndInstanceIdAndIds( + params: Partial, + instanceId: string, + sessions: string[], + data?: Record, + ): Promise; + + updateActiveSessionsByDate({ year, month, day }: DestructuredDate, data?: Record): Promise; + + logoutByInstanceIdAndSessionIdAndUserId(instanceId: string, sessionId: string, userId: string): Promise; + + createBatch(sessions: ModelOptionalId[]): Promise; +} diff --git a/packages/model-typings/src/models/ISettingsModel.ts b/packages/model-typings/src/models/ISettingsModel.ts new file mode 100644 index 000000000000..6e73d993e627 --- /dev/null +++ b/packages/model-typings/src/models/ISettingsModel.ts @@ -0,0 +1,40 @@ +import type { Cursor, UpdateQuery, WriteOpResult } from 'mongodb'; +import type { ISetting, ISettingColor, ISettingSelectOption } from '@rocket.chat/core-typings'; + +import type { IBaseModel } from './IBaseModel'; + +export interface ISettingsModel extends IBaseModel { + getValueById(_id: string): Promise; + + findNotHidden(params?: { updatedAfter?: Date }): Cursor; + + findOneNotHiddenById(_id: string): Promise; + + findByIds(_id?: string[] | string): Cursor; + + updateValueById(_id: string, value: T): Promise; + + updateOptionsById(_id: ISetting['_id'], options: UpdateQuery['$set']): Promise; + + updateValueNotHiddenById(_id: ISetting['_id'], value: T): Promise; + + updateValueAndEditorById( + _id: ISetting['_id'], + value: T, + editor: ISettingColor['editor'], + ): Promise; + + findNotHiddenPublic( + ids?: ISetting['_id'][], + ): Cursor< + T extends ISettingColor + ? Pick + : Pick + >; + + findSetupWizardSettings(): Cursor; + + addOptionValueById(_id: ISetting['_id'], option: ISettingSelectOption): Promise; + + findNotHiddenPublicUpdatedAfter(updatedAt: Date): Cursor; +} diff --git a/packages/model-typings/src/models/ISmarshHistoryModel.ts b/packages/model-typings/src/models/ISmarshHistoryModel.ts new file mode 100644 index 000000000000..4dbe811a9820 --- /dev/null +++ b/packages/model-typings/src/models/ISmarshHistoryModel.ts @@ -0,0 +1,8 @@ +import type { ISmarshHistory } from '@rocket.chat/core-typings'; + +import type { IBaseModel } from './IBaseModel'; + +// eslint-disable-next-line @typescript-eslint/no-empty-interface +export interface ISmarshHistoryModel extends IBaseModel { + // +} diff --git a/packages/model-typings/src/models/IStatisticsModel.ts b/packages/model-typings/src/models/IStatisticsModel.ts new file mode 100644 index 000000000000..ac84a49525b3 --- /dev/null +++ b/packages/model-typings/src/models/IStatisticsModel.ts @@ -0,0 +1,7 @@ +import type { IStats } from '@rocket.chat/core-typings'; + +import type { IBaseModel } from './IBaseModel'; + +export interface IStatisticsModel extends IBaseModel { + findLast(): Promise; +} diff --git a/packages/model-typings/src/models/ISubscriptionsModel.ts b/packages/model-typings/src/models/ISubscriptionsModel.ts new file mode 100644 index 000000000000..042e0d5d4989 --- /dev/null +++ b/packages/model-typings/src/models/ISubscriptionsModel.ts @@ -0,0 +1,53 @@ +import type { FindOneOptions, Cursor, UpdateWriteOpResult, WithoutProjection } from 'mongodb'; +import type { ISubscription, IRole, IUser, IRoom } from '@rocket.chat/core-typings'; + +import type { IBaseModel } from './IBaseModel'; + +export interface ISubscriptionsModel extends IBaseModel { + getBadgeCount(uid: string): Promise; + + findOneByRoomIdAndUserId(rid: string, uid: string, options?: FindOneOptions): Promise; + + findByUserIdAndRoomIds(userId: string, roomIds: Array, options?: FindOneOptions): Cursor; + + findByRoomIdAndNotUserId(roomId: string, userId: string, options?: FindOneOptions): Cursor; + + findByLivechatRoomIdAndNotUserId(roomId: string, userId: string, options?: FindOneOptions): Cursor; + + countByRoomIdAndUserId(rid: string, uid: string | undefined): Promise; + + isUserInRole(uid: IUser['_id'], roleId: IRole['_id'], rid?: IRoom['_id']): Promise; + + setAsReadByRoomIdAndUserId( + rid: string, + uid: string, + alert?: boolean, + options?: FindOneOptions, + ): ReturnType['update']>; + + removeRolesByUserId(uid: IUser['_id'], roles: IRole['_id'][], rid: IRoom['_id']): Promise; + + findUsersInRoles(roles: IRole['_id'][], rid: string | undefined): Promise>; + + findUsersInRoles( + roles: IRole['_id'][], + rid: string | undefined, + options: WithoutProjection>, + ): Promise>; + + findUsersInRoles

( + roles: IRole['_id'][], + rid: string | undefined, + options: FindOneOptions

, + ): Promise>; + + findUsersInRoles

( + roles: IRole['_id'][], + rid: IRoom['_id'] | undefined, + options?: FindOneOptions

, + ): Promise>; + + addRolesByUserId(uid: IUser['_id'], roles: IRole['_id'][], rid?: IRoom['_id']): Promise; + + isUserInRoleScope(uid: IUser['_id'], rid?: IRoom['_id']): Promise; +} diff --git a/packages/model-typings/src/models/ITeamMemberModel.ts b/packages/model-typings/src/models/ITeamMemberModel.ts new file mode 100644 index 000000000000..8558aeac508f --- /dev/null +++ b/packages/model-typings/src/models/ITeamMemberModel.ts @@ -0,0 +1,92 @@ +import type { + WithoutProjection, + FindOneOptions, + Cursor, + InsertOneWriteOpResult, + UpdateWriteOpResult, + DeleteWriteOpResultObject, + FilterQuery, +} from 'mongodb'; +import type { ITeamMember, IUser, IRole } from '@rocket.chat/core-typings'; + +import type { IBaseModel } from './IBaseModel'; + +export interface ITeamMemberModel extends IBaseModel { + findByUserId(userId: string): Cursor; + + findByUserId(userId: string, options: WithoutProjection>): Cursor; + + findByUserId

(userId: string, options: FindOneOptions

): Cursor

; + + findByUserId

( + userId: string, + options?: undefined | WithoutProjection> | FindOneOptions

, + ): Cursor

| Cursor; + + findOneByUserIdAndTeamId(userId: string, teamId: string): Promise; + + findOneByUserIdAndTeamId( + userId: string, + teamId: string, + options: WithoutProjection>, + ): Promise; + + findOneByUserIdAndTeamId

(userId: string, teamId: string, options: FindOneOptions

): Promise

; + + findOneByUserIdAndTeamId

( + userId: string, + teamId: string, + options?: undefined | WithoutProjection> | FindOneOptions

, + ): Promise

; + + findByTeamId(teamId: string): Cursor; + + findByTeamId(teamId: string, options: WithoutProjection>): Cursor; + + findByTeamId

(teamId: string, options: FindOneOptions

): Cursor

; + + findByTeamId

( + teamId: string, + options?: undefined | WithoutProjection> | FindOneOptions

, + ): Cursor

| Cursor; + + findByTeamIds(teamIds: Array): Cursor; + + findByTeamIds(teamIds: Array, options: WithoutProjection>): Cursor; + + findByTeamIds

(teamIds: Array, options: FindOneOptions

): Cursor

; + + findByTeamIds

( + teamIds: Array, + options?: undefined | WithoutProjection> | FindOneOptions

, + ): Cursor

| Cursor; + + findByTeamIdAndRole(teamId: string, role: IRole['_id']): Cursor; + + findByTeamIdAndRole(teamId: string, role: IRole['_id'], options: WithoutProjection>): Cursor; + + findByTeamIdAndRole

(teamId: string, role: IRole['_id'], options: FindOneOptions

): Cursor

; + + findByTeamIdAndRole

( + teamId: string, + role: IRole['_id'], + options?: undefined | WithoutProjection> | FindOneOptions

, + ): Cursor

| Cursor; + + findByUserIdAndTeamIds(userId: string, teamIds: Array, options?: FindOneOptions): Cursor; + findMembersInfoByTeamId(teamId: string, limit: number, skip: number, query?: FilterQuery): Cursor; + + updateOneByUserIdAndTeamId(userId: string, teamId: string, update: Partial): Promise; + createOneByTeamIdAndUserId( + teamId: string, + userId: string, + createdBy: Pick, + ): Promise>; + + updateRolesByTeamIdAndUserId(teamId: string, userId: string, roles: Array): Promise; + + removeRolesByTeamIdAndUserId(teamId: string, userId: string, roles: Array): Promise; + + deleteByUserIdAndTeamId(userId: string, teamId: string): Promise; + deleteByTeamId(teamId: string): Promise; +} diff --git a/packages/model-typings/src/models/ITeamModel.ts b/packages/model-typings/src/models/ITeamModel.ts new file mode 100644 index 000000000000..3065611e225b --- /dev/null +++ b/packages/model-typings/src/models/ITeamModel.ts @@ -0,0 +1,94 @@ +import type { WithoutProjection, FindOneOptions, Cursor, UpdateWriteOpResult, DeleteWriteOpResultObject, FilterQuery } from 'mongodb'; +import type { ITeam, TEAM_TYPE } from '@rocket.chat/core-typings'; + +import type { IBaseModel } from './IBaseModel'; + +export interface ITeamModel extends IBaseModel { + findByNames(names: Array): Cursor; + + findByNames(names: Array, options: WithoutProjection>): Cursor; + + findByNames

(names: Array, options: FindOneOptions

): Cursor

; + + findByNames

( + names: Array, + options?: undefined | WithoutProjection> | FindOneOptions

, + ): Cursor

| Cursor; + + findByIds(ids: Array, query?: FilterQuery): Cursor; + + findByIds(ids: Array, options: WithoutProjection>, query?: FilterQuery): Cursor; + + findByIds

(ids: Array, options: FindOneOptions

, query?: FilterQuery): Cursor

; + + findByIds

( + ids: Array, + options?: undefined | WithoutProjection> | FindOneOptions

, + query?: FilterQuery, + ): Cursor

| Cursor; + + findByIdsAndType(ids: Array, type: TEAM_TYPE): Cursor; + + findByIdsAndType(ids: Array, type: TEAM_TYPE, options: WithoutProjection>): Cursor; + + findByIdsAndType

(ids: Array, type: TEAM_TYPE, options: FindOneOptions

): Cursor

; + + findByIdsAndType

( + ids: Array, + type: TEAM_TYPE, + options?: undefined | WithoutProjection> | FindOneOptions

, + ): Cursor

| Cursor; + + findByType(type: number): Cursor; + + findByType(type: number, options: WithoutProjection>): Cursor; + + findByType

(type: number, options: FindOneOptions

): Cursor

; + + findByType

( + type: number, + options?: undefined | WithoutProjection> | FindOneOptions

, + ): Cursor | Cursor

; + + findByNameAndTeamIds(name: string | RegExp, teamIds: Array): Cursor; + + findByNameAndTeamIds(name: string | RegExp, teamIds: Array, options: WithoutProjection>): Cursor; + + findByNameAndTeamIds

(name: string | RegExp, teamIds: Array, options: FindOneOptions

): Cursor

; + + findByNameAndTeamIds

( + name: string | RegExp, + teamIds: Array, + options?: undefined | WithoutProjection> | FindOneOptions

, + ): Cursor

| Cursor; + + findOneByName(name: string | RegExp): Promise; + + findOneByName(name: string | RegExp, options: WithoutProjection>): Promise; + + findOneByName

(name: string | RegExp, options: FindOneOptions

): Promise

; + + findOneByName

( + name: string | RegExp, + options?: undefined | WithoutProjection> | FindOneOptions

, + ): Promise

| Promise; + + findOneByMainRoomId(roomId: string): Promise; + + findOneByMainRoomId(roomId: string, options: WithoutProjection>): Promise; + + findOneByMainRoomId

(roomId: string, options: FindOneOptions

): Promise

; + + findOneByMainRoomId

( + roomId: string, + options?: undefined | WithoutProjection> | FindOneOptions

, + ): Promise

| Promise; + + updateMainRoomForTeam(id: string, roomId: string): Promise; + + deleteOneById(id: string): Promise; + + deleteOneByName(name: string): Promise; + + updateNameAndType(teamId: string, nameAndType: { name?: string; type?: TEAM_TYPE }): Promise; +} diff --git a/packages/model-typings/src/models/IUploadsModel.ts b/packages/model-typings/src/models/IUploadsModel.ts new file mode 100644 index 000000000000..66cde2838adb --- /dev/null +++ b/packages/model-typings/src/models/IUploadsModel.ts @@ -0,0 +1,33 @@ +import type { + CollectionInsertOneOptions, + Cursor, + DeleteWriteOpResultObject, + FilterQuery, + InsertOneWriteOpResult, + UpdateOneOptions, + UpdateQuery, + UpdateWriteOpResult, + WithId, + WriteOpResult, +} from 'mongodb'; +import type { IUpload } from '@rocket.chat/core-typings'; + +import type { IBaseModel, InsertionModel } from './IBaseModel'; + +export interface IUploadsModel extends IBaseModel { + findNotHiddenFilesOfRoom(roomId: string, searchText: string, fileType: string, limit: number): Cursor; + + insert(fileData: InsertionModel, options?: CollectionInsertOneOptions): Promise>>; + + update( + filter: FilterQuery, + update: UpdateQuery | Partial, + options?: UpdateOneOptions & { multi?: boolean }, + ): Promise; + + insertFileInit(userId: string, store: string, file: { name: string }, extra: object): Promise>>; + + updateFileComplete(fileId: string, userId: string, file: object): Promise; + + deleteFile(fileId: string): Promise; +} diff --git a/packages/model-typings/src/models/IUserDataFilesModel.ts b/packages/model-typings/src/models/IUserDataFilesModel.ts new file mode 100644 index 000000000000..fc92a09b2360 --- /dev/null +++ b/packages/model-typings/src/models/IUserDataFilesModel.ts @@ -0,0 +1,9 @@ +import type { FindOneOptions, InsertOneWriteOpResult, WithId, WithoutProjection } from 'mongodb'; +import type { IUserDataFile } from '@rocket.chat/core-typings'; + +import type { IBaseModel } from './IBaseModel'; + +export interface IUserDataFilesModel extends IBaseModel { + findLastFileByUser(userId: string, options?: WithoutProjection>): Promise; + create(data: IUserDataFile): Promise>>; +} diff --git a/packages/model-typings/src/models/IUsersModel.ts b/packages/model-typings/src/models/IUsersModel.ts new file mode 100644 index 000000000000..33376095fb58 --- /dev/null +++ b/packages/model-typings/src/models/IUsersModel.ts @@ -0,0 +1,126 @@ +import type { UpdateWriteOpResult, Cursor } from 'mongodb'; +import type { IUser, IRole, IRoom, ILivechatAgent } from '@rocket.chat/core-typings'; + +import type { IBaseModel } from './IBaseModel'; + +export interface IUsersModel extends IBaseModel { + addRolesByUserId(uid: IUser['_id'], roles: IRole['_id'][]): Promise; + findUsersInRoles(roles: IRole['_id'][], scope?: null, options?: any): Cursor; + findOneByUsername(username: string, options?: any): Promise; + findOneAgentById(_id: string, options: any): Promise; + findUsersInRolesWithQuery(roles: IRole['_id'] | IRole['_id'][], query: any, options: any): any; + findOneByUsernameAndRoomIgnoringCase(username: string, rid: IRoom['_id'], options: any): any; + findOneByIdAndLoginHashedToken(_id: string, token: any, options?: any): any; + findByActiveUsersExcept( + searchTerm: any, + exceptions: any, + options: any, + searchFields: any, + extraQuery?: any, + params?: { startsWith?: boolean; endsWith?: boolean }, + ): any; + + findActive(options?: any): Cursor; + + findActiveByIds(userIds: any, options?: any): Cursor; + + findByIds(userIds: any, options?: any): Cursor; + + findOneByUsernameIgnoringCase(username: any, options: any): any; + + findOneByLDAPId(id: any, attribute?: any): Promise; + + findLDAPUsers(options?: any): any; + + findConnectedLDAPUsers(options?: any): any; + + isUserInRole(userId: IUser['_id'], roleId: IRole['_id']): Promise; + + getDistinctFederationDomains(): any; + + getNextLeastBusyAgent(department: any, ignoreAgentId: any): Promise; + + getLastAvailableAgentRouted(department: any, ignoreAgentId: any): Promise; + + setLastRoutingTime(userId: any): Promise; + + setLivechatStatusIf(userId: any, status: any, conditions?: any, extraFields?: any): any; + + getAgentAndAmountOngoingChats(userId: any): Promise; + + findAllResumeTokensByUserId(userId: any): any; + + findActiveByUsernameOrNameRegexWithExceptionsAndConditions(termRegex: any, exceptions: any, conditions: any, options: any): any; + + countAllAgentsStatus({ departmentId }: { departmentId?: any }): any; + + getTotalOfRegisteredUsersByDate({ start, end, options }: { start: any; end: any; options?: any }): Promise< + { + date: string; + users: number; + type: 'users'; + }[] + >; + + getUserLanguages(): any; + + updateStatusText(_id: any, statusText: any): any; + + updateStatusByAppId(appId: any, status: any): any; + + openAgentsBusinessHoursByBusinessHourId(businessHourIds: any): any; + + openAgentBusinessHoursByBusinessHourIdsAndAgentId(businessHourIds: any, agentId: any): any; + + addBusinessHourByAgentIds(agentIds: any, businessHourId: any): any; + + removeBusinessHourByAgentIds(agentIds: any, businessHourId: any): any; + + openBusinessHourToAgentsWithoutDepartment(agentIdsWithDepartment: any, businessHourId: any): any; + + closeBusinessHourToAgentsWithoutDepartment(agentIdsWithDepartment: any, businessHourId: any): any; + + closeAgentsBusinessHoursByBusinessHourIds(businessHourIds: any): any; + + updateLivechatStatusBasedOnBusinessHours(userIds?: any): any; + + setLivechatStatusActiveBasedOnBusinessHours(userId: any): any; + + isAgentWithinBusinessHours(agentId: any): Promise; + + removeBusinessHoursFromAllUsers(): any; + + resetTOTPById(userId: any): any; + + unsetLoginTokens(userId: any): any; + + removeNonPATLoginTokensExcept(userId: any, authToken: any): any; + + removeRoomsByRoomIdsAndUserId(rids: any, userId: any): any; + + removeRolesByUserId(uid: IUser['_id'], roles: IRole['_id'][]): Promise; + + isUserInRoleScope(uid: IUser['_id']): Promise; + + addBannerById(_id: any, banner: any): any; + + findOneByAgentUsername(username: any, options: any): any; + + findOneByExtension(extension: any, options?: any): any; + + findByExtensions(extensions: any, options?: any): Cursor; + + getVoipExtensionByUserId(userId: any, options: any): any; + + setExtension(userId: any, extension: any): any; + + unsetExtension(userId: any): any; + + getAvailableAgentsIncludingExt(includeExt: any, text: any, options: any): any; + + findActiveUsersTOTPEnable(options: any): any; + + findActiveUsersEmail2faEnable(options: any): any; + + findActiveByIdsOrUsernames(userIds: string[], options?: any): Cursor; +} diff --git a/packages/model-typings/src/models/IUsersSessionsModel.ts b/packages/model-typings/src/models/IUsersSessionsModel.ts new file mode 100644 index 000000000000..9c940129ee00 --- /dev/null +++ b/packages/model-typings/src/models/IUsersSessionsModel.ts @@ -0,0 +1,7 @@ +import type { IUserSession } from '@rocket.chat/core-typings'; + +import type { IBaseModel } from './IBaseModel'; + +export interface IUsersSessionsModel extends IBaseModel { + clearConnectionsFromInstanceId(instanceId: string[]): ReturnType['updateMany']>; +} diff --git a/packages/model-typings/src/models/IVoipRoomModel.ts b/packages/model-typings/src/models/IVoipRoomModel.ts new file mode 100644 index 000000000000..be80c17f202f --- /dev/null +++ b/packages/model-typings/src/models/IVoipRoomModel.ts @@ -0,0 +1,42 @@ +import type { WithoutProjection, FindOneOptions, WriteOpResult, Cursor } from 'mongodb'; +import type { IVoipRoom, IRoomClosingInfo } from '@rocket.chat/core-typings'; + +import type { IBaseModel } from './IBaseModel'; + +export interface IVoipRoomModel extends IBaseModel { + findOneOpenByVisitorToken(visitorToken: string, options?: FindOneOptions): Promise; + findOpenByAgentId(agentId: string): Cursor; + findOneByAgentId(agentId: string): Promise; + + findOneVoipRoomById(id: string, options?: WithoutProjection>): Promise; + findOneOpenByRoomIdAndVisitorToken(roomId: string, visitorToken: string, options?: FindOneOptions): Promise; + + findOneByVisitorToken(visitorToken: string, options?: FindOneOptions): Promise; + findOneByIdAndVisitorToken(_id: IVoipRoom['_id'], visitorToken: string, options?: FindOneOptions): Promise; + closeByRoomId(roomId: IVoipRoom['_id'], closeInfo: IRoomClosingInfo): Promise; + + findRoomsWithCriteria({ + agents, + open, + createdAt, + closedAt, + tags, + queue, + visitorId, + options, + }: { + agents?: string[]; + open?: boolean; + createdAt?: { start?: string; end?: string }; + closedAt?: { start?: string; end?: string }; + tags?: string[]; + queue?: string; + visitorId?: string; + options?: { + sort?: Record; + count?: number; + fields?: Record; + offset?: number; + }; + }): Cursor; +} diff --git a/packages/model-typings/src/models/IWebdavAccountsModel.ts b/packages/model-typings/src/models/IWebdavAccountsModel.ts new file mode 100644 index 000000000000..bc0df44de01a --- /dev/null +++ b/packages/model-typings/src/models/IWebdavAccountsModel.ts @@ -0,0 +1,24 @@ +import type { FindOneOptions, Cursor, DeleteWriteOpResultObject } from 'mongodb'; +import type { IWebdavAccount } from '@rocket.chat/core-typings'; + +import type { IBaseModel } from './IBaseModel'; + +export interface IWebdavAccountsModel extends IBaseModel { + findOneByIdAndUserId(_id: string, userId: string, options: FindOneOptions): Promise; + findOneByUserIdServerUrlAndUsername( + { + userId, + serverURL, + username, + }: { + userId: string; + serverURL: string; + username: string; + }, + options: FindOneOptions, + ): Promise; + + findWithUserId(userId: string, options: FindOneOptions): Cursor; + + removeByUserAndId(_id: string, userId: string): Promise; +} diff --git a/packages/model-typings/tsconfig.json b/packages/model-typings/tsconfig.json new file mode 100644 index 000000000000..455edb8149c4 --- /dev/null +++ b/packages/model-typings/tsconfig.json @@ -0,0 +1,8 @@ +{ + "extends": "../../tsconfig.base.json", + "compilerOptions": { + "rootDir": "./src", + "outDir": "./dist" + }, + "include": ["./src/**/*"] +} diff --git a/packages/models/package.json b/packages/models/package.json new file mode 100644 index 000000000000..87c6074d6b04 --- /dev/null +++ b/packages/models/package.json @@ -0,0 +1,34 @@ +{ + "name": "@rocket.chat/models", + "version": "0.0.1", + "private": true, + "devDependencies": { + "@types/jest": "^27.4.1", + "eslint": "^8.12.0", + "jest": "^27.5.1", + "ts-jest": "^27.1.4", + "typescript": "~4.3.4" + }, + "dependencies": { + "@rocket.chat/model-typings": "workspace:^" + }, + "scripts": { + "lint": "eslint --ext .js,.jsx,.ts,.tsx .", + "lint:fix": "eslint --ext .js,.jsx,.ts,.tsx . --fix", + "jest": "jest", + "build": "rm -rf dist && tsc -p tsconfig.json" + }, + "main": "./dist/index.js", + "typings": "./dist/index.d.ts", + "files": [ + "/dist" + ], + "eslintConfig": { + "extends": [ + "@rocket.chat/eslint-config" + ], + "ignorePatterns": [ + "**/dist" + ] + } +} diff --git a/packages/models/src/index.ts b/packages/models/src/index.ts new file mode 100644 index 000000000000..e3b4395a68b2 --- /dev/null +++ b/packages/models/src/index.ts @@ -0,0 +1,132 @@ +import type { + IAnalyticsModel, + IAvatarsModel, + IBannersDismissModel, + IBannersModel, + ICannedResponseModel, + ICredentialTokensModel, + ICustomSoundsModel, + ICustomUserStatusModel, + IEmailInboxModel, + IEmailMessageHistoryModel, + IEmojiCustomModel, + IExportOperationsModel, + IFederationKeysModel, + IFederationServersModel, + IInstanceStatusModel, + IIntegrationHistoryModel, + IIntegrationsModel, + IInvitesModel, + IImportDataModel, + ILivechatAgentActivityModel, + ILivechatBusinessHoursModel, + ILivechatCustomFieldModel, + ILivechatDepartmentAgentsModel, + ILivechatDepartmentModel, + ILivechatInquiryModel, + ILivechatPriorityModel, + ILivechatRoomsModel, + ILivechatTagModel, + ILivechatTriggerModel, + ILivechatUnitModel, + ILivechatUnitMonitorsModel, + ILivechatVisitorsModel, + ILoginServiceConfigurationModel, + IMessagesModel, + INotificationQueueModel, + INpsModel, + INpsVoteModel, + IOAuthAppsModel, + IOEmbedCacheModel, + IOmnichannelQueueModel, + IPbxEventsModel, + IPermissionsModel, + IReadReceiptsModel, + IReportsModel, + IRolesModel, + IRoomsModel, + IServerEventsModel, + ISessionsModel, + ISettingsModel, + ISmarshHistoryModel, + IStatisticsModel, + ISubscriptionsModel, + ITeamMemberModel, + ITeamModel, + IUploadsModel, + IUserDataFilesModel, + IUsersSessionsModel, + IUsersModel, + IVoipRoomModel, + IWebdavAccountsModel, +} from '@rocket.chat/model-typings'; + +import { proxify } from './proxify'; + +const prefix = 'rocketchat_'; +export function getCollectionName(name: string): string { + return `${prefix}${name}`; +} + +export { registerModel } from './proxify'; + +export const Analytics = proxify('IAnalyticsModel'); +export const Avatars = proxify('IAvatarsModel'); +export const BannersDismiss = proxify('IBannersDismissModel'); +export const Banners = proxify('IBannersModel'); +export const CannedResponse = proxify('ICannedResponseModel'); +export const CredentialTokens = proxify('ICredentialTokensModel'); +export const CustomSounds = proxify('ICustomSoundsModel'); +export const CustomUserStatus = proxify('ICustomUserStatusModel'); +export const EmailInbox = proxify('IEmailInboxModel'); +export const EmailMessageHistory = proxify('IEmailMessageHistoryModel'); +export const EmojiCustom = proxify('IEmojiCustomModel'); +export const ExportOperations = proxify('IExportOperationsModel'); +export const FederationServers = proxify('IFederationServersModel'); +export const FederationKeys = proxify('IFederationKeysModel'); +export const ImportData = proxify('IImportDataModel'); +export const InstanceStatus = proxify('IInstanceStatusModel'); +export const IntegrationHistory = proxify('IIntegrationHistoryModel'); +export const Integrations = proxify('IIntegrationsModel'); +export const Invites = proxify('IInvitesModel'); +export const LivechatAgentActivity = proxify('ILivechatAgentActivityModel'); +export const LivechatBusinessHours = proxify('ILivechatBusinessHoursModel'); +export const LivechatCustomField = proxify('ILivechatCustomFieldModel'); +export const LivechatDepartmentAgents = proxify('ILivechatDepartmentAgentsModel'); +export const LivechatDepartment = proxify('ILivechatDepartmentModel'); +export const LivechatInquiry = proxify('ILivechatInquiryModel'); +export const LivechatPriority = proxify('ILivechatPriorityModel'); +export const LivechatRooms = proxify('ILivechatRoomsModel'); +export const LivechatTag = proxify('ILivechatTagModel'); +export const LivechatTrigger = proxify('ILivechatTriggerModel'); +export const LivechatVisitors = proxify('ILivechatVisitorsModel'); +export const LivechatUnit = proxify('ILivechatUnitModel'); +export const LivechatUnitMonitors = proxify('ILivechatUnitMonitorsModel'); +export const LoginServiceConfiguration = proxify('ILoginServiceConfigurationModel'); +export const Messages = proxify('IMessagesModel'); +export const NotificationQueue = proxify('INotificationQueueModel'); +export const Nps = proxify('INpsModel'); +export const NpsVote = proxify('INpsVoteModel'); +export const OAuthApps = proxify('IOAuthAppsModel'); +export const OEmbedCache = proxify('IOEmbedCacheModel'); +export const OmnichannelQueue = proxify('IOmnichannelQueueModel'); +export const PbxEvents = proxify('IPbxEventsModel'); +export const Permissions = proxify('IPermissionsModel'); +export const ReadReceipts = proxify('IReadReceiptsModel'); +export const Reports = proxify('IReportsModel'); +export const Roles = proxify('IRolesModel'); +export const Rooms = proxify('IRoomsModel'); +export const ServerEvents = proxify('IServerEventsModel'); +export const Sessions = proxify('ISessionsModel'); +export const Settings = proxify('ISettingsModel'); +export const SmarshHistory = proxify('ISmarshHistoryModel'); +export const Statistics = proxify('IStatisticsModel'); +export const Subscriptions = proxify('ISubscriptionsModel'); +export const TeamMember = proxify('ITeamMemberModel'); +export const Team = proxify('ITeamModel'); +export const Users = proxify('IUsersModel'); +export const Uploads = proxify('IUploadsModel'); +export const UserDataFiles = proxify('IUserDataFilesModel'); +export const UsersSessions = proxify('IUsersSessionsModel'); +export const VoipRoom = proxify('IVoipRoomModel'); +export const WebdavAccounts = proxify('IWebdavAccountsModel'); diff --git a/packages/models/src/proxify.ts b/packages/models/src/proxify.ts new file mode 100644 index 000000000000..17b9571c1a97 --- /dev/null +++ b/packages/models/src/proxify.ts @@ -0,0 +1,29 @@ +import type { IBaseModel } from '@rocket.chat/model-typings'; + +const lazyModels = new Map IBaseModel>(); +const models = new Map>(); + +function handler(namespace: string): ProxyHandler { + return { + get: (_target: T, prop: string): any => { + if (!models.has(namespace) && lazyModels.has(namespace)) { + models.set(namespace, (lazyModels.get(namespace) as () => IBaseModel)()); + } + + // @ts-expect-error + return models.get(namespace)[prop]; + }, + }; +} + +export function registerModel(name: string, instance: IBaseModel | (() => IBaseModel)): void { + if (typeof instance === 'function') { + lazyModels.set(name, instance); + } else { + models.set(name, instance); + } +} + +export function proxify(namespace: string): T { + return new Proxy({}, handler(namespace)) as unknown as T; +} diff --git a/packages/models/tsconfig.json b/packages/models/tsconfig.json new file mode 100644 index 000000000000..010aef9ff7de --- /dev/null +++ b/packages/models/tsconfig.json @@ -0,0 +1,10 @@ +{ + "extends": "../../tsconfig.base.json", + "compilerOptions": { + "rootDir": "./src", + "outDir": "./dist", + "resolveJsonModule": true, + "esModuleInterop": true, + }, + "include": ["./src/**/*"] +} diff --git a/packages/node-poplib/package.json b/packages/node-poplib/package.json new file mode 100644 index 000000000000..d209d09aaf3d --- /dev/null +++ b/packages/node-poplib/package.json @@ -0,0 +1,17 @@ +{ + "name": "@rocket.chat/poplib", + "version": "0.0.1", + "private": true, + "devDependencies": { + "@types/jest": "^27.4.1", + "eslint": "^8.12.0", + "jest": "^27.5.1", + "ts-jest": "^27.1.4", + "typescript": "~4.3.4" + }, + "scripts": { + "jest": "jest" + }, + "main": "./src/index.js", + "typings": "./dist/index.d.ts" +} diff --git a/packages/node-poplib/src/index.js b/packages/node-poplib/src/index.js new file mode 100644 index 000000000000..d60b540790ab --- /dev/null +++ b/packages/node-poplib/src/index.js @@ -0,0 +1,730 @@ +/* + + Node.js POP3 client library + + Copyright (C) 2011-2013 by Ditesh Shashikant Gathani + + Permission is hereby granted, free of charge, to any person obtaining a copy + of this software and associated documentation files (the "Software"), to deal + in the Software without restriction, including without limitation the rights + to use, copy, modify, merge, publish, distribute, sublicense, and/or sell + copies of the Software, and to permit persons to whom the Software is + furnished to do so, subject to the following conditions: + + The above copyright notice and this permission notice shall be included in + all copies or substantial portions of the Software. + + THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE + AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, + OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN + THE SOFTWARE. + +*/ + +var net = require('net'), + tls = require('tls'), + util = require('util'), + crypto = require('crypto'), + events = require('events'); + +// Constructor +function POP3Client(port, host, options) { + if (options === undefined) options = {}; + + // Optional constructor arguments + var enabletls = options.enabletls !== undefined ? options.enabletls : false; + var ignoretlserrs = options.ignoretlserrs !== undefined ? options.ignoretlserrs : false; + var debug = options.debug || false; + + var tlsDirectOpts = options.tlsopts !== undefined ? options.tlsopts : {}; + + // Private variables follow + var self = this; + var response = null; + var checkResp = true; + var bufferedData = ''; + var state = 0; + var locked = false; + var multiline = false; + var socket = null; + var tlssock = null; + var callback = function (resp, data) { + if (resp === false) { + locked = false; + callback = function () {}; + self.emit('connect', false, data); + } else { + // Checking for APOP support + var banner = data.trim(); + var bannerComponents = banner.split(' '); + + for (var i = 0; i < bannerComponents.length; i++) { + if (bannerComponents[i].indexOf('@') > 0) { + self.data['apop'] = true; + self.data['apop-timestamp'] = bannerComponents[i]; + break; + } + } + + state = 1; + self.data['banner'] = banner; + self.emit('connect', true, data); + } + }; + + // Public variables follow + this.data = { + host: host, + port: port, + banner: '', + stls: false, + apop: false, + username: '', + tls: enabletls, + ignoretlserrs: ignoretlserrs, + }; + + // Privileged methods follow + this.setCallback = function (cb) { + callback = cb; + }; + this.getCallback = function () { + return callback; + }; + this.setState = function (val) { + state = val; + }; + this.getState = function () { + return state; + }; + this.setLocked = function (val) { + locked = val; + }; + this.getLocked = function () { + return locked; + }; + this.setMultiline = function (val) { + multiline = val; + }; + this.getMultiline = function () { + return multiline; + }; + + // Writes to remote server socket + this.write = function (command, argument) { + var text = command; + + if (argument !== undefined) text = text + ' ' + argument + '\r\n'; + else text = text + '\r\n'; + + if (debug) console.log('Client: ' + util.inspect(text)); + + socket.write(text); + }; + + // Kills the socket connection + this.end = function () { + socket.end(); + }; + + // Upgrades a standard unencrypted TCP connection to use TLS + // Liberally copied and modified from https://gist.github.com/848444 + // starttls() should be a private function, but I can't figure out + // how to get a public prototypal method (stls) to talk to private method (starttls) + // which references private variables without going through a privileged method + this.starttls = function (options) { + var s = socket; + s.removeAllListeners('end'); + s.removeAllListeners('data'); + s.removeAllListeners('error'); + socket = null; + + var sslcontext = require('crypto').createCredentials(options); + var pair = tls.createSecurePair(sslcontext, false); + var cleartext = pipe(pair); + + pair.on('secure', function () { + var verifyError = pair.ssl.verifyError(); + cleartext.authorized = true; + + if (verifyError) { + cleartext.authorized = false; + cleartext.authorizationError = verifyError; + } + + cleartext.on('data', onData); + cleartext.on('error', onError); + cleartext.on('end', onEnd); + socket = cleartext; + self.getCallback()(cleartext.authorized, cleartext.authorizationError); + }); + + cleartext._controlReleased = true; + + function pipe(pair) { + pair.encrypted.pipe(s); + s.pipe(pair.encrypted); + + pair.fd = s.fd; + var cleartext = pair.cleartext; + cleartext.socket = s; + cleartext.encrypted = pair.encrypted; + cleartext.authorized = false; + + function onerror(e) { + if (cleartext._controlReleased) cleartext.emit('error', e); + } + + function onclose() { + s.removeListener('error', onerror); + s.removeListener('close', onclose); + } + + s.on('error', onerror); + s.on('close', onclose); + return cleartext; + } + }; + + // Private methods follow + // Event handlers follow + function onData(data) { + data = data.toString('ascii'); + bufferedData += data; + + if (debug) console.log('Server: ' + util.inspect(data)); + + if (checkResp === true) { + if (bufferedData.substr(0, 3) === '+OK') { + checkResp = false; + response = true; + } else if (bufferedData.substr(0, 4) === '-ERR') { + checkResp = false; + response = false; + + // The following is only used for SASL + } else if (multiline === false) { + checkResp = false; + response = true; + } + } + + if (checkResp === false) { + if (multiline === true && (response === false || bufferedData.substr(bufferedData.length - 5) === '\r\n.\r\n')) { + // Make a copy to avoid race conditions + var responseCopy = response; + var bufferedDataCopy = bufferedData; + + response = null; + checkResp = true; + multiline = false; + bufferedData = ''; + + callback(responseCopy, bufferedDataCopy); + } else if (multiline === false) { + // Make a copy to avoid race conditions + var responseCopy = response; + var bufferedDataCopy = bufferedData; + + response = null; + checkResp = true; + multiline = false; + bufferedData = ''; + + callback(responseCopy, bufferedDataCopy); + } + } + } + + function onError(err) { + if (err.errno === 111) self.emit('connect', false, err); + else self.emit('error', err); + } + + function onEnd(data) { + self.setState(0); + socket = null; + } + + function onClose() { + self.emit('close'); + } + + // Constructor code follows + // Set up EventEmitter constructor function + events.EventEmitter.call(this); + + // Remote end socket + if (enabletls === true) { + tlssock = tls.connect( + { + host: host, + port: port, + rejectUnauthorized: !self.data.ignoretlserrs, + }, + function () { + if (tlssock.authorized === false && self.data['ignoretlserrs'] === false) self.emit('tls-error', tlssock.authorizationError); + }, + ); + + socket = tlssock; + } else socket = new net.createConnection(port, host); + + // Set up event handlers + socket.on('data', onData); + socket.on('error', onError); + socket.on('end', onEnd); + socket.on('close', onClose); +} + +util.inherits(POP3Client, events.EventEmitter); + +POP3Client.prototype.login = function (username, password) { + var self = this; + + if (self.getState() !== 1) self.emit('invalid-state', 'login'); + else if (self.getLocked() === true) self.emit('locked', 'login'); + else { + self.setLocked(true); + self.setCallback(function (resp, data) { + if (resp === false) { + self.setLocked(false); + self.setCallback(function () {}); + self.emit('login', false, data); + } else { + self.setCallback(function (resp, data) { + self.setLocked(false); + self.setCallback(function () {}); + + if (resp !== false) self.setState(2); + self.emit('login', resp, data); + }); + + self.setMultiline(false); + self.write('PASS', password); + } + }); + + self.setMultiline(false); + self.write('USER', username); + } +}; + +// SASL AUTH implementation +// Currently supports SASL PLAIN and CRAM-MD5 +POP3Client.prototype.auth = function (type, username, password) { + type = type.toUpperCase(); + var self = this; + var types = { 'PLAIN': 1, 'CRAM-MD5': 1 }; + var initialresp = ''; + + if (self.getState() !== 1) self.emit('invalid-state', 'auth'); + else if (self.getLocked() === true) self.emit('locked', 'auth'); + + if (type in types === false) { + self.emit('auth', false, 'Invalid auth type', null); + return; + } + + function tlsok() { + if (type === 'PLAIN') { + initialresp = ' ' + new Buffer(username + '\u0000' + username + '\u0000' + password).toString('base64') + '='; + self.setCallback(function (resp, data) { + if (resp !== false) self.setState(2); + self.emit('auth', resp, data, data); + }); + } else if (type === 'CRAM-MD5') { + self.setCallback(function (resp, data) { + if (resp === false) self.emit('auth', resp, 'Server responded -ERR to AUTH CRAM-MD5', data); + else { + var challenge = new Buffer(data.trim().substr(2), 'base64').toString(); + var hmac = crypto.createHmac('md5', password); + var response = new Buffer(username + ' ' + hmac.update(challenge).digest('hex')).toString('base64'); + + self.setCallback(function (resp, data) { + var errmsg = null; + + if (resp !== false) self.setState(2); + else errmsg = 'Server responded -ERR to response'; + + self.emit('auth', resp, null, data); + }); + + self.write(response); + } + }); + } + + self.write('AUTH ' + type + initialresp); + } + + if (self.data['tls'] === false && self.data['stls'] === false) { + // Remove all existing STLS listeners + self.removeAllListeners('stls'); + + self.on('stls', function (resp, rawdata) { + if (resp === false) { + // We (optionally) ignore self signed cert errors, + // in blatant violation of RFC 2595, Section 2.4 + if (self.data['ignoretlserrs'] === true && rawdata === 'DEPTH_ZERO_SELF_SIGNED_CERT') tlsok(); + else self.emit('auth', false, 'Unable to upgrade connection to STLS', rawdata); + } else tlsok(); + }); + + self.stls(); + } else tlsok(); +}; + +POP3Client.prototype.apop = function (username, password) { + var self = this; + + if (self.getState() !== 1) self.emit('invalid-state', 'apop'); + else if (self.getLocked() === true) self.emit('locked', 'apop'); + else if (self.data['apop'] === false) self.emit('apop', false, 'APOP support not detected on remote server'); + else { + self.setLocked(true); + self.setCallback(function (resp, data) { + self.setLocked(false); + self.setCallback(function () {}); + + if (resp === true) self.setState(2); + self.emit('apop', resp, data); + }); + + self.setMultiline(false); + self.write( + 'APOP', + username + + ' ' + + crypto + .createHash('md5') + .update(self.data['apop-timestamp'] + password) + .digest('hex'), + ); + } +}; + +POP3Client.prototype.stls = function () { + var self = this; + + if (self.getState() !== 1) self.emit('invalid-state', 'stls'); + else if (self.getLocked() === true) self.emit('locked', 'stls'); + else if (self.data['tls'] === true) self.emit('stls', false, 'Unable to execute STLS as TLS connection already established'); + else { + self.setLocked(true); + self.setCallback(function (resp, data) { + self.setLocked(false); + self.setCallback(function () {}); + + if (resp === true) { + self.setCallback(function (resp, data) { + if (resp === false && self.data['ignoretlserrs'] === true && data === 'DEPTH_ZERO_SELF_SIGNED_CERT') resp = true; + + self.data['stls'] = true; + self.emit('stls', resp, data); + }); + + self.starttls(); + } else self.emit('stls', false, data); + }); + + self.setMultiline(false); + self.write('STLS'); + } +}; + +POP3Client.prototype.top = function (msgnumber, lines) { + var self = this; + + if (self.getState() !== 2) self.emit('invalid-state', 'top'); + else if (self.getLocked() === true) self.emit('locked', 'top'); + else { + self.setCallback(function (resp, data) { + var returnValue = null; + self.setLocked(false); + self.setCallback(function () {}); + + if (resp !== false) { + returnValue = ''; + var startOffset = data.indexOf('\r\n', 0) + 2; + var endOffset = data.indexOf('\r\n.\r\n', 0) + 2; + + if (endOffset > startOffset) returnValue = data.substr(startOffset, endOffset - startOffset); + } + + self.emit('top', resp, msgnumber, returnValue, data); + }); + + self.setMultiline(true); + self.write('TOP', msgnumber + ' ' + lines); + } +}; + +POP3Client.prototype.list = function (msgnumber) { + var self = this; + + if (self.getState() !== 2) self.emit('invalid-state', 'list'); + else if (self.getLocked() === true) self.emit('locked', 'list'); + else { + self.setLocked(true); + self.setCallback(function (resp, data) { + var returnValue = null; + var msgcount = 0; + self.setLocked(false); + self.setCallback(function () {}); + + if (resp !== false) { + returnValue = []; + + if (msgnumber !== undefined) { + msgcount = 1; + listitem = data.split(' '); + returnValue[listitem[1]] = listitem[2]; + } else { + var offset = 0; + var listitem = ''; + var newoffset = 0; + var returnValue = []; + var startOffset = data.indexOf('\r\n', 0) + 2; + var endOffset = data.indexOf('\r\n.\r\n', 0) + 2; + + if (endOffset > startOffset) { + data = data.substr(startOffset, endOffset - startOffset); + + while (true) { + if (offset > endOffset) break; + + newoffset = data.indexOf('\r\n', offset); + + if (newoffset < 0) break; + + msgcount++; + listitem = data.substr(offset, newoffset - offset); + listitem = listitem.split(' '); + returnValue[listitem[0]] = listitem[1]; + offset = newoffset + 2; + } + } + } + } + + self.emit('list', resp, msgcount, msgnumber, returnValue, data); + }); + + if (msgnumber !== undefined) self.setMultiline(false); + else self.setMultiline(true); + + self.write('LIST', msgnumber); + } +}; + +POP3Client.prototype.stat = function () { + var self = this; + + if (self.getState() !== 2) self.emit('invalid-state', 'stat'); + else if (self.getLocked() === true) self.emit('locked', 'stat'); + else { + self.setLocked(true); + self.setCallback(function (resp, data) { + var returnValue = null; + self.setLocked(false); + self.setCallback(function () {}); + + if (resp !== false) { + listitem = data.split(' '); + returnValue = { + count: listitem[1].trim(), + octets: listitem[2].trim(), + }; + } + + self.emit('stat', resp, returnValue, data); + }); + + self.setMultiline(false); + self.write('STAT', undefined); + } +}; + +POP3Client.prototype.uidl = function (msgnumber) { + var self = this; + + if (self.getState() !== 2) self.emit('invalid-state', 'uidl'); + else if (self.getLocked() === true) self.emit('locked', 'uidl'); + else { + self.setLocked(true); + self.setCallback(function (resp, data) { + var returnValue = null; + self.setLocked(false); + self.setCallback(function () {}); + + if (resp !== false) { + returnValue = []; + + if (msgnumber !== undefined) { + listitem = data.split(' '); + returnValue[listitem[1]] = listitem[2].trim(); + } else { + var offset = 0; + var listitem = ''; + var newoffset = 0; + var returnValue = []; + var startOffset = data.indexOf('\r\n', 0) + 2; + var endOffset = data.indexOf('\r\n.\r\n', 0) + 2; + + if (endOffset > startOffset) { + data = data.substr(startOffset, endOffset - startOffset); + endOffset -= startOffset; + + while (offset < endOffset) { + newoffset = data.indexOf('\r\n', offset); + listitem = data.substr(offset, newoffset - offset); + listitem = listitem.split(' '); + returnValue[listitem[0]] = listitem[1]; + offset = newoffset + 2; + } + } + } + } + + self.emit('uidl', resp, msgnumber, returnValue, data); + }); + + if (msgnumber !== undefined) self.setMultiline(false); + else self.setMultiline(true); + + self.write('UIDL', msgnumber); + } +}; + +POP3Client.prototype.retr = function (msgnumber) { + var self = this; + + if (self.getState() !== 2) self.emit('invalid-state', 'retr'); + else if (self.getLocked() === true) self.emit('locked', 'retr'); + else { + self.setLocked(true); + self.setCallback(function (resp, data) { + var returnValue = null; + self.setLocked(false); + self.setCallback(function () {}); + + if (resp !== false) { + var startOffset = data.indexOf('\r\n', 0) + 2; + var endOffset = data.indexOf('\r\n.\r\n', 0); + returnValue = data.substr(startOffset, endOffset - startOffset); + } + + self.emit('retr', resp, msgnumber, returnValue, data); + }); + + self.setMultiline(true); + self.write('RETR', msgnumber); + } +}; + +POP3Client.prototype.dele = function (msgnumber) { + var self = this; + + if (self.getState() !== 2) self.emit('invalid-state', 'dele'); + else if (self.getLocked() === true) self.emit('locked', 'dele'); + else { + self.setLocked(true); + self.setCallback(function (resp, data) { + self.setLocked(false); + self.setCallback(function () {}); + self.emit('dele', resp, msgnumber, data); + }); + + self.setMultiline(false); + self.write('DELE', msgnumber); + } +}; + +POP3Client.prototype.noop = function () { + var self = this; + + if (self.getState() !== 2) self.emit('invalid-state', 'noop'); + else if (self.getLocked() === true) self.emit('locked', 'noop'); + else { + self.setLocked(true); + self.setCallback(function (resp, data) { + self.setLocked(false); + self.setCallback(function () {}); + self.emit('noop', resp, data); + }); + + self.setMultiline(false); + self.write('NOOP', undefined); + } +}; + +POP3Client.prototype.rset = function () { + var self = this; + + if (self.getState() !== 2) self.emit('invalid-state', 'rset'); + else if (self.getLocked() === true) self.emit('locked', 'rset'); + else { + self.setLocked(true); + self.setCallback(function (resp, data) { + self.setLocked(false); + self.setCallback(function () {}); + self.emit('rset', resp, data); + }); + + self.setMultiline(false); + self.write('RSET', undefined); + } +}; + +POP3Client.prototype.capa = function () { + var self = this; + + if (self.getState() === 0) self.emit('invalid-state', 'quit'); + else if (self.getLocked() === true) self.emit('locked', 'capa'); + else { + self.setLocked(true); + self.setCallback(function (resp, data) { + var returnValue = null; + self.setLocked(false); + self.setCallback(function () {}); + + if (resp === true) { + var startOffset = data.indexOf('\r\n', 0) + 2; + var endOffset = data.indexOf('\r\n.\r\n', 0); + returnValue = data.substr(startOffset, endOffset - startOffset); + returnValue = returnValue.split('\r\n'); + } + + self.emit('capa', resp, returnValue, data); + }); + + self.setMultiline(true); + self.write('CAPA', undefined); + } +}; + +POP3Client.prototype.quit = function () { + var self = this; + + if (self.getState() === 0) self.emit('invalid-state', 'quit'); + else if (self.getLocked() === true) self.emit('locked', 'quit'); + else { + self.setLocked(true); + self.setCallback(function (resp, data) { + self.setLocked(false); + self.setCallback(function () {}); + + self.end(); + self.emit('quit', resp, data); + }); + + self.setMultiline(false); + self.write('QUIT', undefined); + } +}; + +module.exports = POP3Client; diff --git a/packages/rest-typings/src/index.ts b/packages/rest-typings/src/index.ts index 69c8058182fd..6cf852d8f18b 100644 --- a/packages/rest-typings/src/index.ts +++ b/packages/rest-typings/src/index.ts @@ -185,3 +185,12 @@ export * from './v1/users/UsersSetAvatarParamsPOST'; export * from './v1/users/UsersSetPreferenceParamsPOST'; export * from './v1/users/UsersUpdateOwnBasicInfoParamsPOST'; export * from './v1/users/UsersUpdateParamsPOST'; +export * from './v1/import/UploadImportFileParamsPOST'; +export * from './v1/import/DownloadPublicImportFileParamsPOST'; +export * from './v1/import/StartImportParamsPOST'; +export * from './v1/import/GetImportFileDataParamsGET'; +export * from './v1/import/GetImportProgressParamsGET'; +export * from './v1/import/GetLatestImportOperationsParamsGET'; +export * from './v1/import/DownloadPendingFilesParamsPOST'; +export * from './v1/import/DownloadPendingAvatarsParamsPOST'; +export * from './v1/import/GetCurrentImportOperationParamsGET'; diff --git a/packages/rest-typings/src/v1/chat.ts b/packages/rest-typings/src/v1/chat.ts index 07024e9a4138..47409cbdd07b 100644 --- a/packages/rest-typings/src/v1/chat.ts +++ b/packages/rest-typings/src/v1/chat.ts @@ -198,12 +198,14 @@ const ChatGetThreadsListSchema = { }, offset: { type: 'number', + nullable: true, }, count: { type: 'number', + nullable: true, }, }, - required: ['rid', 'type', 'offset', 'count'], + required: ['rid', 'type'], additionalProperties: false, }; diff --git a/packages/rest-typings/src/v1/import/DownloadPendingAvatarsParamsPOST.ts b/packages/rest-typings/src/v1/import/DownloadPendingAvatarsParamsPOST.ts new file mode 100644 index 000000000000..b32ff549cdc3 --- /dev/null +++ b/packages/rest-typings/src/v1/import/DownloadPendingAvatarsParamsPOST.ts @@ -0,0 +1,26 @@ +import Ajv from 'ajv'; + +const ajv = new Ajv({ + coerceTypes: true, +}); + +export type DownloadPendingAvatarsParamsPOST = { + userId: string; + count: number; +}; + +const DownloadPendingAvatarsParamsPOSTSchema = { + type: 'object', + properties: { + userId: { + type: 'string', + }, + count: { + type: 'number', + }, + }, + additionalProperties: false, + required: ['userId', 'count'], +}; + +export const isDownloadPendingAvatarsParamsPOST = ajv.compile(DownloadPendingAvatarsParamsPOSTSchema); diff --git a/packages/rest-typings/src/v1/import/DownloadPendingFilesParamsPOST.ts b/packages/rest-typings/src/v1/import/DownloadPendingFilesParamsPOST.ts new file mode 100644 index 000000000000..6f8a4ed06136 --- /dev/null +++ b/packages/rest-typings/src/v1/import/DownloadPendingFilesParamsPOST.ts @@ -0,0 +1,26 @@ +import Ajv from 'ajv'; + +const ajv = new Ajv({ + coerceTypes: true, +}); + +export type DownloadPendingFilesParamsPOST = { + userId: string; + count: number; +}; + +const DownloadPendingFilesParamsPOSTSchema = { + type: 'object', + properties: { + userId: { + type: 'string', + }, + count: { + type: 'number', + }, + }, + additionalProperties: false, + required: ['userId', 'count'], +}; + +export const isDownloadPendingFilesParamsPOST = ajv.compile(DownloadPendingFilesParamsPOSTSchema); diff --git a/packages/rest-typings/src/v1/import/DownloadPublicImportFileParamsPOST.ts b/packages/rest-typings/src/v1/import/DownloadPublicImportFileParamsPOST.ts new file mode 100644 index 000000000000..cb66f7d95b7c --- /dev/null +++ b/packages/rest-typings/src/v1/import/DownloadPublicImportFileParamsPOST.ts @@ -0,0 +1,28 @@ +import Ajv from 'ajv'; + +const ajv = new Ajv({ + coerceTypes: true, +}); + +export type DownloadPublicImportFileParamsPOST = { + fileUrl: string; + importerKey: string; +}; + +const DownloadPublicImportFileParamsPostSchema = { + type: 'object', + properties: { + fileUrl: { + type: 'string', + }, + importerKey: { + type: 'string', + }, + }, + additionalProperties: false, + required: ['fileUrl', 'importerKey'], +}; + +export const isDownloadPublicImportFileParamsPOST = ajv.compile( + DownloadPublicImportFileParamsPostSchema, +); diff --git a/packages/rest-typings/src/v1/import/GetCurrentImportOperationParamsGET.ts b/packages/rest-typings/src/v1/import/GetCurrentImportOperationParamsGET.ts new file mode 100644 index 000000000000..c0ca86ae1d89 --- /dev/null +++ b/packages/rest-typings/src/v1/import/GetCurrentImportOperationParamsGET.ts @@ -0,0 +1,28 @@ +import Ajv from 'ajv'; + +const ajv = new Ajv({ + coerceTypes: true, +}); + +export type GetCurrentImportOperationParamsGET = { + userId: string; + operation: string; +}; + +const GetCurrentImportOperationParamsGETSchema = { + type: 'object', + properties: { + userId: { + type: 'string', + }, + operation: { + type: 'string', + }, + }, + additionalProperties: false, + required: ['userId', 'operation'], +}; + +export const isGetCurrentImportOperationParamsGET = ajv.compile( + GetCurrentImportOperationParamsGETSchema, +); diff --git a/packages/rest-typings/src/v1/import/GetImportFileDataParamsGET.ts b/packages/rest-typings/src/v1/import/GetImportFileDataParamsGET.ts new file mode 100644 index 000000000000..83ca0d7a6ffd --- /dev/null +++ b/packages/rest-typings/src/v1/import/GetImportFileDataParamsGET.ts @@ -0,0 +1,22 @@ +import Ajv from 'ajv'; + +const ajv = new Ajv({ + coerceTypes: true, +}); + +export type GetImportFileDataParamsGET = { + userId: string; +}; + +const GetImportFileDataParamsGETSchema = { + type: 'object', + properties: { + userId: { + type: 'string', + }, + }, + additionalProperties: false, + required: ['userId'], +}; + +export const isGetImportFileDataParamsGET = ajv.compile(GetImportFileDataParamsGETSchema); diff --git a/packages/rest-typings/src/v1/import/GetImportProgressParamsGET.ts b/packages/rest-typings/src/v1/import/GetImportProgressParamsGET.ts new file mode 100644 index 000000000000..23af8372908a --- /dev/null +++ b/packages/rest-typings/src/v1/import/GetImportProgressParamsGET.ts @@ -0,0 +1,22 @@ +import Ajv from 'ajv'; + +const ajv = new Ajv({ + coerceTypes: true, +}); + +export type GetImportProgressParamsGET = { + userId: string; +}; + +const GetImportProgressParamsGETSchema = { + type: 'object', + properties: { + userId: { + type: 'string', + }, + }, + additionalProperties: false, + required: ['userId'], +}; + +export const isGetImportProgressParamsGET = ajv.compile(GetImportProgressParamsGETSchema); diff --git a/packages/rest-typings/src/v1/import/GetLatestImportOperationsParamsGET.ts b/packages/rest-typings/src/v1/import/GetLatestImportOperationsParamsGET.ts new file mode 100644 index 000000000000..8efcd45fa371 --- /dev/null +++ b/packages/rest-typings/src/v1/import/GetLatestImportOperationsParamsGET.ts @@ -0,0 +1,24 @@ +import Ajv from 'ajv'; + +const ajv = new Ajv({ + coerceTypes: true, +}); + +export type GetLatestImportOperationsParamsGET = { + userId: string; +}; + +const GetLatestImportOperationsParamsGETSchema = { + type: 'object', + properties: { + userId: { + type: 'string', + }, + }, + additionalProperties: false, + required: ['userId'], +}; + +export const isGetLatestImportOperationsParamsGET = ajv.compile( + GetLatestImportOperationsParamsGETSchema, +); diff --git a/packages/rest-typings/src/v1/import/StartImportParamsPOST.ts b/packages/rest-typings/src/v1/import/StartImportParamsPOST.ts new file mode 100644 index 000000000000..300079addebb --- /dev/null +++ b/packages/rest-typings/src/v1/import/StartImportParamsPOST.ts @@ -0,0 +1,22 @@ +import Ajv, { JSONSchemaType } from 'ajv'; + +const ajv = new Ajv({ + coerceTypes: true, +}); + +export type StartImportParamsPOST = { + input: string; +}; + +const StartImportParamsPostSchema: JSONSchemaType = { + type: 'object', + properties: { + input: { + type: 'string', + }, + }, + additionalProperties: false, + required: ['input'], +}; + +export const isStartImportParamsPOST = ajv.compile(StartImportParamsPostSchema); diff --git a/packages/rest-typings/src/v1/import/UploadImportFileParamsPOST.ts b/packages/rest-typings/src/v1/import/UploadImportFileParamsPOST.ts new file mode 100644 index 000000000000..67b7bcf4fa64 --- /dev/null +++ b/packages/rest-typings/src/v1/import/UploadImportFileParamsPOST.ts @@ -0,0 +1,34 @@ +import Ajv from 'ajv'; + +const ajv = new Ajv({ + coerceTypes: true, +}); + +export type UploadImportFileParamsPOST = { + binaryContent: string; + contentType: string; + fileName: string; + importerKey: string; +}; + +const UploadImportFileParamsPostSchema = { + type: 'object', + properties: { + binaryContent: { + type: 'string', + }, + contentType: { + type: 'string', + }, + fileName: { + type: 'string', + }, + importerKey: { + type: 'string', + }, + }, + additionalProperties: false, + required: ['binaryContent', 'contentType', 'fileName', 'importerKey'], +}; + +export const isUploadImportFileParamsPOST = ajv.compile(UploadImportFileParamsPostSchema); diff --git a/packages/rest-typings/src/v1/teams/index.ts b/packages/rest-typings/src/v1/teams/index.ts index 82f1b1d0abcf..f5aabd3acc3c 100644 --- a/packages/rest-typings/src/v1/teams/index.ts +++ b/packages/rest-typings/src/v1/teams/index.ts @@ -25,8 +25,8 @@ type ITeamAutocompleteResult = Pick; } interface ITeamMemberInfo { diff --git a/packages/rest-typings/src/v1/voip.ts b/packages/rest-typings/src/v1/voip.ts index 9ec925154779..b01f9dafbfd1 100644 --- a/packages/rest-typings/src/v1/voip.ts +++ b/packages/rest-typings/src/v1/voip.ts @@ -516,9 +516,11 @@ export type VoipEndpoints = { }; }; '/v1/omnichannel/agent/extension': { - GET: (params: OmnichannelAgentExtensionGET) => { extension: Pick }; POST: (params: OmnichannelAgentExtensionPOST) => void; - DELETE: (params: OmnichannelAgentExtensionDELETE) => void; + }; + '/v1/omnichannel/agent/extension/:username': { + GET: () => { extension: Pick }; + DELETE: () => void; }; '/v1/omnichannel/agents/available': { GET: (params: OmnichannelAgentsAvailable) => PaginatedResult<{ agents: ILivechatAgent[] }>; diff --git a/packages/ui-contexts/src/ModalContext.ts b/packages/ui-contexts/src/ModalContext.ts index 3d65fbb53d44..983c9c6d0dc6 100644 --- a/packages/ui-contexts/src/ModalContext.ts +++ b/packages/ui-contexts/src/ModalContext.ts @@ -35,39 +35,25 @@ type ModalInstance = ModalConfiguration & { }; export type ModalContextValue = { - open( - config?: ModalConfiguration, - fn?: (instance: ModalInstance, value: unknown) => void, - onCancel?: (instance: ModalInstance) => void, - ): void; - push( - config?: ModalConfiguration, - fn?: (instance: ModalInstance, value: unknown) => void, - onCancel?: (instance: ModalInstance) => void, - ): ModalInstance; - cancel(): void; - close(): void; - confirm(value: unknown): void; - showInputError(text: string): void; - onKeyDown(event: KeyboardEvent): void; - setModal(modal: ReactNode): void; + modal: { + open( + config?: ModalConfiguration, + fn?: (instance: ModalInstance, value: unknown) => void, + onCancel?: (instance: ModalInstance) => void, + ): void; + push( + config?: ModalConfiguration, + fn?: (instance: ModalInstance, value: unknown) => void, + onCancel?: (instance: ModalInstance) => void, + ): ModalInstance; + cancel(): void; + close(): void; + confirm(value: unknown): void; + showInputError(text: string): void; + onKeyDown(event: KeyboardEvent): void; + setModal(modal: ReactNode): void; + }; + currentModal: ReactNode; }; -export const ModalContext = createContext({ - open: () => undefined, - push: () => ({ - render: (): void => undefined, - hide: (): void => undefined, - destroy: (): void => undefined, - close: (): void => undefined, - confirm: (): void => undefined, - cancel: (): void => undefined, - showInputError: (): void => undefined, - }), - cancel: () => undefined, - close: () => undefined, - confirm: () => undefined, - showInputError: () => undefined, - onKeyDown: () => undefined, - setModal: () => undefined, -}); +export const ModalContext = createContext(undefined); diff --git a/packages/ui-contexts/src/hooks/useCurrentModal.ts b/packages/ui-contexts/src/hooks/useCurrentModal.ts new file mode 100644 index 000000000000..692c6d7e024a --- /dev/null +++ b/packages/ui-contexts/src/hooks/useCurrentModal.ts @@ -0,0 +1,16 @@ +import { useContext } from 'react'; + +import { ModalContext, ModalContextValue } from '../ModalContext'; + +/** + * Similar to useModal this hook return the current modal from the context value + */ +export const useCurrentModal = (): ModalContextValue['currentModal'] => { + const context = useContext(ModalContext); + + if (!context) { + throw new Error('useCurrentModal must be used inside Modal Context'); + } + + return context.currentModal; +}; diff --git a/packages/ui-contexts/src/hooks/useModal.ts b/packages/ui-contexts/src/hooks/useModal.ts index cda4bcfe0bda..b2b0ea26ca57 100644 --- a/packages/ui-contexts/src/hooks/useModal.ts +++ b/packages/ui-contexts/src/hooks/useModal.ts @@ -2,4 +2,15 @@ import { useContext } from 'react'; import { ModalContext, ModalContextValue } from '../ModalContext'; -export const useModal = (): ModalContextValue => useContext(ModalContext); +/** + * Consider using useCurrentModal to get the current modal + */ +export const useModal = (): ModalContextValue['modal'] => { + const context = useContext(ModalContext); + + if (!context) { + throw new Error('useModal must be used inside Modal Context'); + } + + return context.modal; +}; diff --git a/packages/ui-contexts/src/hooks/useSetModal.ts b/packages/ui-contexts/src/hooks/useSetModal.ts index 248d1e04096d..5f69e087d9e1 100644 --- a/packages/ui-contexts/src/hooks/useSetModal.ts +++ b/packages/ui-contexts/src/hooks/useSetModal.ts @@ -1,5 +1,5 @@ -import { ReactNode, useContext } from 'react'; +import type { ReactNode } from 'react'; -import { ModalContext } from '../ModalContext'; +import { useModal } from './useModal'; -export const useSetModal = (): ((modal?: ReactNode) => void) => useContext(ModalContext).setModal; +export const useSetModal = (): ((modal?: ReactNode) => void) => useModal().setModal; diff --git a/packages/ui-contexts/src/index.ts b/packages/ui-contexts/src/index.ts index 2a30306e8e81..9e82a199422c 100644 --- a/packages/ui-contexts/src/index.ts +++ b/packages/ui-contexts/src/index.ts @@ -21,6 +21,7 @@ export { useAttachmentAutoLoadEmbedMedia } from './hooks/useAttachmentAutoLoadEm export { useAttachmentDimensions } from './hooks/useAttachmentDimensions'; export { useAttachmentIsCollapsedByDefault } from './hooks/useAttachmentIsCollapsedByDefault'; export { useConnectionStatus } from './hooks/useConnectionStatus'; +export { useCurrentModal } from './hooks/useCurrentModal'; export { useCurrentRoute } from './hooks/useCurrentRoute'; export { useCustomSound } from './hooks/useCustomSound'; export { useEndpoint } from './hooks/useEndpoint'; diff --git a/yarn.lock b/yarn.lock index 41b32d393653..e18b3ed257e2 100644 --- a/yarn.lock +++ b/yarn.lock @@ -2350,6 +2350,13 @@ __metadata: languageName: node linkType: hard +"@leichtgewicht/ip-codec@npm:^2.0.1": + version: 2.0.4 + resolution: "@leichtgewicht/ip-codec@npm:2.0.4" + checksum: 468de1f04d33de6d300892683d7c8aecbf96d1e2c5fe084f95f816e50a054d45b7c1ebfb141a1447d844b86a948733f6eebd92234da8581c84a1ad4de2946a2d + languageName: node + linkType: hard + "@mapbox/node-pre-gyp@npm:^1.0.0": version: 1.0.9 resolution: "@mapbox/node-pre-gyp@npm:1.0.9" @@ -3324,16 +3331,16 @@ __metadata: languageName: node linkType: hard -"@rocket.chat/css-in-js@npm:~0.31.14-dev.8": - version: 0.31.14-dev.8 - resolution: "@rocket.chat/css-in-js@npm:0.31.14-dev.8" +"@rocket.chat/css-in-js@npm:~0.31.14-dev.14": + version: 0.31.14-dev.14 + resolution: "@rocket.chat/css-in-js@npm:0.31.14-dev.14" dependencies: "@emotion/hash": ^0.8.0 - "@rocket.chat/css-supports": ~0.31.14-dev.8 - "@rocket.chat/memo": ~0.31.14-dev.8 - "@rocket.chat/stylis-logical-props-middleware": ~0.31.14-dev.8 + "@rocket.chat/css-supports": ~0.31.14-dev.14 + "@rocket.chat/memo": ~0.31.14-dev.14 + "@rocket.chat/stylis-logical-props-middleware": ~0.31.14-dev.14 stylis: ~4.0.13 - checksum: 66d77a1129ce90ad9905c3f4a0d13e81bc645cb954d0eb0dabb9bdc35b81586b70da7f756b3a180319cf902cef68b4a3c989c1dec0214f58955be5f759a4b553 + checksum: f1bb71204aa8f54c31ef40cefd1e995cf525b21e433b69e4a4dc99dad90d68e4590d37778833e1f5c053d1382ca4dba9cce63467bfb8166e6a2c06aaa96606b1 languageName: node linkType: hard @@ -3355,12 +3362,12 @@ __metadata: languageName: node linkType: hard -"@rocket.chat/css-supports@npm:~0.31.14-dev.8": - version: 0.31.14-dev.8 - resolution: "@rocket.chat/css-supports@npm:0.31.14-dev.8" +"@rocket.chat/css-supports@npm:~0.31.14-dev.14": + version: 0.31.14-dev.14 + resolution: "@rocket.chat/css-supports@npm:0.31.14-dev.14" dependencies: - "@rocket.chat/memo": ~0.31.14-dev.8 - checksum: 03c3ec93a77301de00666d5b02cc5af6fc8beca29c0f91f0305c4c32733d64dbd08f7134eb284a03f0758e6029245fe21507bae82c244ac27f3f56c7fe692eb7 + "@rocket.chat/memo": ~0.31.14-dev.14 + checksum: dc23db05e237d72a52f7fa4909cdcf34fd2e16464d48f62bee87dc9b46adbdc51b4c8aec2946fe39c0b597c9ac3a11b02bc27c148f836d9d5e37a65c07195ecd languageName: node linkType: hard @@ -3372,6 +3379,8 @@ __metadata: "@rocket.chat/core-typings": "workspace:^" "@rocket.chat/emitter": ~0.31.9 "@rocket.chat/eslint-config": "workspace:^" + "@rocket.chat/model-typings": "workspace:^" + "@rocket.chat/models": "workspace:^" "@rocket.chat/rest-typings": "workspace:^" "@rocket.chat/string-helpers": ~0.31.9 "@rocket.chat/ui-contexts": "workspace:^" @@ -3579,10 +3588,17 @@ __metadata: languageName: node linkType: hard -"@rocket.chat/fuselage-tokens@npm:^0.32.0-dev.5, @rocket.chat/fuselage-tokens@npm:~0.32.0-dev.5": - version: 0.32.0-dev.5 - resolution: "@rocket.chat/fuselage-tokens@npm:0.32.0-dev.5" - checksum: b5a9ce0c90c2b41483b35704d6b80e92e184459d5ee3d7018dd6242dde2c2aeda6b5d2866a8038def3c54eeb91124d3d9aa06293f256ef0f8f6cfb72c8eaf476 +"@rocket.chat/fuselage-tokens@npm:^0.32.0-dev.9": + version: 0.32.0-dev.9 + resolution: "@rocket.chat/fuselage-tokens@npm:0.32.0-dev.9" + checksum: 32aea70894d7dcfdddbf5e4897bdd028ed03ff2d4ea648246da72a7eb96b5f5dc9e6066a3e0042af67d7f5616b50d2f8b139950273dc1316429b77ea13160cac + languageName: node + linkType: hard + +"@rocket.chat/fuselage-tokens@npm:~0.32.0-dev.11": + version: 0.32.0-dev.11 + resolution: "@rocket.chat/fuselage-tokens@npm:0.32.0-dev.11" + checksum: f94438c4d307a204216bc49106e1714628488eef9f27f8c3e9716410895544241e46b04637ba011258135b617e3e103609b55cfbcf093f90066058b93b98c442 languageName: node linkType: hard @@ -3626,15 +3642,15 @@ __metadata: languageName: node linkType: hard -"@rocket.chat/fuselage@npm:^0.32.0-dev.55": - version: 0.32.0-dev.55 - resolution: "@rocket.chat/fuselage@npm:0.32.0-dev.55" +"@rocket.chat/fuselage@npm:^0.32.0-dev.61": + version: 0.32.0-dev.61 + resolution: "@rocket.chat/fuselage@npm:0.32.0-dev.61" dependencies: - "@rocket.chat/css-in-js": ~0.31.14-dev.8 - "@rocket.chat/css-supports": ~0.31.14-dev.8 - "@rocket.chat/fuselage-tokens": ~0.32.0-dev.5 - "@rocket.chat/memo": ~0.31.14-dev.8 - "@rocket.chat/styled": ~0.31.14-dev.8 + "@rocket.chat/css-in-js": ~0.31.14-dev.14 + "@rocket.chat/css-supports": ~0.31.14-dev.14 + "@rocket.chat/fuselage-tokens": ~0.32.0-dev.11 + "@rocket.chat/memo": ~0.31.14-dev.14 + "@rocket.chat/styled": ~0.31.14-dev.14 invariant: ^2.2.4 react-keyed-flatten-children: ^1.3.0 peerDependencies: @@ -3644,7 +3660,7 @@ __metadata: react: ^17.0.2 react-dom: ^17.0.2 react-virtuoso: 1.2.4 - checksum: 56020af5476fa118308eac84f347f86b5d4e864a91eab30ac34aa1ee427514ebdae1f3534959e8d08e54bb2d6dc71564ee5d494c77cf0716b5f94b50f5d83464 + checksum: 3c4be69b1ed189a8e30a046977f7bbc382f71644df347db8dc6d76dc30a229515340a55fe8aef1ef119b9584cfa05cc642d63d2e117f3ac9e4de8d1e1f3e7aae languageName: node linkType: hard @@ -3728,7 +3744,7 @@ __metadata: url-loader: ^4.1.0 webpack: ^4.44.1 webpack-cli: ^3.3.12 - webpack-dev-server: ^3.11.0 + webpack-dev-server: ^4.9.2 whatwg-fetch: ^3.6.2 languageName: unknown linkType: soft @@ -3761,10 +3777,10 @@ __metadata: languageName: node linkType: hard -"@rocket.chat/memo@npm:~0.31.14-dev.8": - version: 0.31.14-dev.8 - resolution: "@rocket.chat/memo@npm:0.31.14-dev.8" - checksum: 2b1201098e15a8745d68cc0000f59624bd9fc5f5e3aaf5279037f5c17979382dcf4146fd1bb1f6620a5aa699a18f1e0114407e821ab17f9e0d37ece7b6c91ab8 +"@rocket.chat/memo@npm:~0.31.14-dev.14": + version: 0.31.14-dev.14 + resolution: "@rocket.chat/memo@npm:0.31.14-dev.14" + checksum: 8daca0bb12028d07109079a4acbf4153b0a00837ca3e1d1671ae52214a1d7d551ff63d9499c090733300bf3874603414dc4e30656604418d9f3dffd7dc97e942 languageName: node linkType: hard @@ -3811,19 +3827,22 @@ __metadata: "@rocket.chat/favicon": "workspace:^" "@rocket.chat/forked-matrix-appservice-bridge": ^4.0.1 "@rocket.chat/forked-matrix-bot-sdk": ^0.6.0-beta.2 - "@rocket.chat/fuselage": ^0.32.0-dev.55 + "@rocket.chat/fuselage": ^0.32.0-dev.61 "@rocket.chat/fuselage-hooks": ~0.31.14-dev.9 "@rocket.chat/fuselage-polyfills": ~0.31.12 "@rocket.chat/fuselage-toastbar": ^0.32.0-dev.22 - "@rocket.chat/fuselage-tokens": ^0.32.0-dev.5 + "@rocket.chat/fuselage-tokens": ^0.32.0-dev.9 "@rocket.chat/fuselage-ui-kit": ~0.31.14-dev.1 "@rocket.chat/icons": ~0.31.12 "@rocket.chat/livechat": "workspace:^" "@rocket.chat/logo": ~0.31.12 "@rocket.chat/memo": ~0.31.12 "@rocket.chat/message-parser": ~0.31.12 + "@rocket.chat/model-typings": "workspace:^" + "@rocket.chat/models": "workspace:^" "@rocket.chat/mp3-encoder": ^0.24.0 "@rocket.chat/onboarding-ui": ~0.31.12 + "@rocket.chat/poplib": "workspace:^" "@rocket.chat/rest-typings": "workspace:^" "@rocket.chat/string-helpers": ~0.31.12 "@rocket.chat/ui-contexts": "workspace:^" @@ -4023,7 +4042,6 @@ __metadata: photoswipe: ^4.1.3 pino: ^7.10.0 pino-pretty: ^7.6.1 - poplib: ^0.1.7 postcss: ~8.4.12 postcss-custom-properties: ^11.0.0 postcss-easy-import: ^3.0.0 @@ -4089,6 +4107,34 @@ __metadata: languageName: unknown linkType: soft +"@rocket.chat/model-typings@workspace:^, @rocket.chat/model-typings@workspace:packages/model-typings": + version: 0.0.0-use.local + resolution: "@rocket.chat/model-typings@workspace:packages/model-typings" + dependencies: + "@rocket.chat/core-typings": "workspace:^" + "@types/jest": ^27.4.1 + "@types/mongodb": ^3.6.10 + "@types/node-rsa": ^1.1.1 + eslint: ^8.12.0 + jest: ^27.5.1 + ts-jest: ^27.1.4 + typescript: ~4.3.4 + languageName: unknown + linkType: soft + +"@rocket.chat/models@workspace:^, @rocket.chat/models@workspace:packages/models": + version: 0.0.0-use.local + resolution: "@rocket.chat/models@workspace:packages/models" + dependencies: + "@rocket.chat/model-typings": "workspace:^" + "@types/jest": ^27.4.1 + eslint: ^8.12.0 + jest: ^27.5.1 + ts-jest: ^27.1.4 + typescript: ~4.3.4 + languageName: unknown + linkType: soft + "@rocket.chat/mp3-encoder@npm:^0.24.0": version: 0.24.0 resolution: "@rocket.chat/mp3-encoder@npm:0.24.0" @@ -4119,6 +4165,18 @@ __metadata: languageName: node linkType: hard +"@rocket.chat/poplib@workspace:^, @rocket.chat/poplib@workspace:packages/node-poplib": + version: 0.0.0-use.local + resolution: "@rocket.chat/poplib@workspace:packages/node-poplib" + dependencies: + "@types/jest": ^27.4.1 + eslint: ^8.12.0 + jest: ^27.5.1 + ts-jest: ^27.1.4 + typescript: ~4.3.4 + languageName: unknown + linkType: soft + "@rocket.chat/rest-typings@workspace:^, @rocket.chat/rest-typings@workspace:packages/rest-typings": version: 0.0.0-use.local resolution: "@rocket.chat/rest-typings@workspace:packages/rest-typings" @@ -4180,13 +4238,13 @@ __metadata: languageName: node linkType: hard -"@rocket.chat/styled@npm:~0.31.14-dev.8": - version: 0.31.14-dev.8 - resolution: "@rocket.chat/styled@npm:0.31.14-dev.8" +"@rocket.chat/styled@npm:~0.31.14-dev.14": + version: 0.31.14-dev.14 + resolution: "@rocket.chat/styled@npm:0.31.14-dev.14" dependencies: - "@rocket.chat/css-in-js": ~0.31.14-dev.8 + "@rocket.chat/css-in-js": ~0.31.14-dev.14 tslib: ^2.3.1 - checksum: 9bb43fee8decc93e2c33bd1021e20f8d3daa00e0027338448fd9a07f6a4c2e47c03ee07bfdf70e7e89c39ee593a84c4de1962e0b86f655fc5b7968479965b33c + checksum: 7ec05eb257910499f3fc998535f874d7e3aca9edd4047e44bc723023e7f34705a419f291dc3b3c6bcdb38a818728e2644d2c31024ab37cc2cab86e7b36193a4e languageName: node linkType: hard @@ -4214,15 +4272,15 @@ __metadata: languageName: node linkType: hard -"@rocket.chat/stylis-logical-props-middleware@npm:~0.31.14-dev.8": - version: 0.31.14-dev.8 - resolution: "@rocket.chat/stylis-logical-props-middleware@npm:0.31.14-dev.8" +"@rocket.chat/stylis-logical-props-middleware@npm:~0.31.14-dev.14": + version: 0.31.14-dev.14 + resolution: "@rocket.chat/stylis-logical-props-middleware@npm:0.31.14-dev.14" dependencies: - "@rocket.chat/css-supports": ~0.31.14-dev.8 + "@rocket.chat/css-supports": ~0.31.14-dev.14 tslib: ^2.3.1 peerDependencies: stylis: 4.0.10 - checksum: 0590e84c67df727065abc33663521daffc69bcefa319fb8fb4e797902f3cfbfb75f04673a483d5be4de657db4b053a57027bb92f5377716a451da31334320c32 + checksum: d4f3b928740cfd8c47f51f5546aade0568f3517b40d3ef6874321d342b39993bb2ae18de1462af71646ccb74799eb9c12df86c7645beb93cb582f9966e8fae92 languageName: node linkType: hard @@ -5826,6 +5884,15 @@ __metadata: languageName: node linkType: hard +"@types/bonjour@npm:^3.5.9": + version: 3.5.10 + resolution: "@types/bonjour@npm:3.5.10" + dependencies: + "@types/node": "*" + checksum: bfcadb042a41b124c4e3de4925e3be6d35b78f93f27c4535d5ff86980dc0f8bc407ed99b9b54528952dc62834d5a779392f7a12c2947dd19330eb05a6bcae15a + languageName: node + linkType: hard + "@types/bson@npm:*": version: 4.2.0 resolution: "@types/bson@npm:4.2.0" @@ -5905,6 +5972,16 @@ __metadata: languageName: node linkType: hard +"@types/connect-history-api-fallback@npm:^1.3.5": + version: 1.3.5 + resolution: "@types/connect-history-api-fallback@npm:1.3.5" + dependencies: + "@types/express-serve-static-core": "*" + "@types/node": "*" + checksum: 464d06e5ab00f113fa89978633d5eb00d225aeb4ebbadc07f6f3bc337aa7cbfcd74957b2a539d6d47f2e128e956a17819973ec7ae62ade2e16e367a6c38b8d3a + languageName: node + linkType: hard + "@types/connect@npm:*": version: 3.4.35 resolution: "@types/connect@npm:3.4.35" @@ -6010,6 +6087,17 @@ __metadata: languageName: node linkType: hard +"@types/express-serve-static-core@npm:*": + version: 4.17.29 + resolution: "@types/express-serve-static-core@npm:4.17.29" + dependencies: + "@types/node": "*" + "@types/qs": "*" + "@types/range-parser": "*" + checksum: ec4194dc59276ec6dd906887fc377be0cadf4aaa4d535d9052ab9624937ef2b984a8d9da2c11c96979e21f3d9f78f1da93e767dbcec637f7f13d2e3003151145 + languageName: node + linkType: hard + "@types/express-serve-static-core@npm:^4.17.18": version: 4.17.28 resolution: "@types/express-serve-static-core@npm:4.17.28" @@ -6091,6 +6179,15 @@ __metadata: languageName: node linkType: hard +"@types/http-proxy@npm:^1.17.8": + version: 1.17.9 + resolution: "@types/http-proxy@npm:1.17.9" + dependencies: + "@types/node": "*" + checksum: 7a6746d00729b2a9fe9f9dd3453430b099931df879ec8f7a7b5f07b1795f6d99b0512640c45a67390b1e4bacb9401e36824952aeeaf089feba8627a063cf8e00 + languageName: node + linkType: hard + "@types/imap@npm:^0.8.35": version: 0.8.35 resolution: "@types/imap@npm:0.8.35" @@ -6661,7 +6758,16 @@ __metadata: languageName: node linkType: hard -"@types/serve-static@npm:*": +"@types/serve-index@npm:^1.9.1": + version: 1.9.1 + resolution: "@types/serve-index@npm:1.9.1" + dependencies: + "@types/express": "*" + checksum: 026f3995fb500f6df7c3fe5009e53bad6d739e20b84089f58ebfafb2f404bbbb6162bbe33f72d2f2af32d5b8d3799c8e179793f90d9ed5871fb8591190bb6056 + languageName: node + linkType: hard + +"@types/serve-static@npm:*, @types/serve-static@npm:^1.13.10": version: 1.13.10 resolution: "@types/serve-static@npm:1.13.10" dependencies: @@ -6703,6 +6809,15 @@ __metadata: languageName: node linkType: hard +"@types/sockjs@npm:^0.3.33": + version: 0.3.33 + resolution: "@types/sockjs@npm:0.3.33" + dependencies: + "@types/node": "*" + checksum: b9bbb2b5c5ead2fb884bb019f61a014e37410bddd295de28184e1b2e71ee6b04120c5ba7b9954617f0bdf962c13d06249ce65004490889c747c80d3f628ea842 + languageName: node + linkType: hard + "@types/source-list-map@npm:*": version: 0.1.2 resolution: "@types/source-list-map@npm:0.1.2" @@ -6928,7 +7043,7 @@ __metadata: languageName: node linkType: hard -"@types/ws@npm:^8.5.3": +"@types/ws@npm:^8.5.1, @types/ws@npm:^8.5.3": version: 8.5.3 resolution: "@types/ws@npm:8.5.3" dependencies: @@ -7690,7 +7805,7 @@ __metadata: human-interval: ~1.0.0 moment-timezone: ~0.5.27 mongodb: ~3.5.0 - checksum: acb4ebb7e7356f6e53e810d821eb6aa3d88bbfb9e85183e707517bee6d1eea1f189f38bdf0dd2b91360492ab7643134d510c320d2523d86596498ab98e59735b + checksum: f5f68008298f9482631f1f494e392cd6b8ba7971a3b0ece81ae2abe60f53d67973ff4476156fa5c9c41b8b58c4ccd284e95c545e0523996dfd05f9a80b843e07 languageName: node linkType: hard @@ -7767,6 +7882,20 @@ __metadata: languageName: node linkType: hard +"ajv-formats@npm:^2.1.1": + version: 2.1.1 + resolution: "ajv-formats@npm:2.1.1" + dependencies: + ajv: ^8.0.0 + peerDependencies: + ajv: ^8.0.0 + peerDependenciesMeta: + ajv: + optional: true + checksum: 4a287d937f1ebaad4683249a4c40c0fa3beed30d9ddc0adba04859026a622da0d317851316ea64b3680dc60f5c3c708105ddd5d5db8fe595d9d0207fd19f90b7 + languageName: node + linkType: hard + "ajv-keywords@npm:^3.1.0, ajv-keywords@npm:^3.4.1, ajv-keywords@npm:^3.5.2": version: 3.5.2 resolution: "ajv-keywords@npm:3.5.2" @@ -7776,6 +7905,17 @@ __metadata: languageName: node linkType: hard +"ajv-keywords@npm:^5.0.0": + version: 5.1.0 + resolution: "ajv-keywords@npm:5.1.0" + dependencies: + fast-deep-equal: ^3.1.3 + peerDependencies: + ajv: ^8.8.2 + checksum: c35193940b853119242c6757787f09ecf89a2c19bcd36d03ed1a615e710d19d450cb448bfda407b939aba54b002368c8bff30529cc50a0536a8e10bcce300421 + languageName: node + linkType: hard + "ajv@npm:6.5.3": version: 6.5.3 resolution: "ajv@npm:6.5.3" @@ -7800,7 +7940,7 @@ __metadata: languageName: node linkType: hard -"ajv@npm:^8.0.1, ajv@npm:^8.11.0": +"ajv@npm:^8.0.0, ajv@npm:^8.0.1, ajv@npm:^8.11.0, ajv@npm:^8.8.0": version: 8.11.0 resolution: "ajv@npm:8.11.0" dependencies: @@ -8230,7 +8370,7 @@ __metadata: languageName: node linkType: hard -"array-flatten@npm:^2.1.0": +"array-flatten@npm:^2.1.2": version: 2.1.2 resolution: "array-flatten@npm:2.1.2" checksum: e8988aac1fbfcdaae343d08c9a06a6fddd2c6141721eeeea45c3cf523bf4431d29a46602929455ed548c7a3e0769928cdc630405427297e7081bd118fdec9262 @@ -8519,7 +8659,7 @@ __metadata: languageName: node linkType: hard -"async@npm:^2.6.2, async@npm:^2.6.3, async@npm:~2.6.1": +"async@npm:^2.6.3, async@npm:~2.6.1": version: 2.6.4 resolution: "async@npm:2.6.4" dependencies: @@ -9346,17 +9486,15 @@ __metadata: languageName: node linkType: hard -"bonjour@npm:^3.5.0": - version: 3.5.0 - resolution: "bonjour@npm:3.5.0" +"bonjour-service@npm:^1.0.11": + version: 1.0.13 + resolution: "bonjour-service@npm:1.0.13" dependencies: - array-flatten: ^2.1.0 - deep-equal: ^1.0.1 + array-flatten: ^2.1.2 dns-equal: ^1.0.0 - dns-txt: ^2.0.2 - multicast-dns: ^6.0.1 - multicast-dns-service-types: ^1.1.0 - checksum: 2cfbe9fa861f4507b5ff3853eeae3ef03a231ede2b7363efedd80880ea3c0576f64416f98056c96e429ed68ff38dc4a70c0583d1eb4dab72e491ca44a0f03444 + fast-deep-equal: ^3.1.3 + multicast-dns: ^7.2.5 + checksum: aee186f542e0ec095d1f7fd8194182373ea4e854eef1182a3cb90e70c958deb6945de38f1a793bb43cc51f3a0044fa7eabee05a7ecb698c446aee80f00101124 languageName: node linkType: hard @@ -9682,13 +9820,6 @@ __metadata: languageName: node linkType: hard -"buffer-indexof@npm:^1.0.0": - version: 1.1.1 - resolution: "buffer-indexof@npm:1.1.1" - checksum: 0967abc2981a8e7d776324c6b84811e4d84a7ead89b54a3bb8791437f0c4751afd060406b06db90a436f1cf771867331b5ecf5c4aca95b4ccb9f6cb146c22ebc - languageName: node - linkType: hard - "buffer-xor@npm:^1.0.3": version: 1.0.3 resolution: "buffer-xor@npm:1.0.3" @@ -10398,7 +10529,7 @@ __metadata: languageName: node linkType: hard -"chokidar@npm:3.5.3, chokidar@npm:>=3.0.0 <4.0.0, chokidar@npm:^3.4.1, chokidar@npm:^3.4.2, chokidar@npm:^3.5.1": +"chokidar@npm:3.5.3, chokidar@npm:>=3.0.0 <4.0.0, chokidar@npm:^3.4.1, chokidar@npm:^3.4.2, chokidar@npm:^3.5.1, chokidar@npm:^3.5.3": version: 3.5.3 resolution: "chokidar@npm:3.5.3" dependencies: @@ -10829,6 +10960,13 @@ __metadata: languageName: node linkType: hard +"colorette@npm:^2.0.10": + version: 2.0.19 + resolution: "colorette@npm:2.0.19" + checksum: 888cf5493f781e5fcf54ce4d49e9d7d698f96ea2b2ef67906834bb319a392c667f9ec69f4a10e268d2946d13a9503d2d19b3abaaaf174e3451bfe91fb9d82427 + languageName: node + linkType: hard + "colorette@npm:^2.0.16, colorette@npm:^2.0.7": version: 2.0.16 resolution: "colorette@npm:2.0.16" @@ -12157,7 +12295,7 @@ __metadata: languageName: node linkType: hard -"debug@npm:^3.0.0, debug@npm:^3.1.0, debug@npm:^3.1.1, debug@npm:^3.2.6, debug@npm:^3.2.7": +"debug@npm:^3.0.0, debug@npm:^3.1.0, debug@npm:^3.2.6, debug@npm:^3.2.7": version: 3.2.7 resolution: "debug@npm:3.2.7" dependencies: @@ -12317,20 +12455,6 @@ __metadata: languageName: node linkType: hard -"deep-equal@npm:^1.0.1": - version: 1.1.1 - resolution: "deep-equal@npm:1.1.1" - dependencies: - is-arguments: ^1.0.4 - is-date-object: ^1.0.1 - is-regex: ^1.0.4 - object-is: ^1.0.1 - object-keys: ^1.1.1 - regexp.prototype.flags: ^1.2.0 - checksum: f92686f2c5bcdf714a75a5fa7a9e47cb374a8ec9307e717b8d1ce61f56a75aaebf5619c2a12b8087a705b5a2f60d0292c35f8b58cb1f72e3268a3a15cab9f78d - languageName: node - linkType: hard - "deep-extend@npm:^0.6.0": version: 0.6.0 resolution: "deep-extend@npm:0.6.0" @@ -12365,13 +12489,12 @@ __metadata: languageName: node linkType: hard -"default-gateway@npm:^4.2.0": - version: 4.2.0 - resolution: "default-gateway@npm:4.2.0" +"default-gateway@npm:^6.0.3": + version: 6.0.3 + resolution: "default-gateway@npm:6.0.3" dependencies: - execa: ^1.0.0 - ip-regex: ^2.1.0 - checksum: 1f5be765471689c6bab33e0c8b87363c3e2485cc1ab78904d383a8a8293a79f684da2a3303744b112503f986af4ea87d917c63a468ed913e9b0c31588c02d6a4 + execa: ^5.0.0 + checksum: 126f8273ecac8ee9ff91ea778e8784f6cd732d77c3157e8c5bdd6ed03651b5291f71446d05bc02d04073b1e67583604db5394ea3cf992ede0088c70ea15b7378 languageName: node linkType: hard @@ -12432,21 +12555,6 @@ __metadata: languageName: node linkType: hard -"del@npm:^4.1.1": - version: 4.1.1 - resolution: "del@npm:4.1.1" - dependencies: - "@types/glob": ^7.1.1 - globby: ^6.1.0 - is-path-cwd: ^2.0.0 - is-path-in-cwd: ^2.0.0 - p-map: ^2.0.0 - pify: ^4.0.1 - rimraf: ^2.6.3 - checksum: 521f7da44bd79da841c06d573923d1f64f423aee8b8219c973478d3150ce1dcc024d03ad605929292adbff56d6448bca60d96dcdd2d8a53b46dbcb27e265c94b - languageName: node - linkType: hard - "delaunator@npm:4": version: 4.0.1 resolution: "delaunator@npm:4.0.1" @@ -12685,22 +12793,12 @@ __metadata: languageName: node linkType: hard -"dns-packet@npm:^1.3.1": - version: 1.3.4 - resolution: "dns-packet@npm:1.3.4" - dependencies: - ip: ^1.1.0 - safe-buffer: ^5.0.1 - checksum: 7dd87f85cb4f9d1a99c03470730e3d9385e67dc94f6c13868c4034424a5378631e492f9f1fbc43d3c42f319fbbfe18b6488bb9527c32d34692c52bf1f5eedf69 - languageName: node - linkType: hard - -"dns-txt@npm:^2.0.2": - version: 2.0.2 - resolution: "dns-txt@npm:2.0.2" +"dns-packet@npm:^5.2.2": + version: 5.4.0 + resolution: "dns-packet@npm:5.4.0" dependencies: - buffer-indexof: ^1.0.0 - checksum: 80130b665379ecd991687ae079fbee25d091e03e4c4cef41e7643b977849ac48c2f56bfcb3727e53594d29029b833749811110d9f3fbee1b26a6e6f8096a5cef + "@leichtgewicht/ip-codec": ^2.0.1 + checksum: a169963848e8539dfd8a19058562f9e1c15c0f82cbf76fa98942f11c46f3c74e7e7c82e3a8a5182d4c9e6ff19e21be738dbd098a876dde755d3aedd2cc730880 languageName: node linkType: hard @@ -14105,15 +14203,6 @@ __metadata: languageName: node linkType: hard -"eventsource@npm:^1.1.0": - version: 1.1.0 - resolution: "eventsource@npm:1.1.0" - dependencies: - original: ^1.0.0 - checksum: 78338b7e75ec471cb793efb3319e0c4d2bf00fb638a2e3f888ad6d98cd1e3d4492a29f554c0921c7b2ac5130c3a732a1a0056739f6e2f548d714aec685e5da7e - languageName: node - linkType: hard - "evp_bytestokey@npm:^1.0.0, evp_bytestokey@npm:^1.0.3": version: 1.0.3 resolution: "evp_bytestokey@npm:1.0.3" @@ -14590,7 +14679,7 @@ __metadata: languageName: node linkType: hard -"faye-websocket@npm:^0.11.3, faye-websocket@npm:^0.11.4": +"faye-websocket@npm:^0.11.3": version: 0.11.4 resolution: "faye-websocket@npm:0.11.4" dependencies: @@ -15379,7 +15468,7 @@ __metadata: languageName: node linkType: hard -"fs-monkey@npm:1.0.3": +"fs-monkey@npm:1.0.3, fs-monkey@npm:^1.0.3": version: 1.0.3 resolution: "fs-monkey@npm:1.0.3" checksum: cf50804833f9b88a476911ae911fe50f61a98d986df52f890bd97e7262796d023698cb2309fa9b74fdd8974f04315b648748a0a8ee059e7d5257b293bfc409c0 @@ -16803,13 +16892,6 @@ __metadata: languageName: node linkType: hard -"html-entities@npm:^1.3.1": - version: 1.4.0 - resolution: "html-entities@npm:1.4.0" - checksum: 4b73ffb9eead200f99146e4fbe70acb0af2fea136901a131fc3a782e9ef876a7cbb07dec303ca1f8804232b812249dbf3643a270c9c524852065d9224a8dcdd0 - languageName: node - linkType: hard - "html-entities@npm:^2.1.0, html-entities@npm:^2.3.2": version: 2.3.3 resolution: "html-entities@npm:2.3.3" @@ -17061,19 +17143,25 @@ __metadata: languageName: node linkType: hard -"http-proxy-middleware@npm:0.19.1": - version: 0.19.1 - resolution: "http-proxy-middleware@npm:0.19.1" +"http-proxy-middleware@npm:^2.0.3": + version: 2.0.6 + resolution: "http-proxy-middleware@npm:2.0.6" dependencies: - http-proxy: ^1.17.0 - is-glob: ^4.0.0 - lodash: ^4.17.11 - micromatch: ^3.1.10 - checksum: 64df0438417a613bb22b3689d9652a1b7a56f10b145a463f95f4e8a9b9a351f2c63bc5fd3a9cd710baec224897733b6f299cb7f974ea82769b2a4f1e074764ac + "@types/http-proxy": ^1.17.8 + http-proxy: ^1.18.1 + is-glob: ^4.0.1 + is-plain-obj: ^3.0.0 + micromatch: ^4.0.2 + peerDependencies: + "@types/express": ^4.17.13 + peerDependenciesMeta: + "@types/express": + optional: true + checksum: 2ee85bc878afa6cbf34491e972ece0f5be0a3e5c98a60850cf40d2a9a5356e1fc57aab6cff33c1fc37691b0121c3a42602d2b1956c52577e87a5b77b62ae1c3a languageName: node linkType: hard -"http-proxy@npm:^1.17.0": +"http-proxy@npm:^1.18.1": version: 1.18.1 resolution: "http-proxy@npm:1.18.1" dependencies: @@ -17696,16 +17784,6 @@ __metadata: languageName: node linkType: hard -"internal-ip@npm:^4.3.0": - version: 4.3.0 - resolution: "internal-ip@npm:4.3.0" - dependencies: - default-gateway: ^4.2.0 - ipaddr.js: ^1.9.0 - checksum: c970433c84d9a6b46e2c9f5ab7785d3105b856d0a566891bf919241b5a884c5c1c9bf8e915aebb822a86c14b1b6867e58c1eaf5cd49eb023368083069d1a4a9a - languageName: node - linkType: hard - "internal-slot@npm:^1.0.3": version: 1.0.3 resolution: "internal-slot@npm:1.0.3" @@ -17786,14 +17864,7 @@ __metadata: languageName: node linkType: hard -"ip-regex@npm:^2.1.0": - version: 2.1.0 - resolution: "ip-regex@npm:2.1.0" - checksum: 331d95052aa53ce245745ea0fc3a6a1e2e3c8d6da65fa8ea52bf73768c1b22a9ac50629d1d2b08c04e7b3ac4c21b536693c149ce2c2615ee4796030e5b3e3cba - languageName: node - linkType: hard - -"ip@npm:^1.1.0, ip@npm:^1.1.5": +"ip@npm:^1.1.5": version: 1.1.5 resolution: "ip@npm:1.1.5" checksum: 30133981f082a060a32644f6a7746e9ba7ac9e2bc07ecc8bbdda3ee8ca9bec1190724c390e45a1ee7695e7edfd2a8f7dda2c104ec5f7ac5068c00648504c7e5a @@ -17807,7 +17878,7 @@ __metadata: languageName: node linkType: hard -"ipaddr.js@npm:1.9.1, ipaddr.js@npm:^1.0.1, ipaddr.js@npm:^1.9.0": +"ipaddr.js@npm:1.9.1, ipaddr.js@npm:^1.0.1": version: 1.9.1 resolution: "ipaddr.js@npm:1.9.1" checksum: f88d3825981486f5a1942414c8d77dd6674dd71c065adcfa46f578d677edcb99fda25af42675cb59db492fdf427b34a5abfcde3982da11a8fd83a500b41cfe77 @@ -17828,7 +17899,7 @@ __metadata: languageName: node linkType: hard -"is-absolute-url@npm:^3.0.0, is-absolute-url@npm:^3.0.3": +"is-absolute-url@npm:^3.0.0": version: 3.0.3 resolution: "is-absolute-url@npm:3.0.3" checksum: 5159b51d065d9ad29e16a2f78d6c0e41c43227caf90a45e659c54ea6fd50ef0595b1871ce392e84b1df7cfdcad9a8e66eec0813a029112188435abf115accb16 @@ -18326,22 +18397,6 @@ __metadata: languageName: node linkType: hard -"is-path-cwd@npm:^2.0.0": - version: 2.2.0 - resolution: "is-path-cwd@npm:2.2.0" - checksum: 46a840921bb8cc0dc7b5b423a14220e7db338072a4495743a8230533ce78812dc152548c86f4b828411fe98c5451959f07cf841c6a19f611e46600bd699e8048 - languageName: node - linkType: hard - -"is-path-in-cwd@npm:^2.0.0": - version: 2.1.0 - resolution: "is-path-in-cwd@npm:2.1.0" - dependencies: - is-path-inside: ^2.1.0 - checksum: 6b01b3f8c9172e9682ea878d001836a0cc5a78cbe6236024365d478c2c9e384da2417e5f21f2ad2da2761d0465309fc5baf6e71187d2a23f0058da69790f7f48 - languageName: node - linkType: hard - "is-path-inside@npm:^1.0.0": version: 1.0.1 resolution: "is-path-inside@npm:1.0.1" @@ -18351,15 +18406,6 @@ __metadata: languageName: node linkType: hard -"is-path-inside@npm:^2.1.0": - version: 2.1.0 - resolution: "is-path-inside@npm:2.1.0" - dependencies: - path-is-inside: ^1.0.2 - checksum: 6ca34dbd84d5c50a3ee1547afb6ada9b06d556a4ff42da9b303797e4acc3ac086516a4833030aa570f397f8c58dacabd57ee8e6c2ce8b2396a986ad2af10fcaf - languageName: node - linkType: hard - "is-plain-obj@npm:^1.0.0, is-plain-obj@npm:^1.1.0": version: 1.1.0 resolution: "is-plain-obj@npm:1.1.0" @@ -18374,6 +18420,13 @@ __metadata: languageName: node linkType: hard +"is-plain-obj@npm:^3.0.0": + version: 3.0.0 + resolution: "is-plain-obj@npm:3.0.0" + checksum: a6ebdf8e12ab73f33530641972a72a4b8aed6df04f762070d823808303e4f76d87d5ea5bd76f96a7bbe83d93f04ac7764429c29413bd9049853a69cb630fb21c + languageName: node + linkType: hard + "is-plain-object@npm:5.0.0, is-plain-object@npm:^5.0.0": version: 5.0.0 resolution: "is-plain-object@npm:5.0.0" @@ -18425,7 +18478,7 @@ __metadata: languageName: node linkType: hard -"is-regex@npm:^1.0.4, is-regex@npm:^1.1.2, is-regex@npm:^1.1.4": +"is-regex@npm:^1.1.2, is-regex@npm:^1.1.4": version: 1.1.4 resolution: "is-regex@npm:1.1.4" dependencies: @@ -19795,13 +19848,6 @@ __metadata: languageName: node linkType: hard -"killable@npm:^1.0.1": - version: 1.0.1 - resolution: "killable@npm:1.0.1" - checksum: 911a85c6e390c19d72c4e3149347cf44042cbd7d18c3c6c5e4f706fdde6e0ed532473392e282c7ef27f518407e6cb7d2a0e71a2ae8d8d8f8ffdb68891a29a68a - languageName: node - linkType: hard - "kind-of@npm:^3.0.2, kind-of@npm:^3.0.3, kind-of@npm:^3.2.0": version: 3.2.2 resolution: "kind-of@npm:3.2.2" @@ -20466,7 +20512,7 @@ __metadata: languageName: node linkType: hard -"loglevel@npm:^1.6.8, loglevel@npm:^1.7.1": +"loglevel@npm:^1.7.1": version: 1.8.0 resolution: "loglevel@npm:1.8.0" checksum: 41aeea17de24aba8dba68084a31fe9189648bce4f39c1277e021bb276c3c53a75b0d337395919cf271068ad40ecefabad0e4fdeb4a8f11908beee532b898f4a7 @@ -21048,6 +21094,15 @@ __metadata: languageName: node linkType: hard +"memfs@npm:^3.4.3": + version: 3.4.6 + resolution: "memfs@npm:3.4.6" + dependencies: + fs-monkey: ^1.0.3 + checksum: 0164d79c5da42809d9590125ee713aac59b1c1e16c61d4b264460366514342da2867ac64874f098af348e13eadde4c6d8fb8188b16e766029d67adf8ec153b4c + languageName: node + linkType: hard + "memoize-one@npm:^5.0.0": version: 5.2.1 resolution: "memoize-one@npm:5.2.1" @@ -21370,7 +21425,7 @@ __metadata: languageName: node linkType: hard -"mime-types@npm:^2.0.8, mime-types@npm:^2.1.12, mime-types@npm:^2.1.27, mime-types@npm:~2.1.17, mime-types@npm:~2.1.19, mime-types@npm:~2.1.24, mime-types@npm:~2.1.34": +"mime-types@npm:^2.0.8, mime-types@npm:^2.1.12, mime-types@npm:^2.1.27, mime-types@npm:^2.1.31, mime-types@npm:~2.1.17, mime-types@npm:~2.1.19, mime-types@npm:~2.1.24, mime-types@npm:~2.1.34": version: 2.1.35 resolution: "mime-types@npm:2.1.35" dependencies: @@ -21550,20 +21605,13 @@ __metadata: languageName: node linkType: hard -"minimist@npm:^1.1.0, minimist@npm:^1.1.1, minimist@npm:^1.1.3, minimist@npm:^1.2.0, minimist@npm:^1.2.3, minimist@npm:^1.2.5, minimist@npm:^1.2.6": +"minimist@npm:1.2.6": version: 1.2.6 resolution: "minimist@npm:1.2.6" checksum: d15428cd1e11eb14e1233bcfb88ae07ed7a147de251441d61158619dfb32c4d7e9061d09cab4825fdee18ecd6fce323228c8c47b5ba7cd20af378ca4048fb3fb languageName: node linkType: hard -"minimist@npm:~0.0.1": - version: 0.0.10 - resolution: "minimist@npm:0.0.10" - checksum: f7b2cb17af165d042bb3d2803f5e6c38d137f0c36a62230fdb643058c25b56749d2c335b17d4de0b0f08f19cb868cac40df207ff7a4c59fd0771e8762e9b783c - languageName: node - linkType: hard - "minipass-collect@npm:^1.0.2": version: 1.0.2 resolution: "minipass-collect@npm:1.0.2" @@ -22069,22 +22117,15 @@ __metadata: languageName: node linkType: hard -"multicast-dns-service-types@npm:^1.1.0": - version: 1.1.0 - resolution: "multicast-dns-service-types@npm:1.1.0" - checksum: 0979fca1cce85484d256e4db3af591d941b41a61f134da3607213d2624c12ed5b8a246565cb19a9b3cb542819e8fbc71a90b07e77023ee6a9515540fe1d371f7 - languageName: node - linkType: hard - -"multicast-dns@npm:^6.0.1": - version: 6.2.3 - resolution: "multicast-dns@npm:6.2.3" +"multicast-dns@npm:^7.2.5": + version: 7.2.5 + resolution: "multicast-dns@npm:7.2.5" dependencies: - dns-packet: ^1.3.1 + dns-packet: ^5.2.2 thunky: ^1.0.2 bin: multicast-dns: cli.js - checksum: f515b49ca964429ab48a4ac8041fcf969c927aeb49ab65288bd982e52c849a870fc3b03565780b0d194a1a02da8821f28b6425e48e95b8107bc9fcc92f571a6f + checksum: 00b8a57df152d4cd0297946320a94b7c3cdf75a46a2247f32f958a8927dea42958177f9b7fdae69fab2e4e033fb3416881af1f5e9055a3e1542888767139e2fb languageName: node linkType: hard @@ -22416,7 +22457,7 @@ __metadata: languageName: node linkType: hard -"node-forge@npm:^1.3.1": +"node-forge@npm:^1, node-forge@npm:^1.3.1": version: 1.3.1 resolution: "node-forge@npm:1.3.1" checksum: 08fb072d3d670599c89a1704b3e9c649ff1b998256737f0e06fbd1a5bf41cae4457ccaee32d95052d80bbafd9ffe01284e078c8071f0267dc9744e51c5ed42a9 @@ -23082,7 +23123,7 @@ __metadata: languageName: node linkType: hard -"open@npm:^8.4.0": +"open@npm:^8.0.9, open@npm:^8.4.0": version: 8.4.0 resolution: "open@npm:8.4.0" dependencies: @@ -23109,25 +23150,6 @@ __metadata: languageName: node linkType: hard -"opn@npm:^5.5.0": - version: 5.5.0 - resolution: "opn@npm:5.5.0" - dependencies: - is-wsl: ^1.1.0 - checksum: 35b677b5a1fd6c8cb1996b0607671ba79f7ce9fa029217d54eafaf6bee13eb7e700691c6a415009140fd02a435fffdfd143875f3b233b60f3f9d631c6f6b81a0 - languageName: node - linkType: hard - -"optimist@npm:*": - version: 0.6.1 - resolution: "optimist@npm:0.6.1" - dependencies: - minimist: ~0.0.1 - wordwrap: ~0.0.2 - checksum: 191ab2b119b2908a229065119349d9cbd295217a8777febd2812fc7b95c5f31f5f6ecb4fd0222351466cb33af8410299373229e78dd96713ed5348fcebfb96f4 - languageName: node - linkType: hard - "optional-require@npm:^1.1.8": version: 1.1.8 resolution: "optional-require@npm:1.1.8" @@ -23185,15 +23207,6 @@ __metadata: languageName: node linkType: hard -"original@npm:^1.0.0": - version: 1.0.2 - resolution: "original@npm:1.0.2" - dependencies: - url-parse: ^1.4.3 - checksum: 8dca9311dab50c8953366127cb86b7c07bf547d6aa6dc6873a75964b7563825351440557e5724d9c652c5e99043b8295624f106af077f84bccf19592e421beb9 - languageName: node - linkType: hard - "os-browserify@npm:*, os-browserify@npm:^0.3.0": version: 0.3.0 resolution: "os-browserify@npm:0.3.0" @@ -23832,7 +23845,7 @@ __metadata: languageName: node linkType: hard -"path-is-inside@npm:1.0.2, path-is-inside@npm:^1.0.1, path-is-inside@npm:^1.0.2": +"path-is-inside@npm:1.0.2, path-is-inside@npm:^1.0.1": version: 1.0.2 resolution: "path-is-inside@npm:1.0.2" checksum: 0b5b6c92d3018b82afb1f74fe6de6338c4c654de4a96123cb343f2b747d5606590ac0c890f956ed38220a4ab59baddfd7b713d78a62d240b20b14ab801fa02cb @@ -24376,26 +24389,6 @@ __metadata: languageName: node linkType: hard -"poplib@npm:^0.1.7": - version: 0.1.7 - resolution: "poplib@npm:0.1.7" - dependencies: - optimist: "*" - checksum: fc70583b4dbb297a2ede0a22d8d2b9ace73aada2ceb7ee9f18135e89861c349823ba0f10e1f4db564e4ebff6fd8effa36a2f2634baca6e06e5728e58cbcbbc70 - languageName: node - linkType: hard - -"portfinder@npm:^1.0.26": - version: 1.0.28 - resolution: "portfinder@npm:1.0.28" - dependencies: - async: ^2.6.2 - debug: ^3.1.1 - mkdirp: ^0.5.5 - checksum: 91fef602f13f8f4c64385d0ad2a36cc9dc6be0b8d10a2628ee2c3c7b9917ab4fefb458815b82cea2abf4b785cd11c9b4e2d917ac6fa06f14b6fa880ca8f8928c - languageName: node - linkType: hard - "posix-character-classes@npm:^0.1.0": version: 0.1.1 resolution: "posix-character-classes@npm:0.1.1" @@ -26603,7 +26596,7 @@ __metadata: languageName: node linkType: hard -"regexp.prototype.flags@npm:^1.2.0, regexp.prototype.flags@npm:^1.4.1, regexp.prototype.flags@npm:^1.4.3": +"regexp.prototype.flags@npm:^1.4.1, regexp.prototype.flags@npm:^1.4.3": version: 1.4.3 resolution: "regexp.prototype.flags@npm:1.4.3" dependencies: @@ -27270,6 +27263,8 @@ __metadata: "@rocket.chat/emitter": ~0.31.9 "@rocket.chat/icons": ^0.31.0 "@rocket.chat/message-parser": next + "@rocket.chat/model-typings": "workspace:^" + "@rocket.chat/models": "workspace:^" "@rocket.chat/rest-typings": "workspace:^" "@rocket.chat/string-helpers": ~0.31.9 "@rocket.chat/ui-kit": ~0.31.9 @@ -27566,6 +27561,18 @@ __metadata: languageName: node linkType: hard +"schema-utils@npm:^4.0.0": + version: 4.0.0 + resolution: "schema-utils@npm:4.0.0" + dependencies: + "@types/json-schema": ^7.0.9 + ajv: ^8.8.0 + ajv-formats: ^2.1.1 + ajv-keywords: ^5.0.0 + checksum: c843e92fdd1a5c145dbb6ffdae33e501867f9703afac67bdf35a685e49f85b1dcc10ea250033175a64bd9d31f0555bc6785b8359da0c90bcea30cf6dfbb55a8f + languageName: node + linkType: hard + "scmp@npm:^2.1.0": version: 2.1.0 resolution: "scmp@npm:2.1.0" @@ -27615,12 +27622,12 @@ __metadata: languageName: node linkType: hard -"selfsigned@npm:^1.10.8": - version: 1.10.14 - resolution: "selfsigned@npm:1.10.14" +"selfsigned@npm:^2.0.1": + version: 2.0.1 + resolution: "selfsigned@npm:2.0.1" dependencies: - node-forge: ^0.10.0 - checksum: 616d131b18516ba2876398f0230987511d50a13816e0709b9f0d20246a524a2e83dfb27ea46ce2bfe331519583a156afa67bc3ece8bf0f9804aec06e2e8c7a21 + node-forge: ^1 + checksum: 864e65c2f31ca877bce3ccdaa3bdef5e1e992b63b2a03641e00c24cd305bf2acce093431d1fed2e5ae9f526558db4be5e90baa2b3474c0428fcf7e25cc86ac93 languageName: node linkType: hard @@ -28175,20 +28182,7 @@ __metadata: languageName: node linkType: hard -"sockjs-client@npm:^1.5.0": - version: 1.6.0 - resolution: "sockjs-client@npm:1.6.0" - dependencies: - debug: ^3.2.7 - eventsource: ^1.1.0 - faye-websocket: ^0.11.4 - inherits: ^2.0.4 - url-parse: ^1.5.10 - checksum: e071eafb2a0a3e1ecd5af8b423c01e4c76be703cf13d97ee240b2af297784d57a0a3b398415cbb6506f80a256d1a16c7b4c15da9e58520bf0cc28cc316ccbda4 - languageName: node - linkType: hard - -"sockjs@npm:^0.3.21": +"sockjs@npm:^0.3.24": version: 0.3.24 resolution: "sockjs@npm:0.3.24" dependencies: @@ -31174,7 +31168,7 @@ __metadata: languageName: node linkType: hard -"url-parse@npm:^1.4.3, url-parse@npm:^1.5.10, url-parse@npm:^1.5.9": +"url-parse@npm:^1.5.10, url-parse@npm:^1.5.9": version: 1.5.10 resolution: "url-parse@npm:1.5.10" dependencies: @@ -31727,7 +31721,7 @@ __metadata: languageName: node linkType: hard -"webpack-dev-middleware@npm:^3.7.2, webpack-dev-middleware@npm:^3.7.3": +"webpack-dev-middleware@npm:^3.7.3": version: 3.7.3 resolution: "webpack-dev-middleware@npm:3.7.3" dependencies: @@ -31742,51 +31736,62 @@ __metadata: languageName: node linkType: hard -"webpack-dev-server@npm:^3.11.0": - version: 3.11.3 - resolution: "webpack-dev-server@npm:3.11.3" +"webpack-dev-middleware@npm:^5.3.1": + version: 5.3.3 + resolution: "webpack-dev-middleware@npm:5.3.3" dependencies: - ansi-html-community: 0.0.8 - bonjour: ^3.5.0 - chokidar: ^2.1.8 + colorette: ^2.0.10 + memfs: ^3.4.3 + mime-types: ^2.1.31 + range-parser: ^1.2.1 + schema-utils: ^4.0.0 + peerDependencies: + webpack: ^4.0.0 || ^5.0.0 + checksum: dd332cc6da61222c43d25e5a2155e23147b777ff32fdf1f1a0a8777020c072fbcef7756360ce2a13939c3f534c06b4992a4d659318c4a7fe2c0530b52a8a6621 + languageName: node + linkType: hard + +"webpack-dev-server@npm:^4.9.2": + version: 4.9.2 + resolution: "webpack-dev-server@npm:4.9.2" + dependencies: + "@types/bonjour": ^3.5.9 + "@types/connect-history-api-fallback": ^1.3.5 + "@types/express": ^4.17.13 + "@types/serve-index": ^1.9.1 + "@types/serve-static": ^1.13.10 + "@types/sockjs": ^0.3.33 + "@types/ws": ^8.5.1 + ansi-html-community: ^0.0.8 + bonjour-service: ^1.0.11 + chokidar: ^3.5.3 + colorette: ^2.0.10 compression: ^1.7.4 connect-history-api-fallback: ^1.6.0 - debug: ^4.1.1 - del: ^4.1.1 - express: ^4.17.1 - html-entities: ^1.3.1 - http-proxy-middleware: 0.19.1 - import-local: ^2.0.0 - internal-ip: ^4.3.0 - ip: ^1.1.5 - is-absolute-url: ^3.0.3 - killable: ^1.0.1 - loglevel: ^1.6.8 - opn: ^5.5.0 - p-retry: ^3.0.1 - portfinder: ^1.0.26 - schema-utils: ^1.0.0 - selfsigned: ^1.10.8 - semver: ^6.3.0 + default-gateway: ^6.0.3 + express: ^4.17.3 + graceful-fs: ^4.2.6 + html-entities: ^2.3.2 + http-proxy-middleware: ^2.0.3 + ipaddr.js: ^2.0.1 + open: ^8.0.9 + p-retry: ^4.5.0 + rimraf: ^3.0.2 + schema-utils: ^4.0.0 + selfsigned: ^2.0.1 serve-index: ^1.9.1 - sockjs: ^0.3.21 - sockjs-client: ^1.5.0 + sockjs: ^0.3.24 spdy: ^4.0.2 - strip-ansi: ^3.0.1 - supports-color: ^6.1.0 - url: ^0.11.0 - webpack-dev-middleware: ^3.7.2 - webpack-log: ^2.0.0 - ws: ^6.2.1 - yargs: ^13.3.2 + webpack-dev-middleware: ^5.3.1 + ws: ^8.4.2 peerDependencies: - webpack: ^4.0.0 || ^5.0.0 + webpack: ^4.37.0 || ^5.0.0 peerDependenciesMeta: webpack-cli: optional: true bin: webpack-dev-server: bin/webpack-dev-server.js - checksum: ae2dbcfcd9e8064b00b9c369343b4d4ff31c30a37c459f00b40d27fd6008188edd20ab8497155cd39f0ba704682fc60ca065b6458b54d2dac938b290e0df8cd9 + checksum: 201e28445f59df55a31728885defe5bf5ae7880fa1dd563f370131794f8c02fd63fcd51bbca67a34f0df232e83b5f883d452d2b0ed1954eb257d574c0c76b46d languageName: node linkType: hard @@ -32148,13 +32153,6 @@ __metadata: languageName: node linkType: hard -"wordwrap@npm:~0.0.2": - version: 0.0.3 - resolution: "wordwrap@npm:0.0.3" - checksum: dfc2d3512e857ae4b3bc2e8d4e5d2c285c28a4b87cd1d81c977ce9a1a99152d355807e046851a3d61148f39d877fbb889352e07b65a9cbdd2256aa928e159026 - languageName: node - linkType: hard - "worker-farm@npm:^1.7.0": version: 1.7.0 resolution: "worker-farm@npm:1.7.0" @@ -32261,15 +32259,6 @@ __metadata: languageName: node linkType: hard -"ws@npm:^6.2.1": - version: 6.2.2 - resolution: "ws@npm:6.2.2" - dependencies: - async-limiter: ~1.0.0 - checksum: aec3154ec51477c094ac2cb5946a156e17561a581fa27005cbf22c53ac57f8d4e5f791dd4bbba6a488602cb28778c8ab7df06251d590507c3c550fd8ebeee949 - languageName: node - linkType: hard - "ws@npm:^7.0.0, ws@npm:^7.4.6": version: 7.5.7 resolution: "ws@npm:7.5.7" @@ -32300,6 +32289,21 @@ __metadata: languageName: node linkType: hard +"ws@npm:^8.4.2": + version: 8.8.0 + resolution: "ws@npm:8.8.0" + peerDependencies: + bufferutil: ^4.0.1 + utf-8-validate: ^5.0.2 + peerDependenciesMeta: + bufferutil: + optional: true + utf-8-validate: + optional: true + checksum: 6ceed1ca1cb800ef60c7fc8346c7d5d73d73be754228eb958765abf5d714519338efa20ffe674167039486eb3a813aae5a497f8d319e16b4d96216a31df5bd95 + languageName: node + linkType: hard + "ws@npm:~7.4.0": version: 7.4.6 resolution: "ws@npm:7.4.6"