|
@ -14,6 +14,7 @@ let imDb = require('../../repository/mysql/db/im.db');
|
|
|
let log = require('../../util/log.js');
|
|
|
const RedisKeys = require('../../include/commons').REDIS_KEYS;
|
|
|
const IMTABLE = require('../../include/commons').IM_DB;
|
|
|
const Commons = require('../../include/commons')
|
|
|
let mongoose = require('mongoose');
|
|
|
|
|
|
class Sessions extends RedisModel {
|
|
@ -22,13 +23,48 @@ class Sessions extends RedisModel {
|
|
|
}
|
|
|
|
|
|
/**
|
|
|
* 根据sessionId获取对应的Session
|
|
|
* @param sessionId
|
|
|
* 获取某个用户的全部session列表
|
|
|
* @param userId
|
|
|
* @param handler
|
|
|
*/
|
|
|
getSessionsById(sessionId){
|
|
|
|
|
|
getMysqlUserSessions(userId,handler){
|
|
|
let sql ="select select session_id from participants w where w.participaint_id = ? group by w.session_id";
|
|
|
let sessionsql = "select id,name,type,create_date from session s where s.id in("+sql+")";
|
|
|
imDb.execQuery({
|
|
|
"sql": sessionsql,
|
|
|
"args": [userId],
|
|
|
"handler": function (err, res) {
|
|
|
if(err) {
|
|
|
log.error("sql:"+sessionsql+"data:userId:"+userId);
|
|
|
}else{
|
|
|
log.info("getMysqlUserSessions success by userId :"+userId);
|
|
|
}
|
|
|
handler(err,res);
|
|
|
}
|
|
|
});
|
|
|
}
|
|
|
|
|
|
/**
|
|
|
* 获取session单个对象
|
|
|
* @param sessionId
|
|
|
* @param handler
|
|
|
*/
|
|
|
getSessions(sessionId,handler){
|
|
|
let sessionsql = "select id,name,type,create_date from session s where s.id=?";
|
|
|
imDb.execQuery({
|
|
|
"sql": sessionsql,
|
|
|
"args": [sessionId],
|
|
|
"handler": function (err, res) {
|
|
|
if(err) {
|
|
|
log.error("sql:"+sessionsql+"data:sessionId:"+sessionId);
|
|
|
}else{
|
|
|
log.info("getSessions success by sessionId :"+sessionId);
|
|
|
}
|
|
|
handler(err,res);
|
|
|
}
|
|
|
});
|
|
|
}
|
|
|
|
|
|
/**
|
|
|
* 根据用户ID获取用户的session列表
|
|
|
* @param userId
|
|
@ -51,7 +87,6 @@ class Sessions extends RedisModel {
|
|
|
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){
|
|
@ -113,34 +148,42 @@ class Sessions extends RedisModel {
|
|
|
let self = this;
|
|
|
let message_timestamp_key = super.makeRedisKey(RedisKeys.MessagesTimestamp,sessionId);
|
|
|
let message_key = super.makeRedisKey(RedisKeys.Messages,sessionId);
|
|
|
let participants = super.makeRedisKey(RedisKeys.Participants,sessionId);
|
|
|
let participants_key = super.makeRedisKey(RedisKeys.Participants,sessionId);
|
|
|
if(page>0){
|
|
|
page = page*pagesize;
|
|
|
pagesize = pagesize+page;
|
|
|
}
|
|
|
//倒序取出最后N条消息
|
|
|
redis.zrevrangeAsync(message_timestamp_key,page,pagesize).then(function(res){
|
|
|
//取出消息实体
|
|
|
if(res.length==0){
|
|
|
modelUtil.emitData(self.eventEmitter,{"status":200,"data":[]});
|
|
|
return;
|
|
|
}
|
|
|
redis.hmgetAsync(message_key,res).then(function(messages) {
|
|
|
console.log(messages)
|
|
|
//将取到的消息返回给前端
|
|
|
modelUtil.emitData(self.eventEmitter,{"status":200,"data":messages});
|
|
|
}).then(function(){
|
|
|
//更新患者最后一次获取消息的日期
|
|
|
redis.zaddAsync(participants, (new Date().getTime()),user).then(function(res){
|
|
|
console.log(res);
|
|
|
let participants = new Participants();
|
|
|
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){
|
|
|
//取出消息实体
|
|
|
if(res.length==0){
|
|
|
modelUtil.emitData(self.eventEmitter,{"status":200,"data":[]});
|
|
|
return;
|
|
|
}
|
|
|
redis.hmgetAsync(message_key,res).then(function(messages) {
|
|
|
console.log(messages)
|
|
|
//将取到的消息返回给前端
|
|
|
modelUtil.emitData(self.eventEmitter,{"status":200,"data":messages});
|
|
|
}).then(function(){
|
|
|
//更新患者最后一次获取消息的日期
|
|
|
redis.zaddAsync(participants_key, (new Date().getTime()),user).then(function(res){
|
|
|
console.log(res);
|
|
|
}).catch(function(res){
|
|
|
throw res;
|
|
|
})
|
|
|
})
|
|
|
}).catch(function(res){
|
|
|
throw res;
|
|
|
modelUtil.emitData(self.eventEmitter,{"status":-1,"msg":res});
|
|
|
})
|
|
|
})
|
|
|
}).catch(function(res){
|
|
|
modelUtil.emitData(self.eventEmitter,{"status":-1,"msg":res});
|
|
|
})
|
|
|
}
|
|
|
})
|
|
|
}
|
|
|
|
|
|
/**
|
|
|
* 更新最后一条消息
|
|
|
* @param session_key rediskey
|
|
@ -149,7 +192,7 @@ 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,
|
|
@ -161,52 +204,50 @@ class Sessions extends RedisModel {
|
|
|
);
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
/**
|
|
|
* 保存消息,用于消息发送
|
|
|
* @param message
|
|
|
* @param sessionId
|
|
|
*/
|
|
|
saveMessageBySession(message,sessionId) {
|
|
|
let self = this;
|
|
|
let messages = new Messages();
|
|
|
let participants = new Participants();
|
|
|
let session_key = super.makeRedisKey(RedisKeys.Session,sessionId);
|
|
|
let message_id = mongoose.Types.ObjectId().toString();
|
|
|
let session_type = 0;
|
|
|
let name = "";
|
|
|
let messages = new Messages();
|
|
|
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);
|
|
|
throw "session is not found";
|
|
|
participants.existsUser(sessionId,messages.senderId,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);
|
|
|
throw "session is not found";
|
|
|
}
|
|
|
}).then(function(res){
|
|
|
//更新消息相关
|
|
|
return messages.saveMessageForRedis(message_id,sessionId,message);
|
|
|
}).then(function (res) {
|
|
|
//更新session的最后一条聊天记录
|
|
|
return self.updateLastContent(session_key,session_type,name,message);
|
|
|
}).then(function (res) {
|
|
|
//操作mysql数据库
|
|
|
messages.saveMessageForMysql(message,session_type,message_id,sessionId);
|
|
|
//返回数据给前端。
|
|
|
modelUtil.emitData(self.eventEmitter, {"status":200,"msg":"发送成功!"});
|
|
|
//消息推送
|
|
|
}).catch(function (res) {
|
|
|
modelUtil.emitData(self.eventEmitter,{"status":-1,"msg":res});
|
|
|
})
|
|
|
}else{
|
|
|
modelUtil.emitData(self.eventEmitter,{"status":-1,"msg":"用户不在此会话当中!"});
|
|
|
}
|
|
|
}).then(function(res){
|
|
|
//更新消息相关
|
|
|
return messages.saveMessageForRedis(message_id,sessionId,message);
|
|
|
}).then(function (res) {
|
|
|
//更新session的最后一条聊天记录
|
|
|
return self.updateLastContent(session_key,session_type,name,message);
|
|
|
}).then(function (res) {
|
|
|
//操作mysql数据库
|
|
|
messages.saveMessageForMysql(message,session_type,message_id,sessionId);
|
|
|
//返回数据给前端。
|
|
|
modelUtil.emitData(self.eventEmitter, {"status":200,"msg":"发送成功!"});
|
|
|
//消息推送
|
|
|
}).catch(function (res) {
|
|
|
modelUtil.emitData(self.eventEmitter,{"status":-1,"msg":res});
|
|
|
})
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
/**
|
|
|
* 根据sessionId获取对应的消息
|
|
|
* @param sessionId
|
|
|
*/
|
|
|
getSessionMessagesByPage(sessionId,page,pageSize){
|
|
|
|
|
|
|
|
|
}
|
|
|
|
|
|
/**
|
|
|
* 非MUC模式创建会话
|
|
|
* @param sessionId 会话ID
|
|
@ -261,7 +302,53 @@ class Sessions extends RedisModel {
|
|
|
});
|
|
|
}
|
|
|
|
|
|
/**
|
|
|
*置顶操作
|
|
|
*/
|
|
|
stickSession(sessionId,user){
|
|
|
let user_session_key = super.makeRedisKey(RedisKeys.UsersSessions,user);
|
|
|
let self = this;
|
|
|
//取出最大的session
|
|
|
redis.zrevrangeAsync(user_session_key,0,0).then(function(res){
|
|
|
//获取该session的时间搓
|
|
|
redis.zscoreAsync(user_session_key,res).then(function(scoreres){
|
|
|
let nowtime = new Date().getTime();
|
|
|
//当前时间搓比redis的时间搓更早证明没有置顶过
|
|
|
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":"置顶成功!"});
|
|
|
})
|
|
|
}else{
|
|
|
//已有置顶的数据,取出来加1保存回去
|
|
|
scoreres = scoreres+1;
|
|
|
redis.zaddAsync(user_session_key, scoreres,sessionId).then(function(){
|
|
|
log.info("stickSession:"+sessionId+",res:"+res);
|
|
|
modelUtil.emitData(self.eventEmitter,{"status":200,"msg":"置顶成功!"});
|
|
|
})
|
|
|
}
|
|
|
})
|
|
|
})
|
|
|
}
|
|
|
|
|
|
/**
|
|
|
*取消置顶操作
|
|
|
*/
|
|
|
cancelStickSession(sessionId,user){
|
|
|
let user_session_key = super.makeRedisKey(RedisKeys.UsersSessions,user);
|
|
|
let participants_key = super.makeRedisKey(RedisKeys.Participants,sessionId);
|
|
|
let self = this;
|
|
|
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":"取消置顶成功!"});
|
|
|
});
|
|
|
})
|
|
|
}
|
|
|
|
|
|
}
|
|
|
|