|
@ -9,7 +9,7 @@ let redis = redisClient.connection;
|
|
|
let RedisModel = require('./../redis.model.js');
|
|
|
let modelUtil = require('../../util/model.util');
|
|
|
let Messages = require('../messages/messages');
|
|
|
let Participants = require('./Participants')
|
|
|
let Participants = require('./Participants');
|
|
|
let log = require('../../util/log.js');
|
|
|
const RedisKeys = require('../../include/commons').REDIS_KEYS;
|
|
|
const Commons = require('../../include/commons');
|
|
@ -28,8 +28,8 @@ class Sessions extends RedisModel {
|
|
|
* @param userId
|
|
|
* @param handler
|
|
|
*/
|
|
|
getUserSessionsFromMysql(userId,handler){
|
|
|
SessionRepo.getUserSessionsFromMysql(userId,handler);
|
|
|
getUserSessionsFromMysql(userId, handler) {
|
|
|
SessionRepo.getUserSessionsFromMysql(userId, handler);
|
|
|
}
|
|
|
|
|
|
/**
|
|
@ -37,42 +37,43 @@ class Sessions extends RedisModel {
|
|
|
* @param sessionId
|
|
|
* @param handler
|
|
|
*/
|
|
|
getSessions(sessionId,handler){
|
|
|
SessionRepo.getSessions(sessionId,handler);
|
|
|
getSessions(sessionId, handler) {
|
|
|
SessionRepo.getSessions(sessionId, handler);
|
|
|
}
|
|
|
|
|
|
/**
|
|
|
* 根据用户ID获取用户的session列表
|
|
|
* @param userId
|
|
|
*/
|
|
|
getUserSessions(userId,page,pagesize){
|
|
|
let user_session_key = super.makeRedisKey(RedisKeys.UserSessions,userId);
|
|
|
getUserSessions(userId, page, pagesize) {
|
|
|
let user_session_key = super.makeRedisKey(RedisKeys.UserSessions, userId);
|
|
|
let self = this;
|
|
|
let _super = super.makeRedisKey;
|
|
|
if(page >0){
|
|
|
page = page*pagesize;
|
|
|
pagesize = pagesize+page;
|
|
|
if (page > 0) {
|
|
|
page = page * pagesize;
|
|
|
pagesize = pagesize + page;
|
|
|
}
|
|
|
|
|
|
//倒序
|
|
|
redis.zrevrangeAsync(user_session_key,page,pagesize).then(function(res){
|
|
|
let sessionlist =[];
|
|
|
if(res.length==0){
|
|
|
modelUtil.emitData(self.eventEmitter,{"status":200,"data":res});
|
|
|
}else{
|
|
|
for(var j in res){
|
|
|
calllist(res[j],j,res.length);
|
|
|
redis.zrevrangeAsync(user_session_key, page, pagesize).then(function (res) {
|
|
|
let sessionlist = [];
|
|
|
if (res.length == 0) {
|
|
|
modelUtil.emitData(self.eventEmitter, {"status": 200, "data": res});
|
|
|
} else {
|
|
|
for (var j in res) {
|
|
|
calllist(res[j], j, res.length);
|
|
|
}
|
|
|
}
|
|
|
function calllist(session,j,_len){
|
|
|
let session_key =_super(RedisKeys.Session,session);
|
|
|
redis.hgetallAsync(session_key).then(function(res){
|
|
|
let participants_key = _super(RedisKeys.Participants,session);
|
|
|
function calllist(session, j, _len) {
|
|
|
let session_key = _super(RedisKeys.Session, session);
|
|
|
redis.hgetallAsync(session_key).then(function (res) {
|
|
|
let participants_key = _super(RedisKeys.Participants, session);
|
|
|
//当前用户最后一次登录改讨论组时间
|
|
|
redis.zscoreAsync(participants_key,userId).then(function(restimestamp){
|
|
|
redis.zscoreAsync(participants_key, userId).then(function (restimestamp) {
|
|
|
//时间差获取消息数量
|
|
|
callamount(res,j,_len,session,restimestamp);
|
|
|
callamount(res, j, _len, session, restimestamp);
|
|
|
})
|
|
|
}).catch(function(err){
|
|
|
}).catch(function (err) {
|
|
|
throw err;
|
|
|
})
|
|
|
}
|
|
@ -85,13 +86,13 @@ class Sessions extends RedisModel {
|
|
|
* @param session 当前会话
|
|
|
* @param restimestamp 当前会话当前用户的最后一次时间搓
|
|
|
*/
|
|
|
function callamount(res,j,_len,session,restimestamp){
|
|
|
let message_time_key = _super(RedisKeys.MessagesByTimestamp,session);
|
|
|
redis.zrangebyscoreAsync(message_time_key,restimestamp,(new Date().getTime())).then(function(messagetimelist){
|
|
|
function callamount(res, j, _len, session, restimestamp) {
|
|
|
let message_time_key = _super(RedisKeys.MessagesByTimestamp, session);
|
|
|
redis.zrangebyscoreAsync(message_time_key, restimestamp, (new Date().getTime())).then(function (messagetimelist) {
|
|
|
res.sessionId = session;
|
|
|
res.message = messagetimelist.length;
|
|
|
callback(res,j,_len);
|
|
|
}).catch(function(err){
|
|
|
callback(res, j, _len);
|
|
|
}).catch(function (err) {
|
|
|
throw err;
|
|
|
})
|
|
|
}
|
|
@ -102,14 +103,14 @@ class Sessions extends RedisModel {
|
|
|
* @param j
|
|
|
* @param _len
|
|
|
*/
|
|
|
function callback(res,j,_len){
|
|
|
function callback(res, j, _len) {
|
|
|
sessionlist.push(res);
|
|
|
if(j==(_len-1)){
|
|
|
modelUtil.emitData(self.eventEmitter,{"status":200,"data":sessionlist});
|
|
|
if (j == (_len - 1)) {
|
|
|
modelUtil.emitData(self.eventEmitter, {"status": 200, "data": sessionlist});
|
|
|
}
|
|
|
}
|
|
|
}).catch(function(res){
|
|
|
modelUtil.emitData(self.eventEmitter,"get list error "+res+",user:"+userId);
|
|
|
}).catch(function (res) {
|
|
|
modelUtil.emitData(self.eventEmitter, "get list error " + res + ",user:" + userId);
|
|
|
})
|
|
|
}
|
|
|
|
|
@ -120,55 +121,55 @@ class Sessions extends RedisModel {
|
|
|
* @param page 第几页
|
|
|
* @param pagesize 分页数量
|
|
|
*/
|
|
|
getSessionMessages(sessionId,user,page,pagesize){
|
|
|
getSessionMessages(sessionId, user, page, pagesize) {
|
|
|
let self = this;
|
|
|
let message_timestamp_key = super.makeRedisKey(RedisKeys.MessagesByTimestamp,sessionId);
|
|
|
let message_key = super.makeRedisKey(RedisKeys.Messages,sessionId);
|
|
|
let participants_key = super.makeRedisKey(RedisKeys.Participants,sessionId);
|
|
|
let message_timestamp_key = super.makeRedisKey(RedisKeys.MessagesByTimestamp, sessionId);
|
|
|
let message_key = super.makeRedisKey(RedisKeys.Messages, sessionId);
|
|
|
let participants_key = super.makeRedisKey(RedisKeys.Participants, sessionId);
|
|
|
//超过最大限制后从mysql获取数据
|
|
|
if(page*pagesize>=config.sessionConfig.maxMessageCount){
|
|
|
if (page * pagesize >= config.sessionConfig.maxMessageCount) {
|
|
|
let message = new Messages();
|
|
|
message.getMessageByPage(sessionId,page,pagesize,function(err,res){
|
|
|
if(!err){
|
|
|
modelUtil.emitData(self.eventEmitter,{"status":200,"data":res});
|
|
|
}else{
|
|
|
modelUtil.emitData(self.eventEmitter,{"status":-1,"data":err});
|
|
|
message.getMessageByPage(sessionId, page, pagesize, function (err, res) {
|
|
|
if (!err) {
|
|
|
modelUtil.emitData(self.eventEmitter, {"status": 200, "data": res});
|
|
|
} else {
|
|
|
modelUtil.emitData(self.eventEmitter, {"status": -1, "data": err});
|
|
|
}
|
|
|
})
|
|
|
}else{
|
|
|
if(page>0){
|
|
|
page = page*pagesize;
|
|
|
pagesize = pagesize+page;
|
|
|
} else {
|
|
|
if (page > 0) {
|
|
|
page = page * pagesize;
|
|
|
pagesize = pagesize + page;
|
|
|
}
|
|
|
let participants = new Participants();
|
|
|
participants.existsUser(sessionId,user,function(res){
|
|
|
if(!res){
|
|
|
modelUtil.emitData(self.eventEmitter,{"status":-1,"msg":"用户不在此会话中!"});
|
|
|
}else{
|
|
|
participants.existsUser(sessionId, user, function (res) {
|
|
|
if (!res) {
|
|
|
modelUtil.emitData(self.eventEmitter, {"status": -1, "msg": "用户不在此会话中!"});
|
|
|
} else {
|
|
|
//倒序取出最后N条消息
|
|
|
redis.zrevrangeAsync(message_timestamp_key,page,pagesize).then(function(res){
|
|
|
redis.zrevrangeAsync(message_timestamp_key, page, pagesize).then(function (res) {
|
|
|
//取出消息实体
|
|
|
if(res.length==0){
|
|
|
modelUtil.emitData(self.eventEmitter,{"status":200,"data":[]});
|
|
|
if (res.length == 0) {
|
|
|
modelUtil.emitData(self.eventEmitter, {"status": 200, "data": []});
|
|
|
return;
|
|
|
}
|
|
|
redis.hmgetAsync(message_key,res).then(function(messages) {
|
|
|
redis.hmgetAsync(message_key, res).then(function (messages) {
|
|
|
console.log(messages)
|
|
|
//将取到的消息返回给前端
|
|
|
modelUtil.emitData(self.eventEmitter,{"status":200,"data":messages});
|
|
|
}).then(function(){
|
|
|
modelUtil.emitData(self.eventEmitter, {"status": 200, "data": messages});
|
|
|
}).then(function () {
|
|
|
//更新患者最后一次获取消息的日期
|
|
|
redis.zaddAsync(participants_key, (new Date().getTime()),user).then(function(res){
|
|
|
redis.zaddAsync(participants_key, (new Date().getTime()), user).then(function (res) {
|
|
|
console.log(res);
|
|
|
}).catch(function(res){
|
|
|
}).catch(function (res) {
|
|
|
throw res;
|
|
|
})
|
|
|
})
|
|
|
}).catch(function(res){
|
|
|
modelUtil.emitData(self.eventEmitter,{"status":-1,"msg":res});
|
|
|
}).catch(function (res) {
|
|
|
modelUtil.emitData(self.eventEmitter, {"status": -1, "msg": res});
|
|
|
})
|
|
|
}
|
|
|
})
|
|
|
})
|
|
|
}
|
|
|
}
|
|
|
|
|
@ -180,15 +181,15 @@ class Sessions extends RedisModel {
|
|
|
* @param message
|
|
|
* @returns {*}
|
|
|
*/
|
|
|
updateLastContent(session_key,session_type,name,message){
|
|
|
updateLastContent(session_key, session_type, name, message) {
|
|
|
return redis.hmsetAsync(session_key,
|
|
|
"create_date", message.timestamp,
|
|
|
"last_content", message.content,
|
|
|
"last_content_type", message.contentType,
|
|
|
"type", session_type,
|
|
|
"senderId",message.senderId,
|
|
|
"senderName",message.senderName,
|
|
|
"name",name
|
|
|
"senderId", message.senderId,
|
|
|
"senderName", message.senderName,
|
|
|
"name", name
|
|
|
);
|
|
|
}
|
|
|
|
|
@ -197,41 +198,41 @@ class Sessions extends RedisModel {
|
|
|
* @param message
|
|
|
* @param sessionId
|
|
|
*/
|
|
|
saveMessageBySession(message,sessionId) {
|
|
|
saveMessageBySession(message, sessionId) {
|
|
|
let self = this;
|
|
|
let messages = new Messages();
|
|
|
let participants = new Participants();
|
|
|
let session_key = super.makeRedisKey(RedisKeys.Session,sessionId);
|
|
|
let session_key = super.makeRedisKey(RedisKeys.Session, sessionId);
|
|
|
let message_id = mongoose.Types.ObjectId().toString();
|
|
|
let session_type = 0;
|
|
|
let name = "";
|
|
|
participants.existsUser(sessionId,messages.senderId,function(res){
|
|
|
participants.existsUser(sessionId, messages.senderId, function (res) {
|
|
|
//校验发送成员是都在讨论组
|
|
|
if(res){
|
|
|
redis.hmgetAsync(session_key, ["type","name"]).then(function(res){
|
|
|
if (res) {
|
|
|
redis.hmgetAsync(session_key, ["type", "name"]).then(function (res) {
|
|
|
session_type = res[0];
|
|
|
name = res[1];
|
|
|
if(!session_type||!name){
|
|
|
log.error("session is error for key "+session_key);
|
|
|
name = res[1];
|
|
|
if (!session_type || !name) {
|
|
|
log.error("session is error for key " + session_key);
|
|
|
throw "session is not found";
|
|
|
}
|
|
|
}).then(function(res){
|
|
|
}).then(function (res) {
|
|
|
//更新消息相关
|
|
|
return messages.saveMessageForRedis(message_id,sessionId,message);
|
|
|
return messages.saveMessageForRedis(message_id, sessionId, message);
|
|
|
}).then(function (res) {
|
|
|
//更新session的最后一条聊天记录
|
|
|
return self.updateLastContent(session_key,session_type,name,message);
|
|
|
return self.updateLastContent(session_key, session_type, name, message);
|
|
|
}).then(function (res) {
|
|
|
//操作mysql数据库
|
|
|
messages.saveMessageForMysql(message,session_type,message_id,sessionId);
|
|
|
messages.saveMessageForMysql(message, session_type, message_id, sessionId);
|
|
|
//返回数据给前端。
|
|
|
modelUtil.emitData(self.eventEmitter, {"status":200,"msg":"发送成功!"});
|
|
|
modelUtil.emitData(self.eventEmitter, {"status": 200, "msg": "发送成功!"});
|
|
|
//消息推送
|
|
|
}).catch(function (res) {
|
|
|
modelUtil.emitData(self.eventEmitter,{"status":-1,"msg":res});
|
|
|
modelUtil.emitData(self.eventEmitter, {"status": -1, "msg": res});
|
|
|
})
|
|
|
}else{
|
|
|
modelUtil.emitData(self.eventEmitter,{"status":-1,"msg":"用户不在此会话当中!"});
|
|
|
} else {
|
|
|
modelUtil.emitData(self.eventEmitter, {"status": -1, "msg": "用户不在此会话当中!"});
|
|
|
}
|
|
|
})
|
|
|
}
|
|
@ -243,30 +244,30 @@ class Sessions extends RedisModel {
|
|
|
* @param type 会话类型
|
|
|
* @param users 会话成员
|
|
|
*/
|
|
|
createSessions(sessionId,name,type,users){
|
|
|
if(type==2){
|
|
|
createSessions(sessionId, name, type, users) {
|
|
|
if (type == 2) {
|
|
|
|
|
|
}
|
|
|
|
|
|
let self = this;
|
|
|
let createDate = new Date();
|
|
|
let session_key = super.makeRedisKey(RedisKeys.Session,sessionId);
|
|
|
let participants = new Participants();
|
|
|
//将session加入reids
|
|
|
participants.createParticipantsToRedis(sessionId,users.split(","),createDate,function(res){
|
|
|
if(!res){
|
|
|
modelUtil.emitData(self.eventEmitter, {"status":-1,"msg":res});
|
|
|
}else{
|
|
|
let messages={};
|
|
|
messages.senderId="system";
|
|
|
messages.senderName="系统消息";
|
|
|
messages.timestamp=createDate;
|
|
|
messages.content=""
|
|
|
messages.contentType="1";
|
|
|
self.updateLastContent(session_key,type,name,messages);
|
|
|
modelUtil.emitData(self.eventEmitter, {"status":200,"msg":"session create success!"});
|
|
|
self.saveSessionToMysql(sessionId,name,type,createDate);
|
|
|
//创建session成员到数据库
|
|
|
participants.createParticipantsToMysql(sessionId,users.split(","));
|
|
|
let session_key = super.makeRedisKey(RedisKeys.Session, sessionId);
|
|
|
let participants = new Participants();
|
|
|
// 将session加入redis
|
|
|
participants.createParticipantsToRedis(sessionId, users.split(","), createDate, function (res) {
|
|
|
if (!res) {
|
|
|
modelUtil.emitData(self.eventEmitter, {"status": -1, "msg": res});
|
|
|
} else {
|
|
|
let messages = {};
|
|
|
messages.senderId = "system";
|
|
|
messages.senderName = "系统消息";
|
|
|
messages.timestamp = createDate;
|
|
|
messages.content = "";
|
|
|
messages.contentType = "1";
|
|
|
self.updateLastContent(session_key, type, name, messages);
|
|
|
modelUtil.emitData(self.eventEmitter, {"status": 200, "msg": "session create success!"});
|
|
|
self.saveSessionToMysql(sessionId, name, type, createDate);
|
|
|
participants.createParticipantsToMysql(sessionId, users.split(",")); //创建session成员到数据库
|
|
|
}
|
|
|
})
|
|
|
}
|
|
@ -278,38 +279,38 @@ class Sessions extends RedisModel {
|
|
|
* @param type
|
|
|
* @param createDate
|
|
|
*/
|
|
|
saveSessionToMysql(sessionId,name,type,createDate){
|
|
|
SessionRepo.saveSessionToMysql(sessionId,name,type,createDate);
|
|
|
saveSessionToMysql(sessionId, name, type, createDate) {
|
|
|
SessionRepo.saveSessionToMysql(sessionId, name, type, createDate);
|
|
|
}
|
|
|
|
|
|
/**
|
|
|
*置顶操作
|
|
|
*/
|
|
|
stickSession(sessionId,user){
|
|
|
let user_session_key = super.makeRedisKey(RedisKeys.UserSessions,user);
|
|
|
stickSession(sessionId, user) {
|
|
|
let user_session_key = super.makeRedisKey(RedisKeys.UserSessions, user);
|
|
|
let self = this;
|
|
|
//取出最大的session
|
|
|
redis.zrevrangeAsync(user_session_key,0,0).then(function(res){
|
|
|
redis.zrevrangeAsync(user_session_key, 0, 0).then(function (res) {
|
|
|
//获取该session的时间搓
|
|
|
redis.zscoreAsync(user_session_key,res).then(function(scoreres){
|
|
|
redis.zscoreAsync(user_session_key, res).then(function (scoreres) {
|
|
|
let nowtime = new Date().getTime();
|
|
|
//当前时间搓比redis的时间搓更早证明没有置顶过
|
|
|
if(scoreres<=nowtime){
|
|
|
if (scoreres <= nowtime) {
|
|
|
//初始化置顶
|
|
|
redis.zaddAsync(user_session_key, Commons.STICK_NUM,sessionId).then(function(res){
|
|
|
log.info("stickSession:"+sessionId+",res:"+res);
|
|
|
modelUtil.emitData(self.eventEmitter,{"status":200,"msg":"置顶成功!"});
|
|
|
}).then(function(){
|
|
|
SessionRepo.stickSession(sessionId,user,Commons.STICK_NUM);
|
|
|
})
|
|
|
}else{
|
|
|
redis.zaddAsync(user_session_key, Commons.STICK_NUM, sessionId).then(function (res) {
|
|
|
log.info("stickSession:" + sessionId + ",res:" + res);
|
|
|
modelUtil.emitData(self.eventEmitter, {"status": 200, "msg": "置顶成功!"});
|
|
|
}).then(function () {
|
|
|
SessionRepo.stickSession(sessionId, user, Commons.STICK_NUM);
|
|
|
})
|
|
|
} else {
|
|
|
//已有置顶的数据,取出来加1保存回去
|
|
|
scoreres = Number(scoreres)+1;
|
|
|
redis.zaddAsync(user_session_key, scoreres,sessionId).then(function(){
|
|
|
log.info("stickSession:"+sessionId+",res:"+res);
|
|
|
modelUtil.emitData(self.eventEmitter,{"status":200,"msg":"置顶成功!"});
|
|
|
}).then(function(){
|
|
|
SessionRepo.stickSession(sessionId,user,scoreres);
|
|
|
scoreres = Number(scoreres) + 1;
|
|
|
redis.zaddAsync(user_session_key, scoreres, sessionId).then(function () {
|
|
|
log.info("stickSession:" + sessionId + ",res:" + res);
|
|
|
modelUtil.emitData(self.eventEmitter, {"status": 200, "msg": "置顶成功!"});
|
|
|
}).then(function () {
|
|
|
SessionRepo.stickSession(sessionId, user, scoreres);
|
|
|
})
|
|
|
}
|
|
|
})
|
|
@ -319,23 +320,22 @@ class Sessions extends RedisModel {
|
|
|
/**
|
|
|
*取消置顶操作
|
|
|
*/
|
|
|
cancelStickSession(sessionId,user){
|
|
|
let user_session_key = super.makeRedisKey(RedisKeys.UserSessions,user);
|
|
|
let participants_key = super.makeRedisKey(RedisKeys.Participants,sessionId);
|
|
|
cancelStickSession(sessionId, user) {
|
|
|
let user_session_key = super.makeRedisKey(RedisKeys.UserSessions, user);
|
|
|
let participants_key = super.makeRedisKey(RedisKeys.Participants, sessionId);
|
|
|
let self = this;
|
|
|
redis.zscoreAsync(participants_key,user).then(function(res){
|
|
|
if(!res){
|
|
|
redis.zscoreAsync(participants_key, user).then(function (res) {
|
|
|
if (!res) {
|
|
|
res = new Date().getTime();
|
|
|
}
|
|
|
redis.zaddAsync(user_session_key, res,sessionId).then(function(res){
|
|
|
log.info("cancelStickSession:"+sessionId);
|
|
|
modelUtil.emitData(self.eventEmitter,{"status":200,"msg":"取消置顶成功!"});
|
|
|
}).then(function(){
|
|
|
SessionRepo.unstickSession(sessionId,user);
|
|
|
redis.zaddAsync(user_session_key, res, sessionId).then(function (res) {
|
|
|
log.info("cancelStickSession:" + sessionId);
|
|
|
modelUtil.emitData(self.eventEmitter, {"status": 200, "msg": "取消置顶成功!"});
|
|
|
}).then(function () {
|
|
|
SessionRepo.unstickSession(sessionId, user);
|
|
|
});
|
|
|
})
|
|
|
}
|
|
|
|
|
|
}
|
|
|
|
|
|
// Expose class
|