|
@ -79,7 +79,7 @@ class Sessions extends RedisModel {
|
|
|
// 保存会话及成员至MySQL中
|
|
|
self.saveSessionToMysql(sessionId, name, type, createDate, function (err, res) {
|
|
|
Participants.saveParticipantsToMysql(sessionId, participantArray, function (err, res) {
|
|
|
if(err){
|
|
|
if (err) {
|
|
|
ModelUtil.emitError(self.eventEmitter, err.message);
|
|
|
return;
|
|
|
}
|
|
@ -152,86 +152,64 @@ class Sessions extends RedisModel {
|
|
|
size = size + page;
|
|
|
}
|
|
|
|
|
|
// 倒序获取
|
|
|
redis.zrevrangeAsync(userSessionKey, page, size).then(function (res) {
|
|
|
let sessionList = [];
|
|
|
if (res.length == 0) {
|
|
|
ModelUtil.emitOK(self.eventEmitter, []);
|
|
|
return;
|
|
|
}
|
|
|
|
|
|
for (let i in res) {
|
|
|
callGetSessions(res[i], i == res.length - 1);
|
|
|
}
|
|
|
|
|
|
function callGetSessions(sessionId, lastOne) {
|
|
|
let sessionKey = RedisModel.makeRedisKey(REDIS_KEYS.Session, sessionId);
|
|
|
redis.hgetallAsync(sessionKey).then(function (session) {
|
|
|
let sessionParticipantsKey = RedisModel.makeRedisKey(REDIS_KEYS.SessionParticipants, sessionId);
|
|
|
|
|
|
// 对比当前用户最后一次此会话消息的时间与会话中最新的消息时间,以此判断未读消息数量
|
|
|
redis.zscoreAsync(sessionParticipantsKey, userId).then(function (lastFetchTime) {
|
|
|
callGetUnreadCount(session, sessionId, lastFetchTime, lastOne);
|
|
|
})
|
|
|
}).catch(function (err) {
|
|
|
throw err;
|
|
|
})
|
|
|
}
|
|
|
async.waterfall([
|
|
|
// 获取会话ID列表
|
|
|
function (callback) {
|
|
|
redis.zrevrangeAsync(userSessionKey, page, size)
|
|
|
.then(function (sessionIds) {
|
|
|
if (sessionIds.length == 0) {
|
|
|
ModelUtil.emitOK(self.eventEmitter, []);
|
|
|
return;
|
|
|
}
|
|
|
|
|
|
/**
|
|
|
* 统计未读消息数。以当前时间为准。
|
|
|
*
|
|
|
* @param session 返回的会话列表
|
|
|
* @param sessionId 当前会话ID
|
|
|
* @param lastFetchTime 当前会话当前用户的最后一次时间搓
|
|
|
* @param lastOne
|
|
|
*/
|
|
|
function callGetUnreadCount(session, sessionId, lastFetchTime, lastOne) {
|
|
|
let messagesByTimestampKey = RedisModel.makeRedisKey(REDIS_KEYS.MessagesByTimestamp, sessionId);
|
|
|
redis.zrangebyscoreAsync(messagesByTimestampKey, lastFetchTime, (new Date().getTime()))
|
|
|
.then(function (messagetimelist) {
|
|
|
session.id = sessionId;
|
|
|
session.unread_count = messagetimelist.length;
|
|
|
|
|
|
callGetMyRole(session, sessionId, lastOne);
|
|
|
callback(null, sessionIds);
|
|
|
})
|
|
|
.catch(function (err) {
|
|
|
throw err;
|
|
|
});
|
|
|
}
|
|
|
|
|
|
/**
|
|
|
* 获取用户在此会话中的角色。
|
|
|
*
|
|
|
* @param session 要返回的JSON
|
|
|
* @param sessionId
|
|
|
* @param lastOne
|
|
|
*/
|
|
|
function callGetMyRole(session, sessionId, lastOne) {
|
|
|
let participantsRoleKey = RedisModel.makeRedisKey(REDIS_KEYS.SessionParticipantsRole, sessionId);
|
|
|
redis.hgetAsync(participantsRoleKey, userId).then(function (role) {
|
|
|
session.my_role = role;
|
|
|
|
|
|
callback(session, lastOne);
|
|
|
})
|
|
|
}
|
|
|
},
|
|
|
// 遍历会话
|
|
|
function (sessionIds, callback) {
|
|
|
let sessionList = [];
|
|
|
sessionIds.forEach(function (sessionId) {
|
|
|
let sessionKey = RedisModel.makeRedisKey(REDIS_KEYS.Session, sessionId);
|
|
|
let participantsRoleKey = RedisModel.makeRedisKey(REDIS_KEYS.SessionParticipantsRole, sessionId);
|
|
|
let sessionParticipantsKey = RedisModel.makeRedisKey(REDIS_KEYS.SessionParticipants, sessionId);
|
|
|
|
|
|
/**
|
|
|
* 列表封装完毕后由此回调返回数据界面
|
|
|
*
|
|
|
* @param session
|
|
|
* @param lastOne
|
|
|
*/
|
|
|
function callback(session, lastOne) {
|
|
|
sessionList.push(session);
|
|
|
|
|
|
if (lastOne) {
|
|
|
ModelUtil.emitOK(self.eventEmitter, sessionList);
|
|
|
}
|
|
|
redis.multi()
|
|
|
.hgetall(sessionKey) // 会话实体
|
|
|
.hget(participantsRoleKey, userId) // 用户在此会话中的角色
|
|
|
.zscore(sessionParticipantsKey, userId) // 用户在此会话中最后一次获取未读消息的时间
|
|
|
.execAsync()
|
|
|
.then(function (res) {
|
|
|
let session = res[0];
|
|
|
let role = res[1];
|
|
|
let lastFetchTime = res[2];
|
|
|
|
|
|
// 计算未读消息数
|
|
|
let messagesByTimestampKey = RedisModel.makeRedisKey(REDIS_KEYS.MessagesByTimestamp, sessionId);
|
|
|
redis.zcountAsync(messagesByTimestampKey, lastFetchTime, new Date().getTime())
|
|
|
.then(function (count) {
|
|
|
sessionList.push({
|
|
|
id: sessionId,
|
|
|
name: session.name,
|
|
|
create_date: session.create_date,
|
|
|
last_content_type: session.last_content_type,
|
|
|
last_content: session.last_content,
|
|
|
sender_id: session.sender_id,
|
|
|
sender_name: session.sender_name,
|
|
|
unread_count: count,
|
|
|
my_role: role
|
|
|
});
|
|
|
|
|
|
if (sessionId === sessionIds[sessionIds.length - 1]) {
|
|
|
ModelUtil.emitOK(self.eventEmitter, sessionList);
|
|
|
}
|
|
|
});
|
|
|
})
|
|
|
.catch(function (err) {
|
|
|
ModelUtil.emitError(self.eventEmitter, "Get sessions failed: " + err);
|
|
|
});
|
|
|
});
|
|
|
}
|
|
|
}).catch(function (err) {
|
|
|
ModelUtil.emitError(self.eventEmitter, {message: "Get sessions failed: " + err});
|
|
|
})
|
|
|
]);
|
|
|
}
|
|
|
|
|
|
/**
|
|
@ -247,13 +225,13 @@ class Sessions extends RedisModel {
|
|
|
let message_timestamp_key = RedisModel.makeRedisKey(REDIS_KEYS.MessagesByTimestamp, sessionId);
|
|
|
if (!start_msg_id && !end_msg_id) {
|
|
|
redis.zrevrangeAsync(message_timestamp_key, 0, 0).then(function (res) {
|
|
|
if(res.length==0){
|
|
|
if (res.length == 0) {
|
|
|
ModelUtil.emitOK(self.eventEmitter, res);
|
|
|
return;
|
|
|
}
|
|
|
start_msg_id = res[0];
|
|
|
redis.zrangeAsync(message_timestamp_key, 0, 0).then(function (res) {
|
|
|
if(res.length==0){
|
|
|
if (res.length == 0) {
|
|
|
ModelUtil.emitOK(self.eventEmitter, res);
|
|
|
return;
|
|
|
}
|
|
@ -261,7 +239,7 @@ class Sessions extends RedisModel {
|
|
|
self.getMessagesByPage(sessionId, user, start_msg_id, end_msg_id, page, pagesize, function (err, res) {
|
|
|
if (err) {
|
|
|
logger.error("getMessagesByPage error" + err);
|
|
|
ModelUtil.emitError(self.eventEmitter,err,err);
|
|
|
ModelUtil.emitError(self.eventEmitter, err, err);
|
|
|
} else {
|
|
|
ModelUtil.emitOK(self.eventEmitter, res);
|
|
|
}
|
|
@ -270,7 +248,7 @@ class Sessions extends RedisModel {
|
|
|
})
|
|
|
} else if (!start_msg_id) {
|
|
|
redis.zrevrangeAsync(message_timestamp_key, 0, 0).then(function (res) {
|
|
|
if(res.length==0){
|
|
|
if (res.length == 0) {
|
|
|
ModelUtil.emitOK(self.eventEmitter, res);
|
|
|
return;
|
|
|
}
|
|
@ -278,7 +256,7 @@ class Sessions extends RedisModel {
|
|
|
self.getMessagesByPage(sessionId, user, startMsgId, endMsgId, page, pagesize, function (err, res) {
|
|
|
if (err) {
|
|
|
logger.error("getMessagesByPage error" + err);
|
|
|
ModelUtil.emitError(self.eventEmitter,err,err);
|
|
|
ModelUtil.emitError(self.eventEmitter, err, err);
|
|
|
} else {
|
|
|
ModelUtil.emitOK(self.eventEmitter, res);
|
|
|
}
|
|
@ -286,7 +264,7 @@ class Sessions extends RedisModel {
|
|
|
})
|
|
|
} else if (!end_msg_id) {
|
|
|
redis.zrangeAsync(message_timestamp_key, 0, 0).then(function (res) {
|
|
|
if(res.length==0){
|
|
|
if (res.length == 0) {
|
|
|
ModelUtil.emitOK(self.eventEmitter, res);
|
|
|
return;
|
|
|
}
|
|
@ -294,7 +272,7 @@ class Sessions extends RedisModel {
|
|
|
self.getMessagesByPage(sessionId, user, start_msg_id, end_msg_id, page, pagesize, function (err, res) {
|
|
|
if (err) {
|
|
|
logger.error("getMessagesByPage error" + err);
|
|
|
ModelUtil.emitError(self.eventEmitter,err,err);
|
|
|
ModelUtil.emitError(self.eventEmitter, err, err);
|
|
|
} else {
|
|
|
ModelUtil.emitOK(self.eventEmitter, res);
|
|
|
}
|
|
@ -304,7 +282,7 @@ class Sessions extends RedisModel {
|
|
|
self.getMessagesByPage(sessionId, user, start_msg_id, end_msg_id, page, pagesize, function (err, res) {
|
|
|
if (err) {
|
|
|
logger.error("getMessagesByPage error" + err);
|
|
|
ModelUtil.emitError(self.eventEmitter,err,err);
|
|
|
ModelUtil.emitError(self.eventEmitter, err, err);
|
|
|
} else {
|
|
|
ModelUtil.emitOK(self.eventEmitter, res);
|
|
|
}
|
|
@ -333,7 +311,7 @@ class Sessions extends RedisModel {
|
|
|
let offset = (page - 1 < 0 ? 0 : page - 1) * size;
|
|
|
let count = 20;
|
|
|
|
|
|
participants.existsParticipant(sessionId, user, function (err,res) {
|
|
|
participants.existsParticipant(sessionId, user, function (err, res) {
|
|
|
if (!res) {
|
|
|
handler("用户不在此会话中!", false);
|
|
|
} else {
|
|
@ -491,7 +469,7 @@ class Sessions extends RedisModel {
|
|
|
if (res) {
|
|
|
redis.hmgetAsync(sessionKey, ["type", "name"]).then(function (res) {
|
|
|
let sessionType = res[0];
|
|
|
if(sessionType == null){
|
|
|
if (sessionType == null) {
|
|
|
ModelUtil.emitError(self.eventEmitter, "Session with id " + sessionId + " not found.");
|
|
|
return;
|
|
|
}
|