Prechádzať zdrojové kódy

发送消息无法找到会话时,发送者为系统不做判断

LiTaohong 6 rokov pred
rodič
commit
1457590441

+ 18 - 0
src/server/endpoints/v2/session.endpoint.js

@ -389,6 +389,24 @@ router.get(APIv2.Sessions.Messages, function (req, res) {
});
/**
 * 修改单条消息
 * session_id 会话ID
 * message_id:消息ID
 * content 消息内容
 */
router.post(APIv2.Sessions.MessageUpdate, function (req, res) {
    let payload = req.body;
    let testing = ObjectUtil.fieldsCheck(payload,'session_type', 'session_id','message_id','content');
    if (!testing.pass) {
        throw testing.message;
    }
    let messages = new Messages();
    ControllerUtil.regModelEventHandler(messages, res);
    messages.updateMsgContent(payload.session_type, payload.session_id,payload.message_id, payload.content);
});
router.get(APIv2.Sessions.SessionUnreadMessages, function (req, res) {
    let sessionId = req.params.session_id;
    let userId = req.query.user_id;

+ 1 - 0
src/server/include/endpoints.js

@ -47,6 +47,7 @@ const APIv2 = {
        Messages: '/:session_id/messages',                              // 会话消息
        MessagesByTopic: '/:session_id/topics/:topic_id/messages',      // 议题消息
        Message: '/:session_id/messages/:message_id',                   // 单条消息
        MessageUpdate: '/:session_id/messages/:message_id/update',      // 更新消息内容(消息里有i健康业务状态时)
        SessionsUnreadMessageCount: '/unread_message_count',            // 所有会话的未读消息数
        SessionUnreadMessageCount: '/:session_id/unread_message_count', // 指定会话的未读消息数

+ 20 - 0
src/server/models/messages/messages.js

@ -165,6 +165,26 @@ class Messages extends RedisModel {
        MessageRepo.save(message, sessionType, messageId, sessionId, handler);
    }
    /**
     * 保存Message 到mysql
     * @param message 消息对象
     * @param sessionType
     * @param messageId
     * @param sessionId
     * @param handler
     * @type type 会话类型,1表示MUC会话,2表示P2P,3表示群会话,4表示临时讨论组
     */
    updateMsgContent(sessionType,sessionId, messageId, content,handler) {
        let self = this;
        MessageRepo.updateMsgContent(sessionType,sessionId, messageId, content, function (err, res) {
            if (err) {
                ModelUtil.emitError(self.eventEmitter, {message: "update message content failed: " + err});
            } else {
                ModelUtil.emitOK(self.eventEmitter, {status: 200,data: content});
            }
        });
    }
    /**
     * 更新会话最后一条消息
     *

+ 1 - 1
src/server/models/sessions/participants.js

@ -269,7 +269,7 @@ class Participants extends RedisModel {
                if(oldUserId){
                    redis.hgetAsync(participantsRoleKey,oldUserId).then(function(role){
                        if(!role)role = 0;
                        self.addUser(session.id,userId,role,function(err,addResult){
                        self.deleteUserFromMysql(session.id,userId,function(err,addResult){
                            if(err){
                                ModelUtil.emitOK(self.eventEmitter, {status:-1,message: "会话成员添加失败!"});
                                return;

+ 7 - 5
src/server/models/sessions/sessions.js

@ -827,6 +827,7 @@ class Sessions extends RedisModel {
        let message_timestamp_key = RedisModel.makeRedisKey(REDIS_KEYS.MessagesByTimestamp, sessionId);
        if (!start_msg_id && !end_msg_id) {
            redis.zrevrangeAsync(message_timestamp_key, 0, 0).then(function (res) {
                log.info("session.js--830---getMessages  res.length: " + res.length);
                if (res.length == 0) {
                    //修复应redis没有缓冲聊天记录导致会话列表加载不出来
                    // cache messages
@ -994,7 +995,7 @@ class Sessions extends RedisModel {
        }
        participants.existsParticipant(sessionId, userId, function (err, res) {
            if (!res) {
            if (! res[0].exist || userId != "system") {
                handler(Error("User not found in session " + sessionId), null);
            } else {
                //将消息ID转换成分值
@ -1281,8 +1282,8 @@ class Sessions extends RedisModel {
                ModelUtil.emitError(self.eventEmitter, "Check session participant failed: ", err);
                return;
            }
            if (res) {
            logger.info("session.js--1285--res[0].exist" + res[0].exist);
            if ( res[0].exist || userId == "system") {
                redis.hmgetAsync(sessionKey, ["type", "name"]).then(function (res) {
                    sessionType = res[0];
                    let sessionName = res[1];
@ -1394,7 +1395,7 @@ class Sessions extends RedisModel {
        }
        // 发送成员必须处于会话中
        participants.existsParticipant(sessionId, message.sender_id, function (err, res) {
            if (res) {
            if ( res[0].exist || userId == "system") {
                redis.hmgetAsync(session_key, ["type", "name"]).then(function (res) {
                    sessionType = res[0];
                    sessionName = res[1];
@ -1473,7 +1474,8 @@ class Sessions extends RedisModel {
        }
        // 发送成员必须处于会话中
        participants.existsParticipant(sessionId, message.sender_id, function (err, res) {
            if (res.exist) {
            log.info("session.js--1477--res[0].exist" + res[0].exist);
            if (res[0].exist || userId == "system") {
                redis.hmgetAsync(session_key, ["type", "name"]).then(function (res) {
                    sessionType = res[0];
                    sessionName = res[1];

+ 1 - 0
src/server/models/sessions/topics.js

@ -289,6 +289,7 @@ class Topics extends RedisModel {
                }else{
                    self.saveTopicToRedis(topicName, topicId, sessionId, messages, datetime, function (err, startMsgId) {
                        if (err) {
                            log.error(err);
                            ModelUtil.emitOK(self.eventEmitter, {status: -1, message: "议题创建失败!"});
                            return;
                        }

+ 22 - 0
src/server/repository/mysql/message.repo.js

@ -100,6 +100,28 @@ class MessageRepo {
        }
    }
    /**
     * 修改消息内容
     *
     * @param message 消息对象
     * @param sessionType 会话类型,参见 SESSIONS_TYPES
     * @param messageId
     * @param sessionId
     * @param handler
     */
    static updateMsgContent(sessionType, sessionId,messageId, content,handler) {
        let sql = "UPDATE " + DB_TABLES.sessionTypeToTableName(sessionType)  + " set content =  ? , timestamp = ? where id = ? and session_id = ?";
        log.info(sql);
        ImDb.execQuery({
            "sql": sql,
            "args": [content,new Date(), messageId,sessionId],
            "handler": handler || function (err, res) {
                if (err) log.error(err);
            }
        });
    }
    /**
     * 获取会话医生的id
     * @param sessionId