/
updateMessage.ts
99 lines (84 loc) · 2.65 KB
/
updateMessage.ts
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
import type { IEditedMessage } from '@rocket.chat/core-typings';
import { Meteor } from 'meteor/meteor';
import { Tracker } from 'meteor/tracker';
import moment from 'moment';
import _ from 'underscore';
import { hasAtLeastOnePermission, hasPermission } from '../../app/authorization/client';
import { ChatMessage } from '../../app/models/client';
import { settings } from '../../app/settings/client';
import { t } from '../../app/utils/client';
import { callbacks } from '../../lib/callbacks';
import { dispatchToastMessage } from '../lib/toast';
Meteor.methods({
updateMessage(message) {
const uid = Meteor.userId();
if (!uid) {
return false;
}
const originalMessage = ChatMessage.findOne(message._id);
if (!originalMessage) {
return;
}
const canEditMessage = hasAtLeastOnePermission('edit-message', message.rid);
const editAllowed = settings.get('Message_AllowEditing');
let editOwn = false;
const msgText = originalMessage?.attachments?.[0]?.description ?? originalMessage.msg;
if (msgText === message.msg) {
return;
}
if (originalMessage?.u?._id) {
editOwn = originalMessage.u._id === uid;
}
const me = Meteor.users.findOne(uid);
if (!me) {
return false;
}
if (!(canEditMessage || (editAllowed && editOwn))) {
dispatchToastMessage({
type: 'error',
message: t('error-action-not-allowed', { action: t('Message_editing') }),
});
return false;
}
const blockEditInMinutes = settings.get('Message_AllowEditing_BlockEditInMinutes');
const bypassBlockTimeLimit = hasPermission('bypass-time-limit-edit-and-delete');
if (!bypassBlockTimeLimit && _.isNumber(blockEditInMinutes) && blockEditInMinutes !== 0) {
if (originalMessage.ts) {
const msgTs = moment(originalMessage.ts);
if (msgTs) {
const currentTsDiff = moment().diff(msgTs, 'minutes');
if (currentTsDiff > blockEditInMinutes) {
dispatchToastMessage({ type: 'error', message: t('error-message-editing-blocked') });
return false;
}
}
}
}
Tracker.nonreactive(() => {
message.editedAt = new Date(Date.now());
message.editedBy = {
_id: uid,
username: me.username,
};
message = callbacks.run('beforeSaveMessage', message);
const messageObject: Partial<IEditedMessage> = {
editedAt: message.editedAt,
editedBy: message.editedBy,
msg: message.msg,
};
if (originalMessage.attachments) {
if (originalMessage.attachments[0].description !== undefined) {
delete messageObject.msg;
originalMessage.attachments[0].description = message.msg;
}
}
ChatMessage.update(
{
'_id': message._id,
'u._id': uid,
},
{ $set: messageObject },
);
});
},
});