From a791efa0fc0c2d2fccf8b8a313724966faa20882 Mon Sep 17 00:00:00 2001 From: Diego Sampaio Date: Thu, 23 Mar 2023 23:46:43 -0300 Subject: [PATCH] refactor(models): Use Messages Raw model (5/N) (#28590) --- apps/meteor/app/api/server/v1/rooms.ts | 2 +- .../app/autotranslate/server/autotranslate.ts | 30 ++++++---- .../server/functions/saveRoomName.js | 7 ++- .../server/functions/saveRoomReadOnly.js | 18 ------ .../server/functions/saveRoomReadOnly.ts | 30 ++++++++++ .../server/methods/saveRoomSettings.ts | 12 ++-- .../app/livechat/server/api/v1/videoCall.ts | 2 +- .../app/models/server/models/Messages.js | 49 ----------------- apps/meteor/app/models/server/models/Rooms.js | 13 ----- .../app/reactions/server/setReaction.ts | 18 +++--- .../app/slackbridge/server/SlackAdapter.js | 14 +++-- .../dataExport/exportRoomMessagesToFile.ts | 2 +- .../server/lib/dataExport/sendViaEmail.ts | 18 +++--- apps/meteor/server/models/raw/Messages.ts | 55 +++++++++++++------ .../rocket-chat/adapters/Room.ts | 10 ++-- .../core-typings/src/IMessage/IMessage.ts | 2 +- .../src/models/IMessagesModel.ts | 22 ++++---- 17 files changed, 145 insertions(+), 159 deletions(-) delete mode 100644 apps/meteor/app/channel-settings/server/functions/saveRoomReadOnly.js create mode 100644 apps/meteor/app/channel-settings/server/functions/saveRoomReadOnly.ts diff --git a/apps/meteor/app/api/server/v1/rooms.ts b/apps/meteor/app/api/server/v1/rooms.ts index 83ec3f7c081..a9d1940fd1f 100644 --- a/apps/meteor/app/api/server/v1/rooms.ts +++ b/apps/meteor/app/api/server/v1/rooms.ts @@ -607,7 +607,7 @@ API.v1.addRoute( throw new Meteor.Error('error-invalid-messages'); } - const result = dataExport.sendViaEmail( + const result = await dataExport.sendViaEmail( { rid, toUsers: (toUsers as string[]) || [], diff --git a/apps/meteor/app/autotranslate/server/autotranslate.ts b/apps/meteor/app/autotranslate/server/autotranslate.ts index 90be321de3c..8073c883706 100644 --- a/apps/meteor/app/autotranslate/server/autotranslate.ts +++ b/apps/meteor/app/autotranslate/server/autotranslate.ts @@ -10,11 +10,10 @@ import type { ISupportedLanguage, ITranslationResult, } from '@rocket.chat/core-typings'; -import { Subscriptions } from '@rocket.chat/models'; +import { Messages, Subscriptions } from '@rocket.chat/models'; import { settings } from '../../settings/server'; import { callbacks } from '../../../lib/callbacks'; -import { Messages } from '../../models/server'; import { Markdown } from '../../markdown/server'; import { Logger } from '../../logger/server'; import { isTruthy } from '../../../lib/isTruthy'; @@ -69,10 +68,17 @@ export class TranslationProviderRegistry { return TranslationProviderRegistry.enabled ? TranslationProviderRegistry.getActiveProvider()?.getSupportedLanguages(target) : undefined; } - static async translateMessage(message: IMessage, room: IRoom, targetLanguage?: string): Promise { - return TranslationProviderRegistry.enabled - ? TranslationProviderRegistry.getActiveProvider()?.translateMessage(message, room, targetLanguage) - : undefined; + static async translateMessage(message: IMessage, room: IRoom, targetLanguage?: string): Promise { + if (!TranslationProviderRegistry.enabled) { + return null; + } + + const provider = TranslationProviderRegistry.getActiveProvider(); + if (!provider) { + return null; + } + + return provider.translateMessage(message, room, targetLanguage); } static getProviders(): AutoTranslate[] { @@ -283,7 +289,7 @@ export abstract class AutoTranslate { * @param {object} targetLanguage * @returns {object} unmodified message object. */ - async translateMessage(message: IMessage, room: IRoom, targetLanguage?: string): Promise { + async translateMessage(message: IMessage, room: IRoom, targetLanguage?: string): Promise { let targetLanguages: string[]; if (targetLanguage) { targetLanguages = [targetLanguage]; @@ -291,21 +297,21 @@ export abstract class AutoTranslate { targetLanguages = (await Subscriptions.getAutoTranslateLanguagesByRoomAndNotUser(room._id, message.u?._id)).filter(isTruthy); } if (message.msg) { - Meteor.defer(() => { + Meteor.defer(async () => { let targetMessage = Object.assign({}, message); targetMessage.html = escapeHTML(String(targetMessage.msg)); targetMessage = this.tokenize(targetMessage); const translations = this._translateMessage(targetMessage, targetLanguages); if (!_.isEmpty(translations)) { - Messages.addTranslations(message._id, translations, TranslationProviderRegistry[Provider]); + await Messages.addTranslations(message._id, translations, TranslationProviderRegistry[Provider] || ''); } }); } if (message.attachments && message.attachments.length > 0) { - Meteor.defer(() => { - for (const [index, attachment] of message.attachments?.entries() ?? []) { + Meteor.defer(async () => { + for await (const [index, attachment] of message.attachments?.entries() ?? []) { if (attachment.description || attachment.text) { // Removes the initial link `[ ](quoterl)` from quote message before translation const translatedText = attachment?.text?.replace(/\[(.*?)\]\(.*?\)/g, '$1') || attachment?.text; @@ -313,7 +319,7 @@ export abstract class AutoTranslate { const translations = this._translateAttachmentDescriptions(attachmentMessage, targetLanguages); if (!_.isEmpty(translations)) { - Messages.addAttachmentTranslations(message._id, index, translations); + await Messages.addAttachmentTranslations(message._id, String(index), translations); } } } diff --git a/apps/meteor/app/channel-settings/server/functions/saveRoomName.js b/apps/meteor/app/channel-settings/server/functions/saveRoomName.js index 97e50d20b09..fcecb2fc2d7 100644 --- a/apps/meteor/app/channel-settings/server/functions/saveRoomName.js +++ b/apps/meteor/app/channel-settings/server/functions/saveRoomName.js @@ -1,8 +1,9 @@ import { Meteor } from 'meteor/meteor'; -import { Integrations } from '@rocket.chat/models'; +import { Integrations, Messages } from '@rocket.chat/models'; import { isRoomFederated } from '@rocket.chat/core-typings'; -import { Rooms, Messages, Subscriptions } from '../../../models/server'; +import { Rooms, Subscriptions } from '../../../models/server'; +import { settings } from '../../../settings/server'; import { getValidRoomName } from '../../../utils/server'; import { callbacks } from '../../../../lib/callbacks'; import { checkUsernameAvailability } from '../../../lib/server/functions/checkUsernameAvailability'; @@ -53,7 +54,7 @@ export async function saveRoomName(rid, displayName, user, sendMessage = true) { await Integrations.updateRoomName(room.name, displayName); if (sendMessage) { - Messages.createRoomRenamedWithRoomIdRoomNameAndUser(rid, displayName, user); + await Messages.createRoomRenamedWithRoomIdRoomNameAndUser(rid, displayName, user, settings.get('Message_Read_Receipt_Enabled')); } callbacks.run('afterRoomNameChange', { rid, name: displayName, oldName: room.name }); return displayName; diff --git a/apps/meteor/app/channel-settings/server/functions/saveRoomReadOnly.js b/apps/meteor/app/channel-settings/server/functions/saveRoomReadOnly.js deleted file mode 100644 index 7cdb614e067..00000000000 --- a/apps/meteor/app/channel-settings/server/functions/saveRoomReadOnly.js +++ /dev/null @@ -1,18 +0,0 @@ -import { Meteor } from 'meteor/meteor'; -import { Match } from 'meteor/check'; - -import { Rooms, Messages } from '../../../models/server'; - -export const saveRoomReadOnly = function (rid, readOnly, user, sendMessage = true) { - if (!Match.test(rid, String)) { - throw new Meteor.Error('invalid-room', 'Invalid room', { - function: 'RocketChat.saveRoomReadOnly', - }); - } - const result = Rooms.setReadOnlyById(rid, readOnly); - - if (result && sendMessage) { - readOnly ? Messages.createRoomSetReadOnlyByRoomIdAndUser(rid, user) : Messages.createRoomRemovedReadOnlyByRoomIdAndUser(rid, user); - } - return result; -}; diff --git a/apps/meteor/app/channel-settings/server/functions/saveRoomReadOnly.ts b/apps/meteor/app/channel-settings/server/functions/saveRoomReadOnly.ts new file mode 100644 index 00000000000..00ec8bc4662 --- /dev/null +++ b/apps/meteor/app/channel-settings/server/functions/saveRoomReadOnly.ts @@ -0,0 +1,30 @@ +import { Meteor } from 'meteor/meteor'; +import { Match } from 'meteor/check'; +import { Rooms, Messages } from '@rocket.chat/models'; +import type { IUser } from '@rocket.chat/core-typings'; + +import { settings } from '../../../settings/server'; + +export async function saveRoomReadOnly( + rid: string, + readOnly: boolean, + user: Required>, + sendMessage = true, +) { + if (!Match.test(rid, String)) { + throw new Meteor.Error('invalid-room', 'Invalid room', { + function: 'RocketChat.saveRoomReadOnly', + }); + } + + const result = await Rooms.setReadOnlyById(rid, readOnly); + + if (result && sendMessage) { + if (readOnly) { + await Messages.createRoomSetReadOnlyByRoomIdAndUser(rid, user, settings.get('Message_Read_Receipt_Enabled')); + } else { + await Messages.createRoomRemovedReadOnlyByRoomIdAndUser(rid, user, settings.get('Message_Read_Receipt_Enabled')); + } + } + return result; +} diff --git a/apps/meteor/app/channel-settings/server/methods/saveRoomSettings.ts b/apps/meteor/app/channel-settings/server/methods/saveRoomSettings.ts index 99af371b683..c1c626313ce 100644 --- a/apps/meteor/app/channel-settings/server/methods/saveRoomSettings.ts +++ b/apps/meteor/app/channel-settings/server/methods/saveRoomSettings.ts @@ -31,7 +31,7 @@ type RoomSettings = { roomCustomFields: unknown; roomDescription: unknown; roomType: unknown; - readOnly: unknown; + readOnly: boolean; reactWhenReadOnly: unknown; systemMessages: unknown; default: unknown; @@ -203,7 +203,7 @@ const validators: RoomSettingsValidators = { type RoomSettingsSavers = { [TRoomSetting in keyof RoomSettings]?: (params: { userId: IUser['_id']; - user: IUser; + user: IUser & Required>; value: RoomSettings[TRoomSetting]; room: IRoom; rid: IRoom['_id']; @@ -270,9 +270,9 @@ const settingSavers: RoomSettingsSavers = { streamingOptions({ value, rid }) { saveStreamingOptions(rid, value); }, - readOnly({ value, room, rid, user }) { + async readOnly({ value, room, rid, user }) { if (value !== room.ro) { - saveRoomReadOnly(rid, value, user); + await saveRoomReadOnly(rid, value, user); } }, reactWhenReadOnly({ value, room, rid, user }) { @@ -377,7 +377,7 @@ async function save( setting: TRoomSetting, params: { userId: IUser['_id']; - user: IUser; + user: IUser & Required>; value: RoomSettings[TRoomSetting]; room: IRoom; rid: IRoom['_id']; @@ -448,7 +448,7 @@ async function saveRoomSettings( }); } - const user = Meteor.user() as IUser | null; + const user = Meteor.user() as (IUser & Required>) | null; if (!user) { throw new Meteor.Error('error-invalid-user', 'Invalid user', { method: 'saveRoomSettings', diff --git a/apps/meteor/app/livechat/server/api/v1/videoCall.ts b/apps/meteor/app/livechat/server/api/v1/videoCall.ts index b7b127814fe..aeebdbd8046 100644 --- a/apps/meteor/app/livechat/server/api/v1/videoCall.ts +++ b/apps/meteor/app/livechat/server/api/v1/videoCall.ts @@ -43,7 +43,7 @@ API.v1.addRoute( await Settings.incrementValueById('WebRTC_Calls_Count'); callStatus = 'ringing'; await Rooms.setCallStatusAndCallStartTime(room._id, callStatus); - await Messages.createWithTypeRoomIdMessageAndUser( + Messages.createWithTypeRoomIdMessageAndUser( 'livechat_webrtc_video_call', room._id, TAPi18n.__('Join_my_room_to_start_the_video_call'), diff --git a/apps/meteor/app/models/server/models/Messages.js b/apps/meteor/app/models/server/models/Messages.js index 2711b75fa7f..a0d6d2237b9 100644 --- a/apps/meteor/app/models/server/models/Messages.js +++ b/apps/meteor/app/models/server/models/Messages.js @@ -35,10 +35,6 @@ export class Messages extends Base { this.tryEnsureIndex({ 'navigation.token': 1 }, { sparse: true }); } - setReactions(messageId, reactions) { - return this.update({ _id: messageId }, { $set: { reactions } }); - } - createRoomArchivedByRoomIdAndUser(roomId, user) { return this.createWithTypeRoomIdMessageAndUser('room-archived', roomId, '', user); } @@ -47,14 +43,6 @@ export class Messages extends Base { return this.createWithTypeRoomIdMessageAndUser('room-unarchived', roomId, '', user); } - createRoomSetReadOnlyByRoomIdAndUser(roomId, user) { - return this.createWithTypeRoomIdMessageAndUser('room-set-read-only', roomId, '', user); - } - - createRoomRemovedReadOnlyByRoomIdAndUser(roomId, user) { - return this.createWithTypeRoomIdMessageAndUser('room-removed-read-only', roomId, '', user); - } - createRoomAllowedReactingByRoomIdAndUser(roomId, user) { return this.createWithTypeRoomIdMessageAndUser('room-allowed-reacting', roomId, '', user); } @@ -63,10 +51,6 @@ export class Messages extends Base { return this.createWithTypeRoomIdMessageAndUser('room-disallowed-reacting', roomId, '', user); } - unsetReactions(messageId) { - return this.update({ _id: messageId }, { $unset: { reactions: 1 } }); - } - updateOTRAck(_id, otrAck) { const query = { _id }; const update = { $set: { otrAck } }; @@ -77,28 +61,6 @@ export class Messages extends Base { return this.createWithTypeRoomIdMessageAndUser(type, roomId, message, user, extraData); } - createRoomRenamedWithRoomIdRoomNameAndUser(roomId, roomName, user, extraData) { - return this.createWithTypeRoomIdMessageAndUser('r', roomId, roomName, user, extraData); - } - - addTranslations(messageId, translations, providerName) { - const updateObj = { translationProvider: providerName }; - Object.keys(translations).forEach((key) => { - const translation = translations[key]; - updateObj[`translations.${key}`] = translation; - }); - return this.update({ _id: messageId }, { $set: updateObj }); - } - - addAttachmentTranslations = function (messageId, attachmentIndex, translations) { - const updateObj = {}; - Object.keys(translations).forEach((key) => { - const translation = translations[key]; - updateObj[`attachments.${attachmentIndex}.translations.${key}`] = translation; - }); - return this.update({ _id: messageId }, { $set: updateObj }); - }; - setImportFileRocketChatAttachment(importFileId, rocketChatUrl, attachment) { const query = { '_importFile.id': importFileId, @@ -277,17 +239,6 @@ export class Messages extends Base { return this.find(query, options); } - findByRoomIdAndMessageIds(rid, messageIds, options) { - const query = { - rid, - _id: { - $in: messageIds, - }, - }; - - return this.find(query, options); - } - findOneBySlackBotIdAndSlackTs(slackBotId, slackTs) { const query = { slackBotId, diff --git a/apps/meteor/app/models/server/models/Rooms.js b/apps/meteor/app/models/server/models/Rooms.js index 271bde5ed61..96309c7879c 100644 --- a/apps/meteor/app/models/server/models/Rooms.js +++ b/apps/meteor/app/models/server/models/Rooms.js @@ -176,19 +176,6 @@ class Rooms extends Base { return this.update({ _id }, update); } - setReadOnlyById(_id, readOnly) { - const query = { - _id, - }; - const update = { - $set: { - ro: readOnly, - }, - }; - - return this.update(query, update); - } - setDmReadOnlyByUserId(_id, ids, readOnly, reactWhenReadOnly) { const query = { uids: { diff --git a/apps/meteor/app/reactions/server/setReaction.ts b/apps/meteor/app/reactions/server/setReaction.ts index 68b0480087a..fd40cf45974 100644 --- a/apps/meteor/app/reactions/server/setReaction.ts +++ b/apps/meteor/app/reactions/server/setReaction.ts @@ -1,12 +1,12 @@ import { Meteor } from 'meteor/meteor'; import { TAPi18n } from 'meteor/rocketchat:tap-i18n'; import _ from 'underscore'; -import { EmojiCustom } from '@rocket.chat/models'; +import { Messages, EmojiCustom } from '@rocket.chat/models'; import { api } from '@rocket.chat/core-services'; import type { IMessage, IRoom, IUser } from '@rocket.chat/core-typings'; import type { ServerMethods } from '@rocket.chat/ui-contexts'; -import { Messages, Rooms } from '../../models/server'; +import { Rooms } from '../../models/server'; import { callbacks } from '../../../lib/callbacks'; import { emoji } from '../../emoji/server'; import { isTheLastMessage, msgStream } from '../../lib/server'; @@ -71,9 +71,9 @@ async function setReaction(room: IRoom, user: IUser, message: IMessage, reaction if (isTheLastMessage(room, message)) { Rooms.unsetReactionsInLastMessage(room._id); } - Messages.unsetReactions(message._id); + await Messages.unsetReactions(message._id); } else { - Messages.setReactions(message._id, message.reactions); + await Messages.setReactions(message._id, message.reactions); if (isTheLastMessage(room, message)) { Rooms.setReactionsInLastMessage(room._id, message); } @@ -92,7 +92,7 @@ async function setReaction(room: IRoom, user: IUser, message: IMessage, reaction }; } message.reactions[reaction].usernames.push(user.username as string); - Messages.setReactions(message._id, message.reactions); + await Messages.setReactions(message._id, message.reactions); if (isTheLastMessage(room, message)) { Rooms.setReactionsInLastMessage(room._id, message); } @@ -107,14 +107,14 @@ async function setReaction(room: IRoom, user: IUser, message: IMessage, reaction msgStream.emit(message.rid, message); } -export const executeSetReaction = async (reaction: string, messageId: IMessage['_id'], shouldReact?: boolean) => { +export async function executeSetReaction(reaction: string, messageId: IMessage['_id'], shouldReact?: boolean) { const user = Meteor.user() as IUser | null; if (!user) { throw new Meteor.Error('error-invalid-user', 'Invalid user', { method: 'setReaction' }); } - const message = Messages.findOneById(messageId); + const message = await Messages.findOneById(messageId); if (!message) { throw new Meteor.Error('error-not-allowed', 'Not allowed', { method: 'setReaction' }); } @@ -129,7 +129,7 @@ export const executeSetReaction = async (reaction: string, messageId: IMessage[' } return setReaction(room, user, message, reaction, shouldReact); -}; +} declare module '@rocket.chat/ui-contexts' { // eslint-disable-next-line @typescript-eslint/naming-convention @@ -146,7 +146,7 @@ Meteor.methods({ } try { - void executeSetReaction(reaction, messageId, shouldReact); + await executeSetReaction(reaction, messageId, shouldReact); } catch (e: any) { if (e.error === 'error-not-allowed' && e.reason && e.details && e.details.rid) { void api.broadcast('notify.ephemeralMessage', uid, e.details.rid, { diff --git a/apps/meteor/app/slackbridge/server/SlackAdapter.js b/apps/meteor/app/slackbridge/server/SlackAdapter.js index 7e93e742eda..0b739b6dce7 100644 --- a/apps/meteor/app/slackbridge/server/SlackAdapter.js +++ b/apps/meteor/app/slackbridge/server/SlackAdapter.js @@ -1003,10 +1003,16 @@ export default class SlackAdapter { async processNameMessage(rocketChannel, rocketUser, slackMessage, isImporting) { if (isImporting) { - Messages.createRoomRenamedWithRoomIdRoomNameAndUser(rocketChannel._id, slackMessage.name, rocketUser, { - ts: new Date(parseInt(slackMessage.ts.split('.')[0]) * 1000), - imported: 'slackbridge', - }); + await MessagesRaw.createRoomRenamedWithRoomIdRoomNameAndUser( + rocketChannel._id, + slackMessage.name, + rocketUser, + settings.get('Message_Read_Receipt_Enabled'), + { + ts: new Date(parseInt(slackMessage.ts.split('.')[0]) * 1000), + imported: 'slackbridge', + }, + ); } else { await saveRoomName(rocketChannel._id, slackMessage.name, rocketUser, false); } diff --git a/apps/meteor/server/lib/dataExport/exportRoomMessagesToFile.ts b/apps/meteor/server/lib/dataExport/exportRoomMessagesToFile.ts index 8d8d50c9d2e..df31219d858 100644 --- a/apps/meteor/server/lib/dataExport/exportRoomMessagesToFile.ts +++ b/apps/meteor/server/lib/dataExport/exportRoomMessagesToFile.ts @@ -69,7 +69,7 @@ const getMessageData = ( userData: Pick | undefined, usersMap: { userNameTable: Record }, ): MessageData => { - const username = hideUsers ? hideUserName(msg.u.username || msg.u.name, userData, usersMap) : msg.u.username; + const username = hideUsers ? hideUserName(msg.u.username || msg.u.name || '', userData, usersMap) : msg.u.username; const messageObject = { msg: msg.msg, diff --git a/apps/meteor/server/lib/dataExport/sendViaEmail.ts b/apps/meteor/server/lib/dataExport/sendViaEmail.ts index 4c5846fc6b1..20cae511a30 100644 --- a/apps/meteor/server/lib/dataExport/sendViaEmail.ts +++ b/apps/meteor/server/lib/dataExport/sendViaEmail.ts @@ -1,13 +1,14 @@ import moment from 'moment'; import type { IMessage, IUser } from '@rocket.chat/core-typings'; +import { Messages } from '@rocket.chat/models'; import * as Mailer from '../../../app/mailer/server/api'; -import { Messages, Users } from '../../../app/models/server'; +import { Users } from '../../../app/models/server'; import { settings } from '../../../app/settings/server'; import { Message } from '../../../app/ui-utils/server'; import { getMomentLocale } from '../getMomentLocale'; -export function sendViaEmail( +export async function sendViaEmail( data: { rid: string; toUsers: string[]; @@ -17,9 +18,9 @@ export function sendViaEmail( language: string; }, user: IUser, -): { +): Promise<{ missing: string[]; -} { +}> { const emails = data.toEmails.map((email) => email.trim()).filter(Boolean); const missing = [...data.toUsers].filter(Boolean); @@ -58,10 +59,11 @@ export function sendViaEmail( } } - const html = Messages.findByRoomIdAndMessageIds(data.rid, data.messages, { - sort: { ts: 1 }, - }) - .fetch() + const html = ( + await Messages.findByRoomIdAndMessageIds(data.rid, data.messages, { + sort: { ts: 1 }, + }).toArray() + ) .map((message: IMessage) => { const dateTime = moment(message.ts).locale(lang).format('L LT'); return `

${ diff --git a/apps/meteor/server/models/raw/Messages.ts b/apps/meteor/server/models/raw/Messages.ts index 0710d60bbd3..2119c75ed7d 100644 --- a/apps/meteor/server/models/raw/Messages.ts +++ b/apps/meteor/server/models/raw/Messages.ts @@ -771,20 +771,12 @@ export class MessagesRaw extends BaseRaw implements IMessagesModel { return this.createWithTypeRoomIdMessageAndUser('room-unarchived', roomId, '', user, readReceiptsEnabled); } - createRoomSetReadOnlyByRoomIdAndUser( - roomId: string, - user: IMessage['u'], - readReceiptsEnabled?: boolean, - ): Promise> { - return this.createWithTypeRoomIdMessageAndUser('room-set-read-only', roomId, '', user, readReceiptsEnabled); + createRoomSetReadOnlyByRoomIdAndUser(roomId: string, user: IMessage['u'], readReceiptsEnabled: boolean): Promise { + return this.createWithTypeRoomIdMessageUserAndUnread('room-set-read-only', roomId, '', user, readReceiptsEnabled); } - createRoomRemovedReadOnlyByRoomIdAndUser( - roomId: string, - user: IMessage['u'], - readReceiptsEnabled?: boolean, - ): Promise> { - return this.createWithTypeRoomIdMessageAndUser('room-removed-read-only', roomId, '', user, readReceiptsEnabled); + createRoomRemovedReadOnlyByRoomIdAndUser(roomId: string, user: IMessage['u'], readReceiptsEnabled: boolean): Promise { + return this.createWithTypeRoomIdMessageUserAndUnread('room-removed-read-only', roomId, '', user, readReceiptsEnabled); } createRoomAllowedReactingByRoomIdAndUser( @@ -844,10 +836,10 @@ export class MessagesRaw extends BaseRaw implements IMessagesModel { roomId: string, roomName: string, user: IMessage['u'], - readReceiptsEnabled?: boolean, + readReceiptsEnabled: boolean, extraData: Record = {}, - ): Promise> { - return this.createWithTypeRoomIdMessageAndUser('r', roomId, roomName, user, readReceiptsEnabled, extraData); + ): Promise { + return this.createWithTypeRoomIdMessageUserAndUnread('r', roomId, roomName, user, readReceiptsEnabled, extraData); } addTranslations(messageId: string, translations: Record, providerName: string): Promise { @@ -1418,7 +1410,7 @@ export class MessagesRaw extends BaseRaw implements IMessagesModel { type: MessageTypesValues, roomId: string, message: string, - user: IMessage['u'], + user: Pick, readReceiptsEnabled?: boolean, extraData?: Record, ): Promise> { @@ -1430,7 +1422,6 @@ export class MessagesRaw extends BaseRaw implements IMessagesModel { u: { _id: user._id, username: user.username, - name: '', }, groupable: false as const, ...(readReceiptsEnabled && { unread: true }), @@ -1442,6 +1433,36 @@ export class MessagesRaw extends BaseRaw implements IMessagesModel { return { ...record, _id: (await this.updateOne(data, data, { upsert: true })).upsertedId as unknown as string }; } + async createWithTypeRoomIdMessageUserAndUnread( + type: MessageTypesValues, + roomId: string, + message: string, + user: Pick, + unread: boolean, + extraData?: Record, + ): Promise { + const record: Omit = { + t: type, + rid: roomId, + ts: new Date(), + msg: message, + u: { + _id: user._id, + username: user.username, + }, + groupable: false as const, + unread, + }; + + const data = Object.assign(record, extraData); + + await Rooms.incMsgCountById(roomId, 1); + + const result = await this.insertOne(data); + + return this.findOneById(result.insertedId); + } + async createNavigationHistoryWithRoomIdMessageAndUser( roomId: string, message: string, diff --git a/apps/meteor/server/services/federation/infrastructure/rocket-chat/adapters/Room.ts b/apps/meteor/server/services/federation/infrastructure/rocket-chat/adapters/Room.ts index 590fbd5c8fd..456cc349912 100644 --- a/apps/meteor/server/services/federation/infrastructure/rocket-chat/adapters/Room.ts +++ b/apps/meteor/server/services/federation/infrastructure/rocket-chat/adapters/Room.ts @@ -1,6 +1,6 @@ -import type { IRoom } from '@rocket.chat/core-typings'; +import type { IRoom, IUser } from '@rocket.chat/core-typings'; import { isDirectMessageRoom } from '@rocket.chat/core-typings'; -import { Rooms, Subscriptions, MatrixBridgedRoom } from '@rocket.chat/models'; +import { Messages as MessagesRaw, Rooms, Subscriptions, MatrixBridgedRoom } from '@rocket.chat/models'; import { api } from '@rocket.chat/core-services'; import { DirectMessageFederatedRoom, FederatedRoom } from '../../../domain/FederatedRoom'; @@ -131,10 +131,10 @@ export class RocketChatRoomAdapter { federatedRoom.getName() || '', federatedRoom.getDisplayName() || '', ); - Messages.createRoomRenamedWithRoomIdRoomNameAndUser( + await MessagesRaw.createRoomRenamedWithRoomIdRoomNameAndUser( federatedRoom.getInternalId(), - federatedRoom.getDisplayName(), - federatedUser.getInternalReference(), + federatedRoom.getDisplayName() || '', + federatedUser.getInternalReference() as unknown as Required, // TODO fix type ); } diff --git a/packages/core-typings/src/IMessage/IMessage.ts b/packages/core-typings/src/IMessage/IMessage.ts index aef36225352..573cbcb15ca 100644 --- a/packages/core-typings/src/IMessage/IMessage.ts +++ b/packages/core-typings/src/IMessage/IMessage.ts @@ -132,7 +132,7 @@ export interface IMessage extends IRocketChatRecord { groupable?: false; channels?: Pick[]; - u: Required>; + u: Required> & Pick; blocks?: MessageSurfaceLayout; alias?: string; md?: Root; diff --git a/packages/model-typings/src/models/IMessagesModel.ts b/packages/model-typings/src/models/IMessagesModel.ts index 407f904c5ae..fd1cb5f54ad 100644 --- a/packages/model-typings/src/models/IMessagesModel.ts +++ b/packages/model-typings/src/models/IMessagesModel.ts @@ -128,16 +128,16 @@ export interface IMessagesModel extends IBaseModel { user: IMessage['u'], readReceiptsEnabled?: boolean, ): Promise>; - createRoomSetReadOnlyByRoomIdAndUser( - roomId: string, - user: IMessage['u'], - readReceiptsEnabled?: boolean, - ): Promise>; - createRoomRemovedReadOnlyByRoomIdAndUser( + createRoomSetReadOnlyByRoomIdAndUser(roomId: string, user: IMessage['u'], readReceiptsEnabled?: boolean): Promise; + createRoomRemovedReadOnlyByRoomIdAndUser(roomId: string, user: IMessage['u'], readReceiptsEnabled?: boolean): Promise; + createWithTypeRoomIdMessageUserAndUnread( + type: MessageTypesValues, roomId: string, - user: IMessage['u'], - readReceiptsEnabled?: boolean, - ): Promise>; + message: string, + user: Pick, + unread: boolean, + extraData?: Record, + ): Promise; createRoomAllowedReactingByRoomIdAndUser( roomId: string, user: IMessage['u'], @@ -165,7 +165,7 @@ export interface IMessagesModel extends IBaseModel { user: IMessage['u'], readReceiptsEnabled?: boolean, extraData?: Record, - ): Promise>; + ): Promise; addTranslations(messageId: string, translations: Record, providerName: string): Promise; addAttachmentTranslations(messageId: string, attachmentIndex: string, translations: Record): Promise; setImportFileRocketChatAttachment( @@ -259,7 +259,7 @@ export interface IMessagesModel extends IBaseModel { type: MessageTypesValues, roomId: string, message: string, - user: IMessage['u'], + user: Pick, readReceiptsEnabled?: boolean, extraData?: Record, ): Promise>;