The communications platform that puts data protection first.
You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
 
 
 
 
 
Rocket.Chat/app/lib/server/functions/deleteMessage.ts

75 lines
2.5 KiB

import { Meteor } from 'meteor/meteor';
import { FileUpload } from '../../../file-upload/server';
import { settings } from '../../../settings/server';
import { Messages, Rooms } from '../../../models/server';
import { Uploads } from '../../../models/server/raw';
import { Notifications } from '../../../notifications/server';
import { callbacks } from '../../../../lib/callbacks';
import { Apps } from '../../../apps/server';
import { IMessage } from '../../../../definition/IMessage';
import { IUser } from '../../../../definition/IUser';
export const deleteMessage = async function (message: IMessage, user: IUser): Promise<void> {
const deletedMsg = Messages.findOneById(message._id);
const isThread = deletedMsg.tcount > 0;
const keepHistory = settings.get('Message_KeepHistory') || isThread;
const showDeletedStatus = settings.get('Message_ShowDeletedStatus') || isThread;
const bridges = Apps?.isLoaded() && Apps.getBridges();
if (deletedMsg && bridges) {
const prevent = Promise.await(bridges.getListenerBridge().messageEvent('IPreMessageDeletePrevent', deletedMsg));
if (prevent) {
throw new Meteor.Error('error-app-prevented-deleting', 'A Rocket.Chat App prevented the message deleting.');
}
}
if (deletedMsg.tmid) {
Messages.decreaseReplyCountById(deletedMsg.tmid, -1);
}
const files = (message.files || [message.file]).filter(Boolean); // Keep compatibility with old messages
if (keepHistory) {
if (showDeletedStatus) {
Messages.cloneAndSaveAsHistoryById(message._id, user);
} else {
Messages.setHiddenById(message._id, true);
}
for await (const file of files) {
file?._id && (await Uploads.update({ _id: file._id }, { $set: { _hidden: true } }));
}
} else {
if (!showDeletedStatus) {
Messages.removeById(message._id);
}
files.forEach((file) => {
file?._id && FileUpload.getStore('Uploads').deleteById(file._id);
});
}
const room = Rooms.findOneById(message.rid, { fields: { lastMessage: 1, prid: 1, mid: 1 } });
callbacks.run('afterDeleteMessage', deletedMsg, room);
// update last message
if (settings.get('Store_Last_Message')) {
if (!room.lastMessage || room.lastMessage._id === message._id) {
Rooms.resetLastMessageById(message.rid, message._id);
}
}
// decrease message count
Rooms.decreaseMessageCountById(message.rid, 1);
if (showDeletedStatus) {
Messages.setAsDeletedByIdAndUser(message._id, user);
} else {
Notifications.notifyRoom(message.rid, 'deleteMessage', { _id: message._id });
}
if (bridges) {
bridges.getListenerBridge().messageEvent('IPostMessageDeleted', deletedMsg);
}
};