|  | @ -191,10 +191,10 @@ class Users extends RedisModel {
 | 
	
		
			
				|  |  |                     if (loginFromApp) {
 | 
	
		
			
				|  |  |                         // cache app status
 | 
	
		
			
				|  |  |                         multi = multi.hmset(userStatusKey, 'platform', platform, 'app_in_bg', false, 'client_id', clientId,
 | 
	
		
			
				|  |  |                             'token', token, 'last_login_time', lastLoginTime);
 | 
	
		
			
				|  |  |                             'token', token, 'last_login_time', lastLoginTime.getTime());
 | 
	
		
			
				|  |  |                     } else {
 | 
	
		
			
				|  |  |                         // cache wechat status
 | 
	
		
			
				|  |  |                         multi = multi.hmset(userKey, 'open_id', userInfo.open_id);
 | 
	
		
			
				|  |  |                         multi = multi.hmset(userKey, 'open_id', userInfo.open_id, 'last_login_time', lastLoginTime.getTime());
 | 
	
		
			
				|  |  |                     }
 | 
	
		
			
				|  |  | 
 | 
	
		
			
				|  |  |                     multi.execAsync().then(function (res) {
 | 
	
	
		
			
				|  | @ -222,14 +222,19 @@ class Users extends RedisModel {
 | 
	
		
			
				|  |  |                                         let sessionParticipantsKey = RedisModel.makeRedisKey(REDIS_KEYS.SessionParticipants, sessionId);
 | 
	
		
			
				|  |  |                                         let sessionParticipantsRoleKey = RedisModel.makeRedisKey(REDIS_KEYS.SessionParticipantsRole, sessionId);
 | 
	
		
			
				|  |  |                                         ParticipantRepo.findParticipants(sessionId, function (err, participants) {
 | 
	
		
			
				|  |  |                                             if(err){
 | 
	
		
			
				|  |  |                                                 ModelUtil.emitError(self.eventEmitter, err.message);
 | 
	
		
			
				|  |  |                                                 return;
 | 
	
		
			
				|  |  |                                             }
 | 
	
		
			
				|  |  | 
 | 
	
		
			
				|  |  |                                             participants.forEach(function (participant) {
 | 
	
		
			
				|  |  |                                                 let participantId = participant.participant_id;
 | 
	
		
			
				|  |  |                                                 let participantRole = participant.participant_role;
 | 
	
		
			
				|  |  |                                                 let score = new Date().getTime();
 | 
	
		
			
				|  |  | 
 | 
	
		
			
				|  |  |                                                 redisConn.multi()
 | 
	
		
			
				|  |  |                                                     .zadd(sessionParticipantsKey, participantId, score)
 | 
	
		
			
				|  |  |                                                     .hset(sessionParticipantsRoleKey, participantId, participantRole)
 | 
	
		
			
				|  |  |                                                     .zadd(sessionParticipantsKey, score, participantId)
 | 
	
		
			
				|  |  |                                                     .hset(sessionParticipantsRoleKey, participantRole, participantId)
 | 
	
		
			
				|  |  |                                                     .execAsync().then(function (res) {
 | 
	
		
			
				|  |  |                                                 });
 | 
	
		
			
				|  |  |                                             });
 | 
	
	
		
			
				|  | @ -239,20 +244,24 @@ class Users extends RedisModel {
 | 
	
		
			
				|  |  |                                         let messagesKey = RedisModel.makeRedisKey(REDIS_KEYS.Messages, sessionId);
 | 
	
		
			
				|  |  |                                         let messagesByTimestampKey = RedisModel.makeRedisKey(REDIS_KEYS.MessagesByTimestamp, sessionId);
 | 
	
		
			
				|  |  |                                         MessageRepo.findBySessionId(sessionId, 0, config.sessionConfig.maxMessageCount, function (err, messages) {
 | 
	
		
			
				|  |  |                                             if(err){
 | 
	
		
			
				|  |  |                                                 ModelUtil.emitError(self.eventEmitter, err.message);
 | 
	
		
			
				|  |  |                                                 return;
 | 
	
		
			
				|  |  |                                             }
 | 
	
		
			
				|  |  | 
 | 
	
		
			
				|  |  |                                             messages.forEach(function (message) {
 | 
	
		
			
				|  |  |                                                 let id = message.id;
 | 
	
		
			
				|  |  |                                                 let msgJson = {
 | 
	
		
			
				|  |  |                                                     sessionId: message.session_id,
 | 
	
		
			
				|  |  |                                                     senderId: message.sender_id,
 | 
	
		
			
				|  |  |                                                     senderName: message.sender_name,
 | 
	
		
			
				|  |  |                                                     contentType: message.content_type,
 | 
	
		
			
				|  |  |                                                     content: message.content,
 | 
	
		
			
				|  |  |                                                     timestamp: message.timestamp
 | 
	
		
			
				|  |  |                                                     id: message.id,
 | 
	
		
			
				|  |  |                                                     sender_id: message.sender_id,
 | 
	
		
			
				|  |  |                                                     sender_name: message.sender_name,
 | 
	
		
			
				|  |  |                                                     timestamp: ObjectUtil.timestampToLong(message.timestamp),
 | 
	
		
			
				|  |  |                                                     content_type: message.content_type,
 | 
	
		
			
				|  |  |                                                     content: message.content
 | 
	
		
			
				|  |  |                                                 };
 | 
	
		
			
				|  |  | 
 | 
	
		
			
				|  |  |                                                 redisConn.multi()
 | 
	
		
			
				|  |  |                                                     .hset(messagesKey, id, msgJson)
 | 
	
		
			
				|  |  |                                                     .zadd(messagesByTimestampKey, id)
 | 
	
		
			
				|  |  |                                                     .hset(messagesKey, message.id, JSON.stringify(msgJson))
 | 
	
		
			
				|  |  |                                                     .zadd(messagesByTimestampKey, ObjectUtil.timestampToLong(message.timestamp), message.id)
 | 
	
		
			
				|  |  |                                                     .execAsync()
 | 
	
		
			
				|  |  |                                                     .then(function (res) {
 | 
	
		
			
				|  |  |                                                     });
 | 
	
	
		
			
				|  | @ -262,6 +271,11 @@ class Users extends RedisModel {
 | 
	
		
			
				|  |  |                                         // cache topics for MUC
 | 
	
		
			
				|  |  |                                         let topicsKey = RedisModel.makeRedisKey(REDIS_KEYS.Topics, sessionId);
 | 
	
		
			
				|  |  |                                         TopicRepo.findAll(sessionId, function (err, topics) {
 | 
	
		
			
				|  |  |                                             if(err){
 | 
	
		
			
				|  |  |                                                 ModelUtil.emitError(self.eventEmitter, err.message);
 | 
	
		
			
				|  |  |                                                 return;
 | 
	
		
			
				|  |  |                                             }
 | 
	
		
			
				|  |  | 
 | 
	
		
			
				|  |  |                                             topics.forEach(function (topic) {
 | 
	
		
			
				|  |  |                                                 let topicKey = RedisModel.makeRedisKey(REDIS_KEYS.Topic, topic.id);
 | 
	
		
			
				|  |  |                                                 let topicId = topic.id;
 |