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/client/methods/updateMessage.js

80 lines
2.0 KiB

import moment from 'moment';
import toastr from 'toastr';
Meteor.methods({
updateMessage(message) {
if (!Meteor.userId()) {
return false;
}
const originalMessage = ChatMessage.findOne(message._id);
const hasPermission = RocketChat.authz.hasAtLeastOnePermission('edit-message', message.rid);
const editAllowed = RocketChat.settings.get('Message_AllowEditing');
let editOwn = false;
if (originalMessage && originalMessage.u && originalMessage.u._id) {
editOwn = originalMessage.u._id === Meteor.userId();
}
const me = Meteor.users.findOne(Meteor.userId());
if (!(hasPermission || (editAllowed && editOwn))) {
toastr.error(t('error-action-not-allowed', { action: t('Message_editing') }));
return false;
}
const blockEditInMinutes = RocketChat.settings.get('Message_AllowEditing_BlockEditInMinutes');
if (_.isNumber(blockEditInMinutes) && blockEditInMinutes !== 0) {
if (originalMessage.ts) {
const msgTs = moment(originalMessage.ts);
if (msgTs) {
const currentTsDiff = moment().diff(msgTs, 'minutes');
if (currentTsDiff > blockEditInMinutes) {
toastr.error(t('error-message-editing-blocked'));
return false;
}
}
}
}
Tracker.nonreactive(function() {
if (isNaN(TimeSync.serverOffset())) {
message.editedAt = new Date();
} else {
message.editedAt = new Date(Date.now() + TimeSync.serverOffset());
}
message.editedBy = {
_id: Meteor.userId(),
username: me.username
};
message = RocketChat.callbacks.run('beforeSaveMessage', message);
if (originalMessage.attachments[0].description) {
ChatMessage.update({
_id: message._id,
'u._id': Meteor.userId()
}, {
$set: {
'editedAt': message.editedAt,
'editedBy': message.editedBy
}
});
} else {
ChatMessage.update({
_id: message._id,
'u._id': Meteor.userId()
}, {
$set: {
'editedAt': message.editedAt,
'editedBy': message.editedBy,
msg: message.msg
}
});
}
});
}
});