8 rokov pred
rodič
commit
55d6614f9b

+ 2 - 1
src/server/app.js

@ -27,6 +27,7 @@ let application = require('./endpoints/application.endpoint');
let users = require('./endpoints/users.endpoint');
let groups = require('./endpoints/groups.endpoint');
let chats = require('./endpoints/chats.endpoint');
let sessions = require('./endpoints/session.endpoint');
let management = require('./endpoints/management.endpoint');
// handlers
@ -61,7 +62,7 @@ app.use(APIv1.Chats.Base, chats);
app.use(APIv1.Users.Base, users);
app.use(APIv1.Groups.Base, groups);
app.use(APIv1.Management.Base, management);
app.use(APIv1.Sessions.Base,sessions);
// error handler, only handle the sync call exception
app.use(function (err, req, res, next) {
    if (err) {

+ 216 - 8
src/server/endpoints/session.endpoint.js

@ -8,17 +8,225 @@
let express = require('express');
let router = express.Router();
let http = require('http');
let log = require('../util/log.js');
let ObjectUtil = require("../util/object.util.js");
let ControllerUtil = require('../util/controller.util');
let configFile = require('../include/commons').CONFIG_FILE;
let config = require('../resources/config/' + configFile);
let log = require("../util/log.js");
let objectUtil = require('../util/object.util');
let Sessions = require('../models/sessions/sessions');
let Participants = require('../models/sessions/participants');
const APIv1 = require('../include/endpoints').APIv1;
const CONTENT_TYPES = require('../include/commons').CONTENT_TYPE;
const MAX_INT = require('../include/commons').MAX_INT;
const DEFAULT_PAGE_SIZE = require('../include/commons').DEFAULT_PAGE_SIZE;
let Users = require('../models/user/users');
const APIv1 = require('../include/endpoints').APIv1;
const MODEL_EVENTS = require('../include/commons').MODEL_EVENTS;
/**
 * 获取用户的聊天列表
 * 请求URL /sessions?page=0&pagesize=10&user=3121
 */
router.get(APIv1.Sessions.SessionList,function(req,res){
    let page = req.query.page;
    let pagesize = req.query.pagesize;
    let user = req.query.user;
    if (!page) {
        throw {httpStatus: 406, message: 'Missing page.'};
    }
    if (!pagesize) {
        throw {httpStatus: 406, message: 'Missing pagesize.'};
    }
    if (!user) {
        throw {httpStatus: 406, message: 'Missing user.'};
    }
    let sessions = new Sessions();
    ControllerUtil.regModelEventHandler(sessions, res);
    sessions.getUserSessions(user,page,pagesize);
})
/**
 * 获取用户的聊天信息列表
 * 请求URL /messages?page=0&pagesize=10&user=3121&sessionId=testsessionmsg1
 */
router.get(APIv1.Sessions.MessageList,function(req,res){
    let page = req.query.page;
    let pagesize = req.query.pagesize;
    let user = req.query.user;
    let sessionId =req.query.sessionId;
    if (!page) {
        throw {httpStatus: 406, message: 'Missing page.'};
    }
    if (!pagesize) {
        throw {httpStatus: 406, message: 'Missing pagesize.'};
    }
    if (!user) {
        throw {httpStatus: 406, message: 'Missing user.'};
    }
    if (!sessionId) {
        throw {httpStatus: 406, message: 'Missing sessionId.'};
    }
    let sessions = new Sessions();
    ControllerUtil.regModelEventHandler(sessions, res);
    sessions.getSessionMessages(sessionId,user,page,pagesize);
})
/**
 * 某个聊天记录置顶操作
 * 请求URL /stick?user=3121&sessionId=testsessionmsg1
 */
router.post(APIv1.Sessions.StickSession,function(req,res){
    let user = req.query.user;
    let sessionId =req.query.sessionId;
    if (!user) {
        throw {httpStatus: 406, message: 'Missing user.'};
    }
    if (!sessionId) {
        throw {httpStatus: 406, message: 'Missing sessionId.'};
    }
    let sessions = new Sessions();
    ControllerUtil.regModelEventHandler(sessions, res);
    sessions.stickSession(sessionId,user);
})
/**
 * 取消置顶
 * 请求URL /cancelStick?user=3121&sessionId=testsessionmsg1
 */
router.post(APIv1.Sessions.UnStickSession,function(req,res){
    let user = req.query.user;
    let sessionId =req.query.sessionId;
    if (!user) {
        throw {httpStatus: 406, message: 'Missing user.'};
    }
    if (!sessionId) {
        throw {httpStatus: 406, message: 'Missing sessionId.'};
    }
    let sessions = new Sessions();
    ControllerUtil.regModelEventHandler(sessions, res);
    sessions.cancelStickSession(sessionId,user);
})
/**
 * 创建讨论组
 * sessionType:1表示MUC会话,2表示P2P,3表示群会话,4表示临时讨论组
 * users 讨论组包含的用户标示
 * sessionId 会话ID
 * 请求URL /create?sessionId=0&users=10&name=3121&sessionType=2
 */
router.post(APIv1.Sessions.CreateSession,function(req,res){
    let sessionId = req.query.sessionId;
    let users = req.query.users;
    let name = req.query.name;
    let sessionType = req.query.sessionType;
    if (!sessionId) {
        throw {httpStatus: 406, message: 'Missing sessionId.'};
    }
    if (!users) {
        throw {httpStatus: 406, message: 'Missing users.'};
    }
    if (!name) {
        throw {httpStatus: 406, message: 'Missing name.'};
    }
    if (!sessionType) {
        throw {httpStatus: 406, message: 'Missing sessionType.'};
    }
    let sessions = new Sessions();
    ControllerUtil.regModelEventHandler(sessions, res);
    sessions.createSessions(sessionId,name,sessionType,users);
})
/**
 * 发送消息
 * message:消息发送对象
 * sessionId 会话ID
 */
router.post(APIv1.Sessions.SendMsg,function(req,res){
    let message = req.body;
    if (!ObjectUtil.isJsonObject(message)) {
        throw {httpStatus: 406, message: 'Problems parsing JSON.'}
    }
    // 字段判断
    let testing = ObjectUtil.fieldsCheck(message, "senderId", "senderName", "contentType", "content");
    if (!testing.pass) {
        throw {httpStatus: 406, message: testing.message}
    }
    let sessionId = req.query.sessionId;
    if (!sessionId) {
        throw {httpStatus: 406, message: 'Missing sessionId.'};
    }
    let sessions = new Sessions();
    ControllerUtil.regModelEventHandler(sessions, res);
    message.timestamp=new Date();
    sessions.saveMessageBySession(message,sessionId);
})
/**
 * 发送消息
 * message:消息发送对象
 * sessionId 会话ID
 */
router.post(APIv1.Sessions.SendMsg,function(req,res){
    let message = req.body;
    if (!ObjectUtil.isJsonObject(message)) {
        throw {httpStatus: 406, message: 'Problems parsing JSON.'}
    }
    // 字段判断
    let testing = ObjectUtil.fieldsCheck(message, "senderId", "senderName", "contentType", "content");
    if (!testing.pass) {
        throw {httpStatus: 406, message: testing.message}
    }
    let sessionId = req.query.sessionId;
    if (!sessionId) {
        throw {httpStatus: 406, message: 'Missing sessionId.'};
    }
    let sessions = new Sessions();
    ControllerUtil.regModelEventHandler(sessions, res);
    message.timestamp=new Date();
    sessions.saveMessageBySession(message,sessionId);
})
/**
 * 移除人员
 * user:移除的人员
 * sessionId 会话ID
 */
router.post(APIv1.Sessions.RemoveSessionUser,function(req,res){
    let user = req.query.user;
    if (!user) {
        throw {httpStatus: 406, message: 'Missing user.'};
    }
    let sessionId = req.query.sessionId;
    if (!sessionId) {
        throw {httpStatus: 406, message: 'Missing sessionId.'};
    }
    let participants = new Participants();
    ControllerUtil.regModelEventHandler(sessions, res);
    participants.deleteUser(sessionId,user);
})
/**
 * 移除人员
 * user:移除的人员
 * sessionId 会话ID
 */
router.post(APIv1.Sessions.PushSessionUser,function(req,res){
    let user = req.query.user;
    if (!user) {
        throw {httpStatus: 406, message: 'Missing user.'};
    }
    let sessionId = req.query.sessionId;
    if (!sessionId) {
        throw {httpStatus: 406, message: 'Missing sessionId.'};
    }
    let participants = new Participants();
    ControllerUtil.regModelEventHandler(sessions, res);
    participants.pushUser(sessionId,user);
})
router.get(APIv1.Chats)
module.exports = router;

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

@ -75,6 +75,26 @@ const APIv1 = {
        Base: '/api/v1/push',
        Getui: '/getui'
    },
    Sessions:{
        Base:'/api/v1/session',//基础连接
        SessionList:'/sessions', //获取会话列表
        MessageList:'/messages', //获取消息列表
        SendMsg:'/send', //发送消息
        CreateSession:'/create',//创建会话
        StickSession:'/stick', //会话置顶
        UnStickSession:'/cancelStick',//取消置顶
        PushSessionUser:'/push',//往Session里面push人员
        RemoveSessionUser:'/remove'//将人员从session中移除
    }
};

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

@ -106,7 +106,7 @@ class Participants extends RedisModel {
     * @param users
     */
    createParticipantsToMysql(session_id,users){
        return createParticipantsToMysql(session_id,users);
        return ParticipantRepo.createParticipantsToMysql(session_id,users);
    }
    /**
@ -117,6 +117,61 @@ class Participants extends RedisModel {
        return true;
    }
    /**
     * 移除讨论组成员
     * @param sessionId
     * @param user
     */
    deleteUser(sessionId,user){
        let self = this;
        let participants_key = super.makeRedisKey(RedisKeys.Participants,sessionId);
        let user_session_key = super.makeRedisKey(RedisKeys.UsersSessions,user);
        //1.移除SESSION成员表中的成员信息
        redis.zremAsync(participants_key,user).then(function(res){
            log.info("remove participants:"+res);
            //2.删除对应人员的Session列表
            redis.zremAsync(user_session_key,sessionId).then(function(res){
                log.info("remove user_session:"+res);
                //3.移除数据库中的人员记录
                self.deleteUserFromMysql(sessionId,user);
                modelUtil.emitData(self.eventEmitter,{"status":200,"msg":"人员删除成功!"});
            }).catch(function(err){
                modelUtil.emitData(self.eventEmitter,{"status":-1,"msg":"人员删除失败!"+err});
            })
        }).catch(function(err){
            modelUtil.emitData(self.eventEmitter,{"status":-1,"msg":"人员删除失败!"+err});
        })
    }
    /**
     * 添加讨论组成员
     * @param sessionId
     * @param user
     */
    pushUser(sessionId,user){
        let self = this;
        let users = [];
        users.push(user);
        self.createParticipantsToRedis(sessionId,users,new Date(),function(res){
            if(res){
                self.createParticipantsToMysql(sessionId,users);
            }else{
                modelUtil.emitData(self.eventEmitter,{"status":-1,"msg":"人员添加失败!"});
            }
        })
    }
    /**
     * user从数据库中删除
     * @param sessionId 会话
     * @param user 用户
     */
    deleteUserFromMysql(sessionId,user){
        ParticipantRepo.deleteUserFromMysql(sessionId,user);
    }
}
// Expose class

+ 15 - 0
src/server/repository/mysql/participant.repo.js

@ -99,6 +99,21 @@ class ParticipantRepo {
        });
        return true;
    }
    static deleteUserFromMysql(sessionId,User){
        let sql ="delete from "+IMTABLE.PARTICIPANTS+" where user_id=? and session_id=? ";
        ImDb.execQuery({
            "sql": sql,
            "args": [user,sessionId],
            "handler": function (err, res) {
                if(err) {
                    log.error("sql:"+sql+"data:sessionId:"+sessionId+",user:"+user);
                }else{
                    log.info("delete deleteUser to mysql is success by session :"+sessionId);
                }
            }
        });
    }
}
module.exports = ParticipantRepo;

+ 1 - 0
src/server/repository/mysql/session.repo.js

@ -126,6 +126,7 @@ class SessionRepo {
            }
        });
    }
}
module.exports = SessionRepo;

+ 1 - 0
src/server/resources/config/config.dev.js

@ -88,3 +88,4 @@ exports.geTuiAppStoreCfg = geTuiAppStoreCfg;
exports.wlyyServerConfig = wlyyServerConfig;
exports.transServerConfig = transServerConfig;
exports.wechatConfig = wechatConfig;
exports.sessionConfig = sessionConfig;

+ 8 - 1
src/server/resources/config/config.prod.js

@ -64,6 +64,12 @@ let wechatConfig = {
    }
};
let sessionConfig = {
    maxMessageCount: 1000,
    maxMessageTimespan: 7 * 24 * 3600
};
exports.app = 'im.server';
exports.version = '1.2.7';
exports.debug = true;
@ -79,4 +85,5 @@ exports.geTuiConfig = geTuiConfig;
exports.geTuiAppStoreCfg = geTuiAppStoreCfg;
exports.wlyyServerConfig = wlyyServerConfig;
exports.transServerConfig = transServerConfig;
exports.wechatConfig = wechatConfig;
exports.wechatConfig = wechatConfig;
exports.sessionConfig = sessionConfig;

+ 6 - 2
src/server/resources/config/config.test.js

@ -63,7 +63,10 @@ let wechatConfig = {
        consultTemplate: 'qSOW0DBxO3qEBm4ucG0Ial0jxsOyD7_f2TFK5e-mQEc'  // 咨询回复模板
    }
};
let sessionConfig = {
    maxMessageCount: 1000,
    maxMessageTimespan: 7 * 24 * 3600
};
exports.app = 'im.server';
exports.version = '1.0.2.20160805';
exports.debug = true;
@ -79,4 +82,5 @@ exports.geTuiConfig = geTuiConfig;
exports.geTuiAppStoreCfg = geTuiAppStoreCfg;
exports.wlyyServerConfig = wlyyServerConfig;
exports.transServerConfig = transServerConfig;
exports.wechatConfig = wechatConfig;
exports.wechatConfig = wechatConfig;
exports.sessionConfig = sessionConfig;