-
Notifications
You must be signed in to change notification settings - Fork 10k
/
getChannelHistory.js
81 lines (68 loc) · 2.37 KB
/
getChannelHistory.js
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
Meteor.methods({
getChannelHistory({rid, latest, oldest, inclusive, count = 20, unreads}) {
check(rid, String);
if (!Meteor.userId()) {
throw new Meteor.Error('error-invalid-user', 'Invalid user', { method: 'getChannelHistory' });
}
const fromUserId = Meteor.userId();
const room = Meteor.call('canAccessRoom', rid, fromUserId);
if (!room) {
return false;
}
//Make sure they can access the room
if (room.t === 'c' && !RocketChat.authz.hasPermission(fromUserId, 'preview-c-room') && room.usernames.indexOf(room.username) === -1) {
return false;
}
//Ensure latest is always defined.
if (_.isUndefined(latest)) {
latest = new Date();
}
//Verify oldest is a date if it exists
if (!_.isUndefined(oldest) && !_.isDate(oldest)) {
throw new Meteor.Error('error-invalid-date', 'Invalid date', { method: 'getChannelHistory' });
}
const options = {
sort: {
ts: -1
},
limit: count
};
if (!RocketChat.settings.get('Message_ShowEditedStatus')) {
options.fields = { 'editedAt': 0 };
}
let records = [];
if (_.isUndefined(oldest) && inclusive) {
records = RocketChat.models.Messages.findVisibleByRoomIdBeforeTimestampInclusive(rid, latest, options).fetch();
} else if (_.isUndefined(oldest) && !inclusive) {
records = RocketChat.models.Messages.findVisibleByRoomIdBeforeTimestamp(rid, latest, options).fetch();
} else if (!_.isUndefined(oldest) && inclusive) {
records = RocketChat.models.Messages.findVisibleByRoomIdBetweenTimestampsInclusive(rid, oldest, latest, options).fetch();
} else {
records = RocketChat.models.Messages.findVisibleByRoomIdBetweenTimestamps(rid, oldest, latest, options).fetch();
}
const messages = _.map(records, (message) => {
message.starred = _.findWhere(message.starred, { _id: fromUserId });
return message;
});
if (unreads) {
let unreadNotLoaded = 0;
let firstUnread = undefined;
if (!_.isUndefined(oldest)) {
const firstMsg = messages[messages.length - 1];
if (!_.isUndefined(firstMsg) && firstMsg.ts > oldest) {
const unreadMessages = RocketChat.models.Messages.findVisibleByRoomIdBetweenTimestamps(rid, oldest, firstMsg.ts, { limit: 1, sort: { ts: 1 } });
firstUnread = unreadMessages.fetch()[0];
unreadNotLoaded = unreadMessages.count();
}
}
return {
messages,
firstUnread,
unreadNotLoaded
};
}
return {
messages
};
}
});