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

77 lines
2.2 KiB

import { Meteor } from 'meteor/meteor';
import { Tracker } from 'meteor/tracker';
import { TimeSync } from 'meteor/mizzao:timesync';
import { t } from 'meteor/rocketchat:utils';
Convert rocketchat:ui to main module structure (#13132) * Move rocketchat settings to specific package * WIP: Move models from rocketchat-lib to a specific package (server) * Move function from rocketchat:lib to rocketchat:utils to use it in rocketchat:models * Move client models from rocketchat:lib to rocketchat:models * Fix lint * Move rocketchat.info from lib to utils * Remove directly dependency between lib and migrations * Move statistics Model to rocketchat:models * Create rocketchat:metrics to be able to depacking rocketchat callbacks * Move callbacks to specific package * Remove unused dependency * Move rocketchat-notifications to a specific package * Move rocketchat-promises to a specific package * remove directly dependency from metrics and models * Move CachedCollection from lib to models * Move ui models/collections from ui to models * Move authorization client/ui models to rocketchat:models to be able to remove lib dependency * Creation of rocketchat:ui-utils to help decouple rocketchat:lib and rocketchat:authz * Move some common functions to rocketchat:utils * Change imports to dynamic imports to avoid directly dependency between some packages * Move authz models to rocketchat:models * Remove directly dependency between rocketchat:authz and rocketchat:lib * Move some functions from rocketchat:lib to rocketchat:utils * Add functions to settings package * Convert rocketchat:file-upload to main module structure * Import FileUpload where it is being used * Remove FileUpload and fileUploadHandler from globals eslintrc * Move some functions to rocketchat:ui-utils * Remove directly dependency between rocketchat:authorization and rocketchat:ui-utils * Remove dependency between lazy-load and lib * Change imports of renderMessageBody from ui-message to ui-utils * Add import of main ready from ui-utils * Convert rocketchat-ui-sidenav to main module structure * Add imports of toolbarSearch from ui-sidenav * Remove toolbarSearch from eslintrc globals * Move CachedCollection to a specific package * Change imports of CachedCollection to new package * Move some functions to rocketchat:ui-utils * Remove directly dependency between tooltip and lib * Remove directly dependency between settings and metrics * Move some settings client function from lib to settings * Convert rocketchat-ui-master to main module structure * Remove directly dependency between rocketchat:e2e and rocketchat:lib * Fix wrong import and lint * Convert rocketchat-webrtc to main module structure * Fix missing export * Remove directly dependency between rocketchat:emoji and lib * Add emoji dependencies inside RocketChat namespace * Merge branch 'develop' into globals/move-rocketchat-callbacks * Move some functions to utils * Fix lint * Move some ui functions to ui-utils * Fix import missed objects inside RocketChat namespace * Fix lint * Remove rocketchat:ui package dependency of RocketChat namespace * Remove lib dependency in rocketchat:ui-sidenav * Remove dependency between lib and ui-vrecord * Add logger dependency in file-upload * Convert rocketchat:ui to main module structure * import variables that was broken due to conversion of rocketchat:ui * Remove globals variables from eslintrc and add some to the eslintrc of livechat app * Revert commented test file * Add missed files * Fix lint
7 years ago
import { ChatMessage } from 'meteor/rocketchat:models';
import _ from 'underscore';
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.msg === message.msg) {
return;
}
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);
const messageObject = { editedAt: message.editedAt, editedBy: message.editedBy, msg: message.msg };
if (originalMessage.attachments) {
if (originalMessage.attachments[0].description !== undefined) {
delete messageObject.$set.msg;
}
}
ChatMessage.update({
_id: message._id,
'u._id': Meteor.userId(),
}, { $set : messageObject });
});
},
});