|
@ -204,118 +204,125 @@ class Users extends RedisModel {
|
|
// cache sessions, participants, topics, messages
|
|
// cache sessions, participants, topics, messages
|
|
function (callback) {
|
|
function (callback) {
|
|
SessionRepo.findAll(userId, function (err, sessions) {
|
|
SessionRepo.findAll(userId, function (err, sessions) {
|
|
if(err){
|
|
|
|
|
|
if (err) {
|
|
ModelUtil.emitError(self.eventEmitter, err.message);
|
|
ModelUtil.emitError(self.eventEmitter, err.message);
|
|
return;
|
|
return;
|
|
}
|
|
}
|
|
|
|
|
|
sessions.forEach(function (session) {
|
|
sessions.forEach(function (session) {
|
|
let redisSession = [
|
|
|
|
"id", session.id,
|
|
|
|
"name", session.name,
|
|
|
|
"type", session.type,
|
|
|
|
"last_sender_id", session.last_sender_id == null ? "" : session.last_sender_id,
|
|
|
|
"last_sender_name", session.last_sender_name == null ? "" : session.last_sender_name,
|
|
|
|
"last_content_type", session.last_content_type == null ? "" : session.last_content_type,
|
|
|
|
"last_content", session.last_content == null ? "" : session.last_content,
|
|
|
|
"last_message_time", session.last_message_time == null ? "" : session.last_message_time,
|
|
|
|
"createDate", ObjectUtil.timestampToLong(session.create_date),
|
|
|
|
];
|
|
|
|
(function (sessionId, userId) {
|
|
|
|
// cache sessions
|
|
|
|
redisConn.multi()
|
|
|
|
.zadd(REDIS_KEYS.Sessions, lastLoginTime.getTime(), sessionId) // 会话的最后活动时间设置为此用户的登录时间
|
|
|
|
.zadd(RedisModel.makeRedisKey(REDIS_KEYS.UserSessions, userId), lastLoginTime.getTime(), sessionId) // 会话的最后活动时间设置为此用户的登录时间
|
|
|
|
.hmset(RedisModel.makeRedisKey(REDIS_KEYS.Session, sessionId), redisSession)
|
|
|
|
.execAsync()
|
|
|
|
.then(function (res) {
|
|
|
|
// cache participants
|
|
|
|
let sessionParticipantsKey = RedisModel.makeRedisKey(REDIS_KEYS.SessionParticipants, sessionId);
|
|
|
|
let sessionParticipantsRoleKey = RedisModel.makeRedisKey(REDIS_KEYS.SessionParticipantsRole, sessionId);
|
|
|
|
ParticipantRepo.findParticipants(sessionId, function (err, participants) {
|
|
|
|
if (err) {
|
|
|
|
ModelUtil.emitError(self.eventEmitter, err.message);
|
|
|
|
return;
|
|
|
|
}
|
|
|
|
|
|
|
|
participants.forEach(function (participant) {
|
|
|
|
let participantId = participant.participant_id;
|
|
|
|
let participantRole = participant.participant_role;
|
|
|
|
let score = ObjectUtil.timestampToLong(participant.last_fetch_time);
|
|
|
|
|
|
|
|
redisConn.multi()
|
|
|
|
.zadd(sessionParticipantsKey, score, participantId)
|
|
|
|
.hset(sessionParticipantsRoleKey, participantRole, participantId)
|
|
|
|
.execAsync().then(function (res) {
|
|
|
|
|
|
redisConn.zscore(REDIS_KEYS.Sessions, session.id, function (err, res) {
|
|
|
|
// 已经缓存过的会话不再缓存
|
|
|
|
if(res != null) return;
|
|
|
|
|
|
|
|
(function (sessionId, userId) {
|
|
|
|
let redisSession = [
|
|
|
|
"id", session.id,
|
|
|
|
"name", session.name,
|
|
|
|
"type", session.type,
|
|
|
|
"last_sender_id", session.last_sender_id == null ? "" : session.last_sender_id,
|
|
|
|
"last_sender_name", session.last_sender_name == null ? "" : session.last_sender_name,
|
|
|
|
"last_content_type", session.last_content_type == null ? "" : session.last_content_type,
|
|
|
|
"last_content", session.last_content == null ? "" : session.last_content,
|
|
|
|
"last_message_time", session.last_message_time == null ? "" : session.last_message_time,
|
|
|
|
"create_date", ObjectUtil.timestampToLong(session.create_date),
|
|
|
|
];
|
|
|
|
|
|
|
|
// cache sessions
|
|
|
|
redisConn.multi()
|
|
|
|
.zadd(REDIS_KEYS.Sessions, lastLoginTime.getTime(), sessionId) // 会话的最后活动时间设置为此用户的登录时间
|
|
|
|
.zadd(RedisModel.makeRedisKey(REDIS_KEYS.UserSessions, userId), lastLoginTime.getTime(), sessionId) // 会话的最后活动时间设置为此用户的登录时间
|
|
|
|
.hmset(RedisModel.makeRedisKey(REDIS_KEYS.Session, sessionId), redisSession)
|
|
|
|
.execAsync()
|
|
|
|
.then(function (res) {
|
|
|
|
// cache participants
|
|
|
|
let sessionParticipantsKey = RedisModel.makeRedisKey(REDIS_KEYS.SessionParticipants, sessionId);
|
|
|
|
let sessionParticipantsRoleKey = RedisModel.makeRedisKey(REDIS_KEYS.SessionParticipantsRole, sessionId);
|
|
|
|
ParticipantRepo.findParticipants(sessionId, function (err, participants) {
|
|
|
|
if (err) {
|
|
|
|
ModelUtil.emitError(self.eventEmitter, err.message);
|
|
|
|
return;
|
|
|
|
}
|
|
|
|
|
|
|
|
let multi = redisConn.multi();
|
|
|
|
participants.forEach(function (participant) {
|
|
|
|
let participantId = participant.participant_id;
|
|
|
|
let participantRole = participant.participant_role;
|
|
|
|
let score = ObjectUtil.timestampToLong(participant.last_fetch_time);
|
|
|
|
|
|
|
|
multi = multi.zadd(sessionParticipantsKey, score, participantId)
|
|
|
|
.hset(sessionParticipantsRoleKey, participantId, participantRole);
|
|
|
|
});
|
|
|
|
|
|
|
|
multi.execAsync().then(function (res) {
|
|
});
|
|
});
|
|
});
|
|
});
|
|
});
|
|
|
|
|
|
|
|
// cache messages
|
|
|
|
let messagesKey = RedisModel.makeRedisKey(REDIS_KEYS.Messages, sessionId);
|
|
|
|
let messagesByTimestampKey = RedisModel.makeRedisKey(REDIS_KEYS.MessagesByTimestamp, sessionId);
|
|
|
|
MessageRepo.findBySessionId(sessionId, 0, config.sessionConfig.maxMessageCount, function (err, messages) {
|
|
|
|
if (err) {
|
|
|
|
ModelUtil.emitError(self.eventEmitter, err.message);
|
|
|
|
return;
|
|
|
|
}
|
|
|
|
|
|
|
|
messages.forEach(function (message) {
|
|
|
|
let msgJson = {
|
|
|
|
id: message.id,
|
|
|
|
sender_id: message.sender_id,
|
|
|
|
sender_name: message.sender_name,
|
|
|
|
timestamp: ObjectUtil.timestampToLong(message.timestamp),
|
|
|
|
content_type: message.content_type,
|
|
|
|
content: message.content
|
|
|
|
};
|
|
|
|
|
|
|
|
redisConn.multi()
|
|
|
|
.hset(messagesKey, message.id, JSON.stringify(msgJson))
|
|
|
|
.zadd(messagesByTimestampKey, ObjectUtil.timestampToLong(message.timestamp), message.id)
|
|
|
|
.execAsync()
|
|
|
|
.then(function (res) {
|
|
|
|
});
|
|
|
|
|
|
// cache messages
|
|
|
|
let messagesKey = RedisModel.makeRedisKey(REDIS_KEYS.Messages, sessionId);
|
|
|
|
let messagesByTimestampKey = RedisModel.makeRedisKey(REDIS_KEYS.MessagesByTimestamp, sessionId);
|
|
|
|
MessageRepo.findBySessionId(sessionId, 0, config.sessionConfig.maxMessageCount, function (err, messages) {
|
|
|
|
if (err) {
|
|
|
|
ModelUtil.emitError(self.eventEmitter, err.message);
|
|
|
|
return;
|
|
|
|
}
|
|
|
|
|
|
|
|
let multi = redisConn.multi();
|
|
|
|
messages.forEach(function (message) {
|
|
|
|
let msgJson = {
|
|
|
|
id: message.id,
|
|
|
|
sender_id: message.sender_id,
|
|
|
|
sender_name: message.sender_name,
|
|
|
|
timestamp: ObjectUtil.timestampToLong(message.timestamp),
|
|
|
|
content_type: message.content_type,
|
|
|
|
content: message.content
|
|
|
|
};
|
|
|
|
|
|
|
|
multi = multi.hset(messagesKey, message.id, JSON.stringify(msgJson))
|
|
|
|
.zadd(messagesByTimestampKey, ObjectUtil.timestampToLong(message.timestamp), message.id);
|
|
|
|
});
|
|
|
|
|
|
|
|
multi.execAsync().then(function (res) {
|
|
|
|
});
|
|
});
|
|
});
|
|
});
|
|
|
|
|
|
|
|
// cache topics for MUC
|
|
|
|
let topicsKey = RedisModel.makeRedisKey(REDIS_KEYS.Topics, sessionId);
|
|
|
|
TopicRepo.findAllBySessionId(sessionId, function (err, topics) {
|
|
|
|
if (err) {
|
|
|
|
ModelUtil.emitError(self.eventEmitter, err.message);
|
|
|
|
return;
|
|
|
|
}
|
|
|
|
|
|
|
|
topics.forEach(function (topic) {
|
|
|
|
let topicKey = RedisModel.makeRedisKey(REDIS_KEYS.Topic, topic.id);
|
|
|
|
let topicId = topic.id;
|
|
|
|
let name = topic.name;
|
|
|
|
let createTime = ObjectUtil.timestampToLong(topic.create_time);
|
|
|
|
let endBy = topic.end_by;
|
|
|
|
let endTime = ObjectUtil.timestampToLong(topic.end_time);
|
|
|
|
let startMessageId = topic.start_message_id;
|
|
|
|
let endMessageId = topic.end_message_id;
|
|
|
|
let description = topic.description;
|
|
|
|
let status = topic.status;
|
|
|
|
redisConn.multi()
|
|
|
|
.zadd(topicsKey, topicId)
|
|
|
|
.hmset(topicKey,
|
|
|
|
'name', name,
|
|
|
|
'session_id', sessionId,
|
|
|
|
'create_time', createTime,
|
|
|
|
'end_by', endBy,
|
|
|
|
'end_time', endTime,
|
|
|
|
'start_message_id', startMessageId,
|
|
|
|
'end_message_id', endMessageId,
|
|
|
|
'description', description,
|
|
|
|
'status', status)
|
|
|
|
.execAsync().then(function (res) {
|
|
|
|
|
|
// cache topics for MUC
|
|
|
|
let topicsKey = RedisModel.makeRedisKey(REDIS_KEYS.Topics, sessionId);
|
|
|
|
TopicRepo.findAllBySessionId(sessionId, function (err, topics) {
|
|
|
|
if (err) {
|
|
|
|
ModelUtil.emitError(self.eventEmitter, err.message);
|
|
|
|
return;
|
|
|
|
}
|
|
|
|
|
|
|
|
topics.forEach(function (topic) {
|
|
|
|
let topicKey = RedisModel.makeRedisKey(REDIS_KEYS.Topic, topic.id);
|
|
|
|
let topicId = topic.id;
|
|
|
|
let name = topic.name;
|
|
|
|
let createTime = ObjectUtil.timestampToLong(topic.create_time);
|
|
|
|
let endBy = topic.end_by;
|
|
|
|
let endTime = ObjectUtil.timestampToLong(topic.end_time);
|
|
|
|
let startMessageId = topic.start_message_id;
|
|
|
|
let endMessageId = topic.end_message_id;
|
|
|
|
let description = topic.description;
|
|
|
|
let status = topic.status;
|
|
|
|
redisConn.multi()
|
|
|
|
.zadd(topicsKey, topicId)
|
|
|
|
.hmset(topicKey,
|
|
|
|
'name', name,
|
|
|
|
'session_id', sessionId,
|
|
|
|
'create_time', createTime,
|
|
|
|
'end_by', endBy,
|
|
|
|
'end_time', endTime,
|
|
|
|
'start_message_id', startMessageId,
|
|
|
|
'end_message_id', endMessageId,
|
|
|
|
'description', description,
|
|
|
|
'status', status)
|
|
|
|
.execAsync().then(function (res) {
|
|
|
|
});
|
|
});
|
|
});
|
|
});
|
|
});
|
|
});
|
|
});
|
|
});
|
|
|
|
})(session.id, userId);
|
|
|
|
|
|
})(session.id, userId);
|
|
|
|
});
|
|
});
|
|
});
|
|
});
|
|
});
|
|
|
|
|