|
@ -17,6 +17,7 @@ let redis = RedisClient.redisClient().connection;
|
|
let logger = require('../../util/log.js');
|
|
let logger = require('../../util/log.js');
|
|
let mongoose = require('mongoose');
|
|
let mongoose = require('mongoose');
|
|
var async = require("async");
|
|
var async = require("async");
|
|
|
|
var ObjectUtil = require("../../util/object.util.js");
|
|
|
|
|
|
const REDIS_KEYS = require('../../include/commons').REDIS_KEYS;
|
|
const REDIS_KEYS = require('../../include/commons').REDIS_KEYS;
|
|
const SESSION_TYPES = require('../../include/commons').SESSION_TYPES;
|
|
const SESSION_TYPES = require('../../include/commons').SESSION_TYPES;
|
|
@ -79,6 +80,11 @@ class Sessions extends RedisModel {
|
|
// 保存会话及成员至MySQL中
|
|
// 保存会话及成员至MySQL中
|
|
self.saveSessionToMysql(sessionId, name, type, createDate, function (err, res) {
|
|
self.saveSessionToMysql(sessionId, name, type, createDate, function (err, res) {
|
|
Participants.saveParticipantsToMysql(sessionId, participantArray, function (err, res) {
|
|
Participants.saveParticipantsToMysql(sessionId, participantArray, function (err, res) {
|
|
|
|
if(err){
|
|
|
|
ModelUtil.emitError(self.eventEmitter, err.message);
|
|
|
|
return;
|
|
|
|
}
|
|
|
|
|
|
// 保存会话及成员至Redis中,并更新会话的最后状态
|
|
// 保存会话及成员至Redis中,并更新会话的最后状态
|
|
let isMucSession = SESSION_TYPES.MUC == type;
|
|
let isMucSession = SESSION_TYPES.MUC == type;
|
|
let message = {
|
|
let message = {
|
|
@ -230,18 +236,19 @@ class Sessions extends RedisModel {
|
|
}
|
|
}
|
|
|
|
|
|
/**
|
|
/**
|
|
* 根据会话中的消息
|
|
|
|
|
|
* 获取会话消息。全部,不管已读/未读状态。
|
|
*
|
|
*
|
|
* @param sessionId 会话ID
|
|
* @param sessionId 会话ID
|
|
* @param user 拉取消息的人
|
|
|
|
|
|
* @param userId 拉取消息的人
|
|
* @param page 第几页
|
|
* @param page 第几页
|
|
* @param pagesize 分页数量
|
|
* @param pagesize 分页数量
|
|
*/
|
|
*/
|
|
getMessages(sessionId, user, page, pagesize) {
|
|
|
|
|
|
getMessages(sessionId, userId, page, pagesize) {
|
|
let self = this;
|
|
let self = this;
|
|
let message_timestamp_key = RedisModel.makeRedisKey(REDIS_KEYS.MessagesByTimestamp, sessionId);
|
|
let message_timestamp_key = RedisModel.makeRedisKey(REDIS_KEYS.MessagesByTimestamp, sessionId);
|
|
let message_key = RedisModel.makeRedisKey(REDIS_KEYS.Messages, sessionId);
|
|
let message_key = RedisModel.makeRedisKey(REDIS_KEYS.Messages, sessionId);
|
|
let participants_key = RedisModel.makeRedisKey(REDIS_KEYS.SessionParticipants, sessionId);
|
|
let participants_key = RedisModel.makeRedisKey(REDIS_KEYS.SessionParticipants, sessionId);
|
|
|
|
|
|
//超过最大限制后从mysql获取数据
|
|
//超过最大限制后从mysql获取数据
|
|
if (page * pagesize >= config.sessionConfig.maxMessageCount) {
|
|
if (page * pagesize >= config.sessionConfig.maxMessageCount) {
|
|
self.getMessageFromMySQL(sessionId, page, pagesize, function (err, res) {
|
|
self.getMessageFromMySQL(sessionId, page, pagesize, function (err, res) {
|
|
@ -257,7 +264,7 @@ class Sessions extends RedisModel {
|
|
pagesize = pagesize + page;
|
|
pagesize = pagesize + page;
|
|
}
|
|
}
|
|
let participants = new Participants();
|
|
let participants = new Participants();
|
|
participants.existsParticipant(sessionId, user, function (res) {
|
|
|
|
|
|
participants.existsParticipant(sessionId, userId, function (res) {
|
|
if (!res) {
|
|
if (!res) {
|
|
ModelUtil.emitOK(self.eventEmitter, {"status": -1, "msg": "用户不在此会话中!"});
|
|
ModelUtil.emitOK(self.eventEmitter, {"status": -1, "msg": "用户不在此会话中!"});
|
|
} else {
|
|
} else {
|
|
@ -274,46 +281,112 @@ class Sessions extends RedisModel {
|
|
ModelUtil.emitOK(self.eventEmitter, {"status": 200, "data": messages});
|
|
ModelUtil.emitOK(self.eventEmitter, {"status": 200, "data": messages});
|
|
}).then(function () {
|
|
}).then(function () {
|
|
//更新患者最后一次获取消息的日期
|
|
//更新患者最后一次获取消息的日期
|
|
redis.zaddAsync(participants_key, (new Date().getTime()), user).then(function (res) {
|
|
|
|
|
|
redis.zaddAsync(participants_key, (new Date().getTime()), userId).then(function (res) {
|
|
console.log(res);
|
|
console.log(res);
|
|
}).catch(function (res) {
|
|
}).catch(function (res) {
|
|
throw res;
|
|
throw res;
|
|
})
|
|
})
|
|
})
|
|
})
|
|
}).catch(function (res) {
|
|
}).catch(function (res) {
|
|
ModelUtil.emitOK(self.eventEmitter, {"status": -1, "msg": res});
|
|
|
|
|
|
ModelUtil.emitOK(self.eventEmitter, {message: res});
|
|
})
|
|
})
|
|
}
|
|
}
|
|
})
|
|
})
|
|
}
|
|
}
|
|
}
|
|
}
|
|
|
|
|
|
getAllSessionsUnreadMessageCount() {
|
|
|
|
|
|
/**
|
|
|
|
* 获取所有会话的未读消息数。
|
|
|
|
*/
|
|
|
|
getAllSessionsUnreadMessageCount(userId) {
|
|
|
|
let self = this;
|
|
|
|
ModelUtil.emitError(self.eventEmitter, {message: "not implemented."}, null);
|
|
}
|
|
}
|
|
|
|
|
|
/**
|
|
/**
|
|
* 获取会话的未读消息数。
|
|
|
|
|
|
* 获取会话的未读消息数。根据成员最后一次获取消息的时候与当前时间。
|
|
*
|
|
*
|
|
* @param sessionId
|
|
* @param sessionId
|
|
* @param userId
|
|
* @param userId
|
|
*/
|
|
*/
|
|
getSessionUnreadMessageCount(sessionId, userId) {
|
|
getSessionUnreadMessageCount(sessionId, userId) {
|
|
let self = this;
|
|
let self = this;
|
|
let sessionKey = RedisModel.makeRedisKey(REDIS_KEYS.Session, sessionId);
|
|
|
|
let messagesByTimestampKey = RedisModel.makeRedisKey(REDIS_KEYS.MessagesByTimestamp, sessionId);
|
|
let messagesByTimestampKey = RedisModel.makeRedisKey(REDIS_KEYS.MessagesByTimestamp, sessionId);
|
|
let participantsKey = RedisModel.makeRedisKey(REDIS_KEYS.Participants, userId);
|
|
|
|
|
|
let participantsKey = RedisModel.makeRedisKey(REDIS_KEYS.SessionParticipants, userId);
|
|
|
|
|
|
async.waterfall([
|
|
async.waterfall([
|
|
// 取得会话最后消息时间与此成员最后的消息获取时间
|
|
|
|
|
|
// 此成员最后获取消息的时间
|
|
function (callback) {
|
|
function (callback) {
|
|
redis.zscoreAsync(participantsKey)
|
|
|
|
.then(function (lastFatechTime) {
|
|
|
|
callback();
|
|
|
|
|
|
redis.zscoreAsync(participantsKey, userId)
|
|
|
|
.then(function (lastFetchTime) {
|
|
|
|
callback(null, lastFetchTime);
|
|
})
|
|
})
|
|
|
|
},
|
|
|
|
// 计算最后获取消息的时间之后到现在有多少条消息
|
|
|
|
function (lastFetchTime, callback) {
|
|
|
|
if (!lastFetchTime) lastFetchTime = 0;
|
|
|
|
let now = new Date().getTime();
|
|
|
|
redis.zcountAsync(messagesByTimestampKey, lastFetchTime, now)
|
|
|
|
.then(function (count) {
|
|
|
|
ModelUtil.emitOK(self.eventEmitter, {count: count});
|
|
|
|
})
|
|
|
|
}
|
|
|
|
], function (err, res) {
|
|
|
|
if (err) {
|
|
|
|
ModelUtil.emitError(self.eventEmitter, "Get session unread message count failed.")
|
|
}
|
|
}
|
|
]);
|
|
|
|
|
|
});
|
|
|
|
}
|
|
|
|
|
|
|
|
/**
|
|
|
|
* 获取会话未读消息数。根据成员最后一次获取消息的时候与当前时间。
|
|
|
|
*/
|
|
|
|
getSessionUnreadMessages(sessionId, userId) {
|
|
|
|
let self = this;
|
|
|
|
let messagesKey = RedisModel.makeRedisKey(REDIS_KEYS.Messages, sessionId);
|
|
|
|
let messagesByTimestampKey = RedisModel.makeRedisKey(REDIS_KEYS.MessagesByTimestamp, sessionId);
|
|
|
|
let participantsKey = RedisModel.makeRedisKey(REDIS_KEYS.SessionParticipants, userId);
|
|
|
|
|
|
ModelUtil.emitOK(self.eventEmitter, {count: 9});
|
|
|
|
|
|
async.waterfall([
|
|
|
|
// 此成员最后获取消息的时间
|
|
|
|
function (callback) {
|
|
|
|
redis.zscoreAsync(participantsKey, userId)
|
|
|
|
.then(function (lastFetchTime) {
|
|
|
|
callback(null, lastFetchTime);
|
|
|
|
})
|
|
|
|
},
|
|
|
|
// 最后获取消息的时间之后到现在的消息ID列表
|
|
|
|
function (lastFetchTime, callback) {
|
|
|
|
if (!lastFetchTime) lastFetchTime = 0;
|
|
|
|
let now = new Date().getTime();
|
|
|
|
redis.zrangebyscoreAsync(messagesByTimestampKey, lastFetchTime, now)
|
|
|
|
.then(function (messageIds) {
|
|
|
|
callback(null, messageIds);
|
|
|
|
})
|
|
|
|
},
|
|
|
|
// 获取消息
|
|
|
|
function (messageIds, callback) {
|
|
|
|
redis.hmgetAsync(messagesKey, messageIds)
|
|
|
|
.then(function (res) {
|
|
|
|
let messages = [];
|
|
|
|
res.forEach(function (message) {
|
|
|
|
messages.push({
|
|
|
|
sender_id: message.sender_id,
|
|
|
|
sender_name: message.sender_name,
|
|
|
|
content_type: message.content_type,
|
|
|
|
content: message.content,
|
|
|
|
timestamp: ObjectUtil.timestampToLong(message.timestamp)
|
|
|
|
});
|
|
|
|
});
|
|
|
|
|
|
|
|
ModelUtil.emitOK(self.eventEmitter, messages);
|
|
|
|
})
|
|
|
|
}
|
|
|
|
], function (err, res) {
|
|
|
|
if (err) {
|
|
|
|
ModelUtil.emitError(self.eventEmitter, "Get session unread message count failed.")
|
|
|
|
}
|
|
|
|
});
|
|
}
|
|
}
|
|
|
|
|
|
/**
|
|
/**
|
|
@ -343,6 +416,10 @@ class Sessions extends RedisModel {
|
|
if (res) {
|
|
if (res) {
|
|
redis.hmgetAsync(sessionKey, ["type", "name"]).then(function (res) {
|
|
redis.hmgetAsync(sessionKey, ["type", "name"]).then(function (res) {
|
|
let sessionType = res[0];
|
|
let sessionType = res[0];
|
|
|
|
if(sessionType == null){
|
|
|
|
ModelUtil.emitError(self.eventEmitter, "Session with id " + sessionId + " not found.");
|
|
|
|
return;
|
|
|
|
}
|
|
|
|
|
|
messages.saveMessageToRedis(sessionId, sessionType, messageId, message);
|
|
messages.saveMessageToRedis(sessionId, sessionType, messageId, message);
|
|
messages.saveMessageToMysql(sessionId, sessionType, messageId, message, function (err, res) {
|
|
messages.saveMessageToMysql(sessionId, sessionType, messageId, message, function (err, res) {
|