|  | @ -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
 | 
	
	
		
			
				|  | @ -147,6 +183,7 @@ class Sessions extends RedisModel {
 | 
	
		
			
				|  |  |             }
 | 
	
		
			
				|  |  |          })
 | 
	
		
			
				|  |  |     }
 | 
	
		
			
				|  |  | 
 | 
	
		
			
				|  |  |     /**
 | 
	
		
			
				|  |  |      * 更新最后一条消息
 | 
	
		
			
				|  |  |      * @param session_key rediskey
 | 
	
	
		
			
				|  | @ -159,7 +196,7 @@ class Sessions extends RedisModel {
 | 
	
		
			
				|  |  |      * @param name 议题名称
 | 
	
		
			
				|  |  |      * @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,
 | 
	
	
		
			
				|  | @ -171,8 +208,11 @@ class Sessions extends RedisModel {
 | 
	
		
			
				|  |  |         );
 | 
	
		
			
				|  |  |     }
 | 
	
		
			
				|  |  | 
 | 
	
		
			
				|  |  | 
 | 
	
		
			
				|  |  | 
 | 
	
		
			
				|  |  |     /**
 | 
	
		
			
				|  |  |      * 保存消息,用于消息发送
 | 
	
		
			
				|  |  |      * @param message
 | 
	
		
			
				|  |  |      * @param sessionId
 | 
	
		
			
				|  |  |      */
 | 
	
		
			
				|  |  |     saveMessageBySession(message,sessionId) {
 | 
	
		
			
				|  |  |         let self = this;
 | 
	
		
			
				|  |  |         let messages = new Messages();
 | 
	
	
		
			
				|  | @ -212,19 +252,6 @@ class Sessions extends RedisModel {
 | 
	
		
			
				|  |  |         })
 | 
	
		
			
				|  |  |     }
 | 
	
		
			
				|  |  | 
 | 
	
		
			
				|  |  | 
 | 
	
		
			
				|  |  | 
 | 
	
		
			
				|  |  | 
 | 
	
		
			
				|  |  | 
 | 
	
		
			
				|  |  |     /**
 | 
	
		
			
				|  |  |      * 根据sessionId获取对应的消息
 | 
	
		
			
				|  |  |      * @param sessionId
 | 
	
		
			
				|  |  |      */
 | 
	
		
			
				|  |  |     getSessionMessagesByPage(sessionId,page,pageSize){
 | 
	
		
			
				|  |  | 
 | 
	
		
			
				|  |  | 
 | 
	
		
			
				|  |  |     }
 | 
	
		
			
				|  |  | 
 | 
	
		
			
				|  |  |     /**
 | 
	
		
			
				|  |  |      * 非MUC模式创建会话
 | 
	
		
			
				|  |  |      * @param sessionId 会话ID
 | 
	
	
		
			
				|  | @ -279,7 +306,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":"取消置顶成功!"});
 | 
	
		
			
				|  |  |             });
 | 
	
		
			
				|  |  |         })
 | 
	
		
			
				|  |  |     }
 | 
	
		
			
				|  |  | 
 | 
	
		
			
				|  |  | }
 | 
	
		
			
				|  |  | 
 |