فهرست منبع

消息列表获取修改

8 سال پیش
والد
کامیت
202f33061f
3فایلهای تغییر یافته به همراه112 افزوده شده و 54 حذف شده
  1. 10 8
      src/server/endpoints/v2/session.endpoint.js
  2. 1 1
      src/server/models/messages/messages.js
  3. 101 45
      src/server/models/sessions/sessions.js

+ 10 - 8
src/server/endpoints/v2/session.endpoint.js

@ -199,23 +199,25 @@ router.post(APIv2.Sessions.Messages, function (req, res) {
router.get(APIv2.Sessions.Messages, function (req, res) {
    let start_msg_id = req.query.start_msg_id;
    let end_msg_id = req.query.end_msg_id;
    let pagesize = req.query.pagesize;
    let page = req.query.page;
    let user = req.query.user;
    let sessionId = req.query.sessionId;
    if (!start_msg_id) {
        throw {httpStatus: 406, message: 'Missing start_msg_id.'};
    }
    if (!end_msg_id) {
        throw {httpStatus: 406, message: 'Missing end_msg_id.'};
    }
    let sessionId = req.query.session_id;
    if (!user) {
        throw {httpStatus: 406, message: 'Missing user.'};
    }
    if (!sessionId) {
        throw {httpStatus: 406, message: 'Missing sessionId.'};
    }
    if(!pagesize){
        pagesize = 20;
    }
    if(!page){
        page = 1;
    }
    let sessions = new Sessions();
    ControllerUtil.regModelEventHandler(sessions, res);
    sessions.getMessages(sessionId, user, start_msg_id,end_msg_id);
    sessions.getMessages(sessionId, user, start_msg_id,end_msg_id,page,pagesize);
});
/**

+ 1 - 1
src/server/models/messages/messages.js

@ -101,7 +101,7 @@ class Messages extends RedisModel {
     */
    static updateLastContent(sessionKey, sessionType, name, message) {
        redis.hmsetAsync(sessionKey,
            "create_date", message.timestamp,
            "create_date", message.timestamp.getTime(),
            "last_content", message.content,
            "last_content_type", message.content_type,
            "sender_id", message.sender_id,

+ 101 - 45
src/server/models/sessions/sessions.js

@ -236,58 +236,114 @@ class Sessions extends RedisModel {
     * @param page 第几页
     * @param pagesize 分页数量
     */
    getMessages(sessionId, user, page, pagesize) {
    getMessages(sessionId, user, start_msg_id, end_msg_id, page, pagesize) {
        let self = this;
        let message_timestamp_key = RedisModel.makeRedisKey(REDIS_KEYS.MessagesByTimestamp, sessionId);
        let message_key = RedisModel.makeRedisKey(REDIS_KEYS.Messages, sessionId);
        let participants_key = RedisModel.makeRedisKey(REDIS_KEYS.SessionParticipants, sessionId);
        //超过最大限制后从mysql获取数据
        if (page * pagesize >= config.sessionConfig.maxMessageCount) {
            self.getMessageFromMySQL(sessionId, page, pagesize, function (err, res) {
                if (!err) {
                    ModelUtil.emitOK(self.eventEmitter, {"status": 200, "data": res});
                } else {
                    ModelUtil.emitOK(self.eventEmitter, {"status": -1, "data": err});
                }
        if (!start_msg_id && !end_msg_id) {
            redis.zrevrangeAsync(message_timestamp_key, 0, 0).then(function (res) {
                start_msg_id = res[0];
                redis.zrangeAsync(message_timestamp_key, 0, 0).then(function (res) {
                    end_msg_id = res[0];
                    self.getMessagesByPage(sessionId, user, start_msg_id, end_msg_id, page, pagesize, function (err, res) {
                        if (err) {
                            logger.error("getMessagesByPage error" + err);
                            ModelUtil.emitError(self.eventEmitter,err,err);
                        } else {
                            ModelUtil.emitOK(self.eventEmitter, res);
                        }
                    })
                })
            })
        } else if (!start_msg_id) {
            redis.zrevrangeAsync(message_timestamp_key, 0, 0).then(function (res) {
                start_msg_id = res[0];
                self.getMessagesByPage(sessionId, user, startMsgId, endMsgId, page, pagesize, function (err, res) {
                    if (err) {
                        logger.error("getMessagesByPage error" + err);
                        ModelUtil.emitError(self.eventEmitter,err,err);
                    } else {
                        ModelUtil.emitOK(self.eventEmitter, res);
                    }
                })
            })
        } else if (!end_msg_id) {
            redis.zrangeAsync(message_timestamp_key, 0, 0).then(function (res) {
                end_msg_id = res[0];
                self.getMessagesByPage(sessionId, user, start_msg_id, end_msg_id, page, pagesize, function (err, res) {
                    if (err) {
                        logger.error("getMessagesByPage error" + err);
                        ModelUtil.emitError(self.eventEmitter,err,err);
                    } else {
                        ModelUtil.emitOK(self.eventEmitter, res);
                    }
                })
            })
        } else {
            if (page > 0) {
                page = page * pagesize;
                pagesize = pagesize + page;
            }
            let participants = new Participants();
            participants.existsParticipant(sessionId, user, function (res) {
                if (!res) {
                    ModelUtil.emitOK(self.eventEmitter, {"status": -1, "msg": "用户不在此会话中!"});
            self.getMessagesByPage(sessionId, user, start_msg_id, end_msg_id, page, pagesize, function (err, res) {
                if (err) {
                    logger.error("getMessagesByPage error" + err);
                    ModelUtil.emitError(self.eventEmitter,err,err);
                } else {
                    //倒序取出最后N条消息
                    redis.zrevrangeAsync(message_timestamp_key, page, pagesize).then(function (res) {
                        //取出消息实体
                        if (res.length == 0) {
                            ModelUtil.emitOK(self.eventEmitter, {"status": 200, "data": []});
                            return;
                        }
                        redis.hmgetAsync(message_key, res).then(function (messages) {
                            console.log(messages)
                            //将取到的消息返回给前端
                            ModelUtil.emitOK(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) {
                        ModelUtil.emitOK(self.eventEmitter, {"status": -1, "msg": res});
                    })
                    ModelUtil.emitOK(self.eventEmitter, res);
                }
            })
        }
    }
    getAllSessionsUnreadMessageCount(){}
    getMessagesByPage(sessionId, user, startMsgId, endMsgId, page, pagesize, handler) {
        let self = this;
        let message_timestamp_key = RedisModel.makeRedisKey(REDIS_KEYS.MessagesByTimestamp, sessionId);
        let message_key = RedisModel.makeRedisKey(REDIS_KEYS.Messages, sessionId);
        let participants_key = RedisModel.makeRedisKey(REDIS_KEYS.SessionParticipants, sessionId);
        let participants = new Participants();
        page = page - 1;
        if (page < 0) {
            page = 0;
        }
        if (page > 0) {
            page = page * pagesize;
            pagesize = pagesize + page;
        }
        participants.existsParticipant(sessionId, user, function (err,res) {
            if (!res) {
                handler("用户不在此会话中!", false);
            } else {
                //将消息ID转换成分值
                redis.zscoreAsync(message_timestamp_key, startMsgId).then(function (res) {
                    let startMsgScore = res;
                    redis.zscoreAsync(message_timestamp_key, endMsgId).then(function (res) {
                        let endMsgScore = res;
                        //倒序取出最后N条消息
                        redis.zrevrangebyscoreAsync(message_timestamp_key, startMsgScore, endMsgScore, "limit", page, pagesize).then(function (res) {
                            //取出消息实体
                            if (res.length == 0) {
                                handler(null, res);
                                return;
                            }
                            redis.hmgetAsync(message_key, res).then(function (messages) {
                                console.log(messages)
                                //将取到的消息返回给前端
                                handler(null, 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) {
                            handler(res, false);
                        })
                    })
                })
            }
        })
    }
    getAllSessionsUnreadMessageCount() {
    }
    /**
     * 获取会话的未读消息数。
@ -295,7 +351,7 @@ class Sessions extends RedisModel {
     * @param sessionId
     * @param userId
     */
    getSessionUnreadMessageCount(sessionId, userId){
    getSessionUnreadMessageCount(sessionId, userId) {
    }
@ -372,13 +428,13 @@ class Sessions extends RedisModel {
                    }
                }).then(function (res) {
                    //更新消息相关
                    return messages.saveMessageToRedis(sessionId,sessionType,messageId, message);
                    return messages.saveMessageToRedis(sessionId, sessionType, messageId, message);
                }).then(function (res) {
                    //更新session的最后一条聊天记录
                    return Messages.updateLastContent(session_key, sessionType, name, message);
                }).then(function (res) {
                    //操作mysql数据库
                    messages.saveMessageToMysql(sessionId, sessionType, messageId, message,function(err,res){
                    messages.saveMessageToMysql(sessionId, sessionType, messageId, message, function (err, res) {
                        //返回数据给前端。
                        handler(null, messageId)
                    });