refactor(models): Use Messages Raw model (5/N) (#28590)

pull/28510/head
Diego Sampaio 3 years ago committed by GitHub
parent 4dfe07136c
commit a791efa0fc
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
  1. 2
      apps/meteor/app/api/server/v1/rooms.ts
  2. 30
      apps/meteor/app/autotranslate/server/autotranslate.ts
  3. 7
      apps/meteor/app/channel-settings/server/functions/saveRoomName.js
  4. 18
      apps/meteor/app/channel-settings/server/functions/saveRoomReadOnly.js
  5. 30
      apps/meteor/app/channel-settings/server/functions/saveRoomReadOnly.ts
  6. 12
      apps/meteor/app/channel-settings/server/methods/saveRoomSettings.ts
  7. 2
      apps/meteor/app/livechat/server/api/v1/videoCall.ts
  8. 49
      apps/meteor/app/models/server/models/Messages.js
  9. 13
      apps/meteor/app/models/server/models/Rooms.js
  10. 18
      apps/meteor/app/reactions/server/setReaction.ts
  11. 14
      apps/meteor/app/slackbridge/server/SlackAdapter.js
  12. 2
      apps/meteor/server/lib/dataExport/exportRoomMessagesToFile.ts
  13. 18
      apps/meteor/server/lib/dataExport/sendViaEmail.ts
  14. 55
      apps/meteor/server/models/raw/Messages.ts
  15. 10
      apps/meteor/server/services/federation/infrastructure/rocket-chat/adapters/Room.ts
  16. 2
      packages/core-typings/src/IMessage/IMessage.ts
  17. 22
      packages/model-typings/src/models/IMessagesModel.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[]) || [],

@ -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<IMessage | undefined> {
return TranslationProviderRegistry.enabled
? TranslationProviderRegistry.getActiveProvider()?.translateMessage(message, room, targetLanguage)
: undefined;
static async translateMessage(message: IMessage, room: IRoom, targetLanguage?: string): Promise<IMessage | null> {
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<IMessage> {
async translateMessage(message: IMessage, room: IRoom, targetLanguage?: string): Promise<IMessage | null> {
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);
}
}
}

@ -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;

@ -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;
};

@ -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<Pick<IUser, '_id' | 'username' | 'name'>>,
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;
}

@ -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<Pick<IUser, 'username' | 'name'>>;
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<TRoomSetting extends keyof RoomSettings>(
setting: TRoomSetting,
params: {
userId: IUser['_id'];
user: IUser;
user: IUser & Required<Pick<IUser, 'username' | 'name'>>;
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<Pick<IUser, 'username' | 'name'>>) | null;
if (!user) {
throw new Meteor.Error('error-invalid-user', 'Invalid user', {
method: 'saveRoomSettings',

@ -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'),

@ -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,

@ -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: {

@ -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<ServerMethods>({
}
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, {

@ -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);
}

@ -69,7 +69,7 @@ const getMessageData = (
userData: Pick<IUser, 'username'> | undefined,
usersMap: { userNameTable: Record<string, string> },
): 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,

@ -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 `<p style='margin-bottom: 5px'><b>${

@ -771,20 +771,12 @@ export class MessagesRaw extends BaseRaw<IMessage> implements IMessagesModel {
return this.createWithTypeRoomIdMessageAndUser('room-unarchived', roomId, '', user, readReceiptsEnabled);
}
createRoomSetReadOnlyByRoomIdAndUser(
roomId: string,
user: IMessage['u'],
readReceiptsEnabled?: boolean,
): Promise<Omit<IMessage, '_updatedAt'>> {
return this.createWithTypeRoomIdMessageAndUser('room-set-read-only', roomId, '', user, readReceiptsEnabled);
createRoomSetReadOnlyByRoomIdAndUser(roomId: string, user: IMessage['u'], readReceiptsEnabled: boolean): Promise<IMessage | null> {
return this.createWithTypeRoomIdMessageUserAndUnread('room-set-read-only', roomId, '', user, readReceiptsEnabled);
}
createRoomRemovedReadOnlyByRoomIdAndUser(
roomId: string,
user: IMessage['u'],
readReceiptsEnabled?: boolean,
): Promise<Omit<IMessage, '_updatedAt'>> {
return this.createWithTypeRoomIdMessageAndUser('room-removed-read-only', roomId, '', user, readReceiptsEnabled);
createRoomRemovedReadOnlyByRoomIdAndUser(roomId: string, user: IMessage['u'], readReceiptsEnabled: boolean): Promise<IMessage | null> {
return this.createWithTypeRoomIdMessageUserAndUnread('room-removed-read-only', roomId, '', user, readReceiptsEnabled);
}
createRoomAllowedReactingByRoomIdAndUser(
@ -844,10 +836,10 @@ export class MessagesRaw extends BaseRaw<IMessage> implements IMessagesModel {
roomId: string,
roomName: string,
user: IMessage['u'],
readReceiptsEnabled?: boolean,
readReceiptsEnabled: boolean,
extraData: Record<string, any> = {},
): Promise<Omit<IMessage, '_updatedAt'>> {
return this.createWithTypeRoomIdMessageAndUser('r', roomId, roomName, user, readReceiptsEnabled, extraData);
): Promise<IMessage | null> {
return this.createWithTypeRoomIdMessageUserAndUnread('r', roomId, roomName, user, readReceiptsEnabled, extraData);
}
addTranslations(messageId: string, translations: Record<string, string>, providerName: string): Promise<UpdateResult> {
@ -1418,7 +1410,7 @@ export class MessagesRaw extends BaseRaw<IMessage> implements IMessagesModel {
type: MessageTypesValues,
roomId: string,
message: string,
user: IMessage['u'],
user: Pick<IMessage['u'], '_id' | 'username'>,
readReceiptsEnabled?: boolean,
extraData?: Record<string, string>,
): Promise<Omit<IMessage, '_updatedAt'>> {
@ -1430,7 +1422,6 @@ export class MessagesRaw extends BaseRaw<IMessage> 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<IMessage> 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<IMessage['u'], '_id' | 'username'>,
unread: boolean,
extraData?: Record<string, string>,
): Promise<IMessage | null> {
const record: Omit<IMessage, '_id' | '_updatedAt'> = {
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,

@ -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<IUser>, // TODO fix type
);
}

@ -132,7 +132,7 @@ export interface IMessage extends IRocketChatRecord {
groupable?: false;
channels?: Pick<IRoom, '_id' | 'name'>[];
u: Required<Pick<IUser, '_id' | 'username' | 'name'>>;
u: Required<Pick<IUser, '_id' | 'username'>> & Pick<IUser, 'name'>;
blocks?: MessageSurfaceLayout;
alias?: string;
md?: Root;

@ -128,16 +128,16 @@ export interface IMessagesModel extends IBaseModel<IMessage> {
user: IMessage['u'],
readReceiptsEnabled?: boolean,
): Promise<Omit<IMessage, '_updatedAt'>>;
createRoomSetReadOnlyByRoomIdAndUser(
roomId: string,
user: IMessage['u'],
readReceiptsEnabled?: boolean,
): Promise<Omit<IMessage, '_updatedAt'>>;
createRoomRemovedReadOnlyByRoomIdAndUser(
createRoomSetReadOnlyByRoomIdAndUser(roomId: string, user: IMessage['u'], readReceiptsEnabled?: boolean): Promise<IMessage | null>;
createRoomRemovedReadOnlyByRoomIdAndUser(roomId: string, user: IMessage['u'], readReceiptsEnabled?: boolean): Promise<IMessage | null>;
createWithTypeRoomIdMessageUserAndUnread(
type: MessageTypesValues,
roomId: string,
user: IMessage['u'],
readReceiptsEnabled?: boolean,
): Promise<Omit<IMessage, '_updatedAt'>>;
message: string,
user: Pick<IMessage['u'], '_id' | 'username'>,
unread: boolean,
extraData?: Record<string, string>,
): Promise<IMessage | null>;
createRoomAllowedReactingByRoomIdAndUser(
roomId: string,
user: IMessage['u'],
@ -165,7 +165,7 @@ export interface IMessagesModel extends IBaseModel<IMessage> {
user: IMessage['u'],
readReceiptsEnabled?: boolean,
extraData?: Record<string, any>,
): Promise<Omit<IMessage, '_updatedAt'>>;
): Promise<IMessage | null>;
addTranslations(messageId: string, translations: Record<string, string>, providerName: string): Promise<UpdateResult>;
addAttachmentTranslations(messageId: string, attachmentIndex: string, translations: Record<string, string>): Promise<UpdateResult>;
setImportFileRocketChatAttachment(
@ -259,7 +259,7 @@ export interface IMessagesModel extends IBaseModel<IMessage> {
type: MessageTypesValues,
roomId: string,
message: string,
user: IMessage['u'],
user: Pick<IMessage['u'], '_id' | 'username'>,
readReceiptsEnabled?: boolean,
extraData?: Record<string, string>,
): Promise<Omit<IMessage, '_updatedAt'>>;

Loading…
Cancel
Save