|
@ -15,6 +15,7 @@ let MessageRepo = require('../../repository/mysql/message.repo');
|
|
|
let ParticipantRepo = require('../../repository/mysql/participant.repo');
|
|
|
let ImDb = require('../../repository/mysql/db/im.db');
|
|
|
let WlyySDK = require("../../util/wlyy.sdk");
|
|
|
let ObjectUtil = require("../../util/object.util.js");
|
|
|
|
|
|
let WechatClient = require("../client/wechat.client.js");
|
|
|
let AppClient = require("../client/app.client.js");
|
|
@ -440,6 +441,137 @@ class Sessions extends RedisModel {
|
|
|
let userRoles = res[5];
|
|
|
let participantsTime = [];
|
|
|
let isInvite = true;
|
|
|
|
|
|
//处理session未加入redis的bug
|
|
|
if(session==null){
|
|
|
let lastLoginTime = new Date();
|
|
|
SessionRepo.findOne(sessionId, function (err, res) {
|
|
|
if(res){
|
|
|
session = res;
|
|
|
let redisSession = [
|
|
|
"id", session.id,
|
|
|
"name", session.name,
|
|
|
"type", session.type,
|
|
|
"business_type", session.business_type,
|
|
|
"last_sender_id", session.last_sender_id||"",
|
|
|
"last_sender_name", session.last_sender_name||"",
|
|
|
"last_content_type", session.last_content_type||"",
|
|
|
"last_content", session.last_content||"",
|
|
|
"last_message_time", session.last_message_time||"",
|
|
|
"create_date", ObjectUtil.timestampToLong(session.create_date),
|
|
|
"status",session.status==null?0:session.status
|
|
|
];
|
|
|
// cache sessions
|
|
|
redis.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.findAll(sessionId, function (err, participants) {
|
|
|
if (err) {
|
|
|
ModelUtil.emitError(self.eventEmitter, err.message);
|
|
|
return;
|
|
|
}
|
|
|
|
|
|
let multi = redis.multi();
|
|
|
participants.forEach(function (participant) {
|
|
|
let participantId = participant.id;
|
|
|
let participantRole = participant.role;
|
|
|
let score = ObjectUtil.timestampToLong(participant.last_fetch_time||(new Date()));
|
|
|
|
|
|
multi = multi.zadd(sessionParticipantsKey, score, participantId)
|
|
|
.hset(sessionParticipantsRoleKey, participantId, participantRole);
|
|
|
});
|
|
|
|
|
|
multi.execAsync()
|
|
|
.then(function (res) {
|
|
|
})
|
|
|
.catch(function (ex) {
|
|
|
log.error("Login failed while caching participants: ", ex);
|
|
|
});
|
|
|
});
|
|
|
|
|
|
// 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, null, function (err, messages) {
|
|
|
if (err) {
|
|
|
ModelUtil.emitError(self.eventEmitter, err.message);
|
|
|
return;
|
|
|
}
|
|
|
|
|
|
let multi = redis.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) {
|
|
|
})
|
|
|
.catch(function (ex) {
|
|
|
log.error("Login failed while caching messages: ", ex);
|
|
|
});
|
|
|
});
|
|
|
|
|
|
// 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 == null ? "" : topic.name;
|
|
|
let createTime = ObjectUtil.timestampToLong(topic.create_time);
|
|
|
let endBy = topic.end_by == null ? "" : topic.end_by;
|
|
|
let endTime = topic.end_time == null ? 0 : ObjectUtil.timestampToLong(topic.end_time);
|
|
|
let startMessageId = topic.start_message_id == null ? "" : topic.start_message_id;
|
|
|
let endMessageId = topic.end_message_id == null ? "" : topic.end_message_id;
|
|
|
let description = topic.description == null ? "" : topic.description;
|
|
|
let status = topic.status == null ? 0 : topic.status;
|
|
|
redisConn.multi()
|
|
|
.zadd(topicsKey, createTime, 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()
|
|
|
.catch(function (ex) {
|
|
|
log.error("Login failed while caching topics: ", ex);
|
|
|
});
|
|
|
});
|
|
|
});
|
|
|
})
|
|
|
.catch(function (ex) {
|
|
|
log.error("Login failed while caching sessions: ", ex);
|
|
|
});
|
|
|
}
|
|
|
});
|
|
|
}
|
|
|
|
|
|
for(var j in userRoles){
|
|
|
if(userRoles[j]==1){
|
|
|
isInvite = false;
|
|
@ -687,12 +819,46 @@ class Sessions extends RedisModel {
|
|
|
if (!start_msg_id && !end_msg_id) {
|
|
|
redis.zrevrangeAsync(message_timestamp_key, 0, 0).then(function (res) {
|
|
|
if (res.length == 0) {
|
|
|
if (handler) {
|
|
|
handler(null, res);
|
|
|
return;
|
|
|
}
|
|
|
ModelUtil.emitOK(self.eventEmitter, res);
|
|
|
return;
|
|
|
//修复应redis没有缓冲聊天记录导致会话列表加载不出来
|
|
|
// cache messages
|
|
|
let messagesKey = RedisModel.makeRedisKey(REDIS_KEYS.Messages, sessionId);
|
|
|
MessageRepo.findBySessionId(sessionId, 0, config.sessionConfig.maxMessageCount, null, function (err, messages) {
|
|
|
if (err) {
|
|
|
ModelUtil.emitError(self.eventEmitter, err.message);
|
|
|
return;
|
|
|
}
|
|
|
|
|
|
let multi = redis.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(message_timestamp_key, ObjectUtil.timestampToLong(message.timestamp), message.id);
|
|
|
});
|
|
|
|
|
|
multi.execAsync()
|
|
|
.then(function (res) {
|
|
|
})
|
|
|
.catch(function (ex) {
|
|
|
log.error("Login failed while caching messages: ", ex);
|
|
|
ModelUtil.emitOK(self.eventEmitter, res);
|
|
|
return;
|
|
|
});
|
|
|
});
|
|
|
|
|
|
// if (handler) {
|
|
|
// handler(null, res);
|
|
|
// return;
|
|
|
// }
|
|
|
// ModelUtil.emitOK(self.eventEmitter, res);
|
|
|
// return;
|
|
|
}
|
|
|
start_msg_id = res[0];
|
|
|
redis.zrangeAsync(message_timestamp_key, 0, 0).then(function (res) {
|