ソースを参照

增加搜索接口,可以搜索:会话,医生及消息'

Sand 8 年 前
コミット
de2e5a6688

+ 36 - 3
src/client/im.client.js

@ -76,7 +76,9 @@ var ENDPOINTS = {
        Participant: '/sessions/:session_id/participants/:participant_id',
        ParticipantAvatar: '/session/:session_id/participants/:participant_id/avatars'
    },
    Search: {}
    Search: {
        Search: "/search"
    }
};
var httpClient = {
@ -393,14 +395,45 @@ var imClient = {
        // TEST!PASS 获取最近7天内的会话列表
        getRecentSessions: function (userId, success, failure) {
            "use strict";
            httpClient.get(ENDPOINTS.Sessions.RecentSessions,
                {user_id: userId, date_span: 7},
                success,
                failure);
        }
    },
    Search: {}
    Search: {
        // 搜索所有对象:医生,会话及消息
        searchAll: function (userId, keyword, success, failure) {
            httpClient.get(ENDPOINTS.Search.Search,
                {user_id: userId, target: 'all', keyword: keyword},
                success,
                failure);
        },
        // 搜索医生
        searchDoctors: function (keyword, page, size, success, failure) {
            httpClient.get(ENDPOINTS.Search.Search,
                {target: 'doctor', keyword: keyword, page: page, size: size},
                success,
                failure);
        },
        // 搜索会话
        searchSessions: function (keyword, page, size, success, failure) {
            httpClient.get(ENDPOINTS.Search.Search,
                {target: 'session', keyword: keyword, page: page, size: size},
                success,
                failure);
        },
        // 搜索会话消息
        searchMessages: function (keyword, page, size, success, failure) {
            httpClient.get(ENDPOINTS.Search.Search,
                {target: 'message', keyword: keyword, page: page, size: size},
                success,
                failure);
        }
    }
};
if (typeof process !== 'undefined') {

+ 36 - 2
src/server/endpoints/v2/search.endpoint.js

@ -1,5 +1,5 @@
/**
 * 会话接口。
 * 搜索接口。
 *
 * author: Sand
 * since: 12/15/2016
@ -9,11 +9,45 @@
let express = require('express');
let router = express.Router();
let ControllerUtil = require("../../util/controller.util.js");
let MySqlSearcher = require('../../models/search/mysql.searcher');
/**
 * 搜索
 * 搜索API。
 *
 * 参数:
 *  target: all/doctor/session/message
 *  keyword: 关键字
 *  page: 第几页,从1开始,当target为all时无效
 *  size: 页大小,当target为all时无效
 *
 * URL:
 *  /search?target=all&keyword=张&page
 */
router.get("/", function (req, res) {
    ControllerUtil.checkRequestQueryParams(req, ['user_id', 'target', 'keyword']);
    let userId = req.query.user_id;
    let target = req.query.target;
    let keyword = req.query.keyword;
    let page = req.query.page;
    let size = req.query.size;
    page = page ? parseInt(page) - 1 : 0;
    size = size ? parseInt(size) : 10;
    let searcher = new MySqlSearcher();
    ControllerUtil.regModelEventHandler(searcher, res);
    if(target == 'all'){
        searcher.searchAll(userId, searcher, keyword);
    } else if(target == 'doctor'){
        searcher.searchDoctors(keyword, page, size)
    } else if(target == 'sessions'){
        searcher.searchSessions(userId, keyword, page, size);
    } else if(target == 'message'){
        searcher.searchMessages(userId, keyword, page, size);
    }
});
module.exports = router;

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

@ -49,7 +49,7 @@ const APIv2 = {
        ParticipantAvatar: '/:session_id/participants/:participant_id/avatars'  // 会话单个成员头像
    },
    Search: {
        Base: '/api/v2/search'                                          // 搜索,语法借鉴ElasticSearch
        Base: '/api/v2/search'                                          // 搜索,下一版本的语法使用ElasticSearch
    }
};

+ 149 - 0
src/server/models/search/mysql.searcher.js

@ -0,0 +1,149 @@
/**
 * 用户、会话及消息搜索。
 *
 * 注意:此模型效率堪忧,但为了实现先这样做。更稳妥的方案是使用Solr或Elastic Search
 * 为数据提供索引功能,JS使用搜索接口搜索之后再取得对象的ID进行获取,提高效率。
 * 后续开发都希望看到这段注释,实现此方案。
 *
 * author: Sand
 * since: 2016.11.20
 */
"use strict";
let BaseModel = require('../base.model');
let SearchRepo = require('../../repository/mysql/search.repo');
let ModelUtil = require("../../util/model.util");
let async = require("async");
class MySqlSearcher extends BaseModel {
    constructor() {
        super();
    }
    /**
     * 一次性搜索所有对象。
     *
     * @param userId
     * @param keyword
     */
    searchAll(userId, keyword){
        let self = this;
        async.waterfall([
            function (callback) {
                self.searchDoctors(keyword, 0, 3, function (err, doctors) {
                    if(err) return callback(err, null);
                    let data = [];
                    doctors.forEach(function (doctor) {
                        data.push(doctor);
                    });
                    callback(null, data);
                });
            },
            function (data, callback) {
                self.searchSessions(userId, keyword, 0, 2, function (err, sessions) {
                    if(err) return callback(err, null);
                    sessions.forEach(function (session) {
                        data.push(session);
                    });
                    callback(null, data);
                });
            },
            function (data, callback) {
                self.searchMessages(userId, keyword, 0, 3, function (err, sessions) {
                    if(err) return callback(err, null);
                    sessions.forEach(function (session) {
                        data.push(session);
                    });
                    callback(null, data);
                });
            }
        ],
        function (err, res) {
            if(err) {
                ModelUtil.emitError(self.eventEmitter, "Search all object types failed", err);
            } else {
                ModelUtil.emitOK(self.eventEmitter, res);
            }
        });
    }
    /**
     * 医生搜索。
     *
     * @param keyword
     * @param page
     * @param size
     * @param handler
     */
    searchDoctors(keyword, page, size, handler) {
        let self = this;
        SearchRepo.searchDoctors(keyword, page, size, function (err, users) {
            if (handler) {
                handler(err, users);
            } else {
                if (err) {
                    ModelUtil.emitError(self.eventEmitter, "Search doctors failed", err);
                } else {
                    ModelUtil.emitOK(self.eventEmitter, users);
                }
            }
        });
    }
    /**
     * 会话搜索。
     *
     * @param userId
     * @param keyword
     * @param page
     * @param size
     * @param handler
     */
    searchSessions(userId, keyword, page, size, handler) {
        let self = this;
        SearchRepo.searchSessions(userId, keyword, page, size, function (err, sessions) {
            if (handler) {
                handler(err, sessions);
            } else {
                if (err) {
                    ModelUtil.emitError(self.eventEmitter, "Search sessions failed", err);
                } else {
                    ModelUtil.emitOK(self.eventEmitter, sessions);
                }
            }
        });
    }
    /**
     * 搜索会话消息。
     *
     * @param userId
     * @param keyword
     * @param page
     * @param size
     * @param handler
     */
    searchMessages(userId, keyword, page, size, handler) {
        let self = this;
        SearchRepo.searchMessages(userId, keyword, page, size, function (err, messages) {
            if (handler) {
                handler(err, messages);
            } else {
                if (err) {
                    ModelUtil.emitError(self.eventEmitter, "Search sessions failed", err);
                } else {
                    ModelUtil.emitOK(self.eventEmitter, messages);
                }
            }
        });
    }
}
module.exports = MySqlSearcher;

+ 0 - 387
src/server/models/search/search.js

@ -1,387 +0,0 @@
/**
 * 患者、讨论组搜索。
 *
 * 注意:此模型效率堪忧,但为了实现先这样做。更稳妥的方案是使用Solr或Elastic Search
 * 为数据提供索引功能,JS使用搜索接口搜索之后再取得对象的ID进行获取,提高效率。
 * 后续开发都希望看到这段注释,实现此方案。
 *
 * author: Sand
 * since: 2016.11.20
 */
"use strict";
let BaseModel = require('../base.model');
let searchRepo = require('../../repository/mysql/search.repo');
let modelUtil = require("../../util/model.util");
let objectUtil = require('../../util/object.util');
class Search extends BaseModel {
    constructor() {
        super();
    }
    /**
     * 搜索患者相关的数据,包括患者信息与相关的私信记录。关键词不支持空格拆分。
     */
    searchAboutPatient(userId, userRole, keyword) {
        let self = this;
        searchRepo.searchPatients(userId, userRole, keyword, function (err, patients) {
            if (err) {
                modelUtil.emitError(self.eventEmitter, "Search patient on basic information failed", err);
                return;
            }
            var data = {patients: [], group: [], chats: []};
            for (var i = 0; i < patients.length; ++i) {
                var patient = patients[i];
                var p = {};
                console.log(patient.code);
                p = {
                    code: patient.code,
                    name: patient.name,
                    sex: patient.sex,
                    birthday: objectUtil.timestampToLong(patient.birthday),
                    avatar: patient.photo === null ? "" : patient.photo
                };
                data.patients.push(p);
            }
            searchRepo.searchGroupPatients(userId, keyword, function (err, groups) {
                if (err) {
                    modelUtil.emitError(self.eventEmitter, "Search talk group failed", err);
                    return;
                }
                var group = null;
                for (var i = 0; i < groups.length; ++i) {
                    var t = groups[i];
                    group = {
                        code: t.code,
                        name: t.name,
                        members: t.con,
                    };
                    data.group.push(group);
                }
                searchRepo.searchPatientPM(userId, keyword, function (err, chats) {
                    if (err) {
                        modelUtil.emitError(self.eventEmitter, "Search patient on private messages failed", err);
                        return;
                    }
                    for (var i = 0; i < chats.length; ++i) {
                        var lastPatient = {
                            code: '',
                            name: '',
                            sex: '',
                            avatar: '',
                            amount: '',
                            content: '',
                            chat: '',
                            type: ''
                        };
                        var chat = chats[i];
                        console.log(JSON.stringify(chat));
                        lastPatient.code = chat.code;
                        lastPatient.name = chat.name;
                        lastPatient.sex = chat.sex;
                        lastPatient.birthday = objectUtil.timestampToLong(chat.birthday);
                        lastPatient.avatar = chat.photo === null ? "" : chat.photo;
                        lastPatient.amount = chat.amount;
                        lastPatient.chat = chat.chat;
                        lastPatient.content = chat.content;
                        lastPatient.type = chat.type;
                        lastPatient.msg_id = chat.msg_id;
                        data.chats.push(lastPatient);
                    }
                    modelUtil.emitOK(self.eventEmitter, data);
                });
            });
        });
    }
    /**
     * 患者查询查看更多1.患者 2.内容 3.群组
     * @param userId
     * @param userRole
     * @param keyword
     * @param type
     */
    searchAboutPatientAll(userId, userRole, keyword, type) {
        let self = this;
        var data = [];
        if (type == 1) {
            searchRepo.searchPatients(userId, userRole, keyword, function (err, patients) {
                if (err) {
                    modelUtil.emitError(self.eventEmitter, "Search patient on basic information failed", err);
                    return;
                }
                for (var i = 0; i < patients.length; ++i) {
                    var patient = patients[i];
                    data.push({
                        code: patient.code,
                        name: patient.name,
                        sex: patient.sex,
                        birthday: objectUtil.timestampToLong(patient.birthday),
                        avatar: patient.photo === null ? "" : patient.photo
                    });
                }
                modelUtil.emitOK(self.eventEmitter, data);
            });
        }
        if (type == 3) {
            searchRepo.searchPatientPM(userId, keyword, function (err, chats) {
                if (err) {
                    modelUtil.emitError(self.eventEmitter, "Search patient on private messages failed", err);
                    return;
                }
                for (var i = 0; i < chats.length; ++i) {
                    var lastPatient = {
                        code: '',
                        name: '',
                        sex: '',
                        avatar: '',
                        amount: '',
                        content: '',
                        chat: '',
                        type: ''
                    };
                    var chat = chats[i];
                    lastPatient.code = chat.code;
                    lastPatient.name = chat.name;
                    lastPatient.sex = chat.sex;
                    lastPatient.birthday = objectUtil.timestampToLong(chat.birthday);
                    lastPatient.avatar = chat.photo === null ? "" : chat.photo;
                    lastPatient.amount = chat.amount;
                    lastPatient.chat = chat.chat;
                    lastPatient.content = chat.content;
                    lastPatient.type = chat.type;
                    data.push(lastPatient);
                }
                modelUtil.emitOK(self.eventEmitter, data);
            });
        }
        if (type == 2) {
            searchRepo.searchGroupPatients(userId, keyword, function (err, groups) {
                if (err) {
                    modelUtil.emitError(self.eventEmitter, "Search talk group failed", err);
                    return;
                }
                var group = null;
                for (var i = 0; i < groups.length; ++i) {
                    var t = groups[i];
                    group = {
                        code: t.code,
                        name: t.name,
                        members: t.con,
                    };
                    data.push(group);
                }
                modelUtil.emitOK(self.eventEmitter, data);
            });
        }
    }
    /**
     * 过滤某个聊天组的详细信息
     * @param userId
     * @param keyword
     * @param groupId
     * @param type
     */
    searchAboutPatientList(userId, keyword, groupId, type) {
        let self = this;
        searchRepo.searchPatientPMList(userId, keyword, groupId, type, function (err, chats) {
            var data = [];
            if (err) {
                modelUtil.emitError(self.eventEmitter, "Search searchPatientPMList on private messages failed", err);
                return;
            }
            for (var i = 0; i < chats.length; ++i) {
                var lastPatient = {code: '', name: '', sex: '', avatar: '', chat: '', content: ''};
                var chat = chats[i];
                lastPatient.code = chat.code;
                lastPatient.name = chat.name;
                lastPatient.sex = chat.sex;
                lastPatient.birthday = objectUtil.timestampToLong(chat.birthday);
                lastPatient.avatar = chat.photo === null ? "" : chat.photo;
                lastPatient.chat = chat.chat;
                lastPatient.content = chat.content;
                lastPatient.msg_id = chat.msg_id;
                data.push(lastPatient);
            }
            modelUtil.emitOK(self.eventEmitter, data);
        })
    }
    /**
     * 搜索医生相关的数据,包括医生信息与相关的聊天记录,包括私信与群信。
     */
    searchAboutDoctor(userId, keyword) {
        let self = this;
        //搜索单对单医生聊天
        searchRepo.searchP2Pdoctors(userId, keyword, function (err, doctors) {
            if (err) {
                modelUtil.emitError(self.eventEmitter, "Search doctor on basic information failed", err);
                return;
            }
            var data = {doctors: [], groups: [], content: []};
            for (var i = 0; i < doctors.length; ++i) {
                var doctor = doctors[i];
                data.doctors.push({
                    code: doctor.code,
                    name: doctor.name,
                    hospitalName: doctor.hospital_name,
                    sex: doctor.sex,
                    avatar: doctor.photo === null ? "" : doctor.photo
                });
            }
            // 搜索讨论组名称及成员名称(讨论组)
            searchRepo.searchGroupDoctors(userId, keyword, function (err, groups) {
                if (err) {
                    modelUtil.emitError(self.eventEmitter, "Search talk group failed", err);
                    return;
                }
                var group = null;
                for (var i = 0; i < groups.length; ++i) {
                    var t = groups[i];
                    group = {
                        code: t.code,
                        name: t.name,
                        members: t.con,
                        groupType: t.group_type
                    };
                    data.groups.push(group);
                }
                // 搜索医生间的私信
                searchRepo.searchDoctorsContent(userId, keyword, function (err, messages) {
                    if (err) {
                        modelUtil.emitError(self.eventEmitter, "Search doctor private messages failed", err);
                        return;
                    }
                    var message = null;
                    for (var i = 0; i < messages.length; ++i) {
                        var t = messages[i];
                        message = {
                            code: t.code,
                            name: t.name,
                            amount: t.amount,
                            content: t.content,
                            type: t.type,
                            msg_id: t.msg_id,
                            groupType: t.group_type,
                            avatar: t.photo
                        };
                        data.content.push(message);
                    }
                    modelUtil.emitOK(self.eventEmitter, data);
                });
            });
        });
    }
    searchDoctorMore(userId, keyword, type) {
        let self = this;
        var data = [];
        if (type == 1) {
            searchRepo.searchP2Pdoctors(userId, keyword, function (err, doctors) {
                if (err) {
                    modelUtil.emitError(self.eventEmitter, "Search doctor on basic information failed", err);
                    return;
                }
                for (var i = 0; i < doctors.length; ++i) {
                    var doctor = doctors[i];
                    data.push({
                        code: doctor.code,
                        name: doctor.name,
                        hospitalName: doctor.name,
                        sex: doctor.sex,
                        avatar: doctor.photo === null ? "" : doctor.photo
                    });
                }
                modelUtil.emitOK(self.eventEmitter, data);
            });
        } else if (type == 2) {
            searchRepo.searchGroupDoctors(userId, keyword, function (err, groups) {
                if (err) {
                    modelUtil.emitError(self.eventEmitter, "Search talk group failed", err);
                    return;
                }
                var group = null;
                for (var i = 0; i < groups.length; ++i) {
                    var t = groups[i];
                    group = {
                        code: t.code,
                        name: t.name,
                        members: t.con,
                        groupType: t.group_type
                    };
                    data.push(group);
                }
                modelUtil.emitOK(self.eventEmitter, data);
            });
        } else if (type == 3) {
            searchRepo.searchDoctorsContent(userId, keyword, function (err, messages) {
                if (err) {
                    modelUtil.emitError(self.eventEmitter, "Search doctor private messages failed", err);
                    return;
                }
                var message = null;
                for (var i = 0; i < messages.length; ++i) {
                    var t = messages[i];
                    message = {
                        code: t.code,
                        name: t.name,
                        amount: t.amount,
                        content: t.content,
                        type: t.type,
                        msg_id: t.msg_id,
                        groupType: t.group_type,
                        avatar:t.photo
                    };
                    data.push(message);
                }
                modelUtil.emitOK(self.eventEmitter, data);
            });
        }
    }
    /**
     * 搜索医生聊天详情
     * @param userId 当前医生ID
     * @param keyword 关键字
     * @param groupcode 群组code
     * @param type type =1 p2p type = 2群组
     */
    searchDoctorContentDetail(userId, keyword, groupcode, type) {
        let self = this;
        var data = [];
        searchRepo.searchDoctorsContentDetail(userId, keyword, groupcode, type, function (err, doctors) {
            if (err) {
                modelUtil.emitError(self.eventEmitter, "Search doctor on basic information failed", err);
                return;
            }
            for (var i = 0; i < doctors.length; ++i) {
                var doctor = doctors[i];
                data.push({
                    code: doctor.code,
                    name: doctor.name,
                    content: doctor.content,
                    msg_id: doctor.msg_id,
                    avatar: doctor.photo,
                    groupType: doctor.group_type
                });
            }
            modelUtil.emitOK(self.eventEmitter, data);
        });
    }
}
module.exports = Search;

ファイルの差分が大きいため隠しています
+ 46 - 244
src/server/repository/mysql/search.repo.js


+ 64 - 0
test/client/im.client.search.Test.js

@ -0,0 +1,64 @@
"use strict";
let assert = require('assert');
let imClient = require('../../src/client/im.client');
let userId = 'D2016008240002';
describe('API: Search', function () {
    // 搜索所有
    describe('search all object types', function () {
        it('should return 200', function (done) {
            imClient.Search.searchAll(userId, '哦',
            function (data) {
                assert(data.length > 0, "Search must return at least one data");
            },
            function (xhr, status, error) {
                assert.ok(false, xhr.responseJSON.message);
                done();
            });
        });
    });
    // 搜索医生
    describe('search doctors', function () {
        it('should return 200', function (done) {
            imClient.Search.searchDoctors('张',
                function (data) {
                    assert(data.length > 0, "Search must return at least one data");
                },
                function (xhr, status, error) {
                    assert.ok(false, xhr.responseJSON.message);
                    done();
                });
        });
    });
    // 搜索会话
    describe('search sessions', function () {
        it('should return 200', function (done) {
            imClient.Search.searchSessions(userId, '小',
                function (data) {
                    assert(data.length > 0, "Search must return at least one data");
                },
                function (xhr, status, error) {
                    assert.ok(false, xhr.responseJSON.message);
                    done();
                });
        });
    });
    // 搜索会话消息
    describe('search sessions', function () {
        it('should return 200', function (done) {
            imClient.Search.searchMessages(userId, '哦',
                function (data) {
                    assert(data.length > 0, "Search must return at least one data");
                },
                function (xhr, status, error) {
                    assert.ok(false, xhr.responseJSON.message);
                    done();
                });
        });
    });
});

+ 0 - 1
test/client/im.client.session.p2p.Test.js

@ -7,7 +7,6 @@
 * @since 2016/12/24
 */
"use strict";
let $ = require('jquery');
let assert = require('assert');
let imClient = require('../../src/client/im.client');

+ 0 - 305
test/server/endpoints/chats.endpoint.Test.js

@ -1,305 +0,0 @@
"use strict";
var testConfig = require('../config');
var APIv1 = require('../../../src/server/include/endpoints').APIv1;
var should = require("should");
var restTemplate = require('supertest').agent(testConfig.host);
var userId = '0de7295862dd11e69faffa163e8aee56';            //
var targetUserId = '37959ddf86f211e6b394fa163e424525';      //
var adminTeamId = 5;                                        // 行政团队ID: 黄庄家庭医生团队
var consultGroupId = 'bcfd47c57ea74ba19fa049222c76befd';    // 讨论组ID
var at = '';
describe('API: Chat', function () {
    // 发送系统消息
    describe('when send SYSTEM message correctly', function () {
        it('should return 200', function (done) {
            var path = APIv1.Chats.Base + APIv1.Chats.SM;
            let now = new Date();
            now.setSeconds(now.getSeconds() + 2);
            let delay = now.toUTCString();
            restTemplate.post(path)
                .send({
                    to: 'x1',
                    title: "系统消息",
                    summary: "您有一条新的工作记录",
                    contentType: "1",
                    content: "患者已经签约,可以制定随访计划。",
                    delay: delay
                })
                .end(function (err, response) {
                    if(response.status === 200){
                        console.log(response.body);
                    }
                    response.status.should.equal(200);
                    done();
                });
        });
    });
    describe('when send SYSTEM message that user not exist', function () {
        it('should return 404', function (done) {
            var path = APIv1.Chats.Base + APIv1.Chats.SM;
            restTemplate.post(path)
                .send({
                    to: "Rose Unknown",
                    title: "System Message",
                    summary: "You have new job",
                    contentType: "1",
                    content: "The patient has been followed in the scheduler, please make new follow plan as soon as possible."
                })
                .end(function (err, response) {
                    response.status.should.equal(404);
                    done();
                });
        });
    });
    // 发送私信
    describe('when send PRIVATE message correctly', function () {
        it('should return 200', function (done) {
            var path = APIv1.Chats.Base + APIv1.Chats.PM;
            restTemplate.post(path)
                .send({
                    from: userId,
                    to: targetUserId,
                    contentType: 1,
                    content: "此患者白细胞如此高,中性粒值也高,同时感染细菌与病毒吗?"
                })
                .end(function (err, response) {
                    response.status.should.equal(200);
                    done();
                });
        });
    });
    // 向行政团队发送群消息
    describe('when send GROUP of admin team message correctly', function () {
        it('should return 200', function (done) {
            var path = APIv1.Chats.Base + APIv1.Chats.GM;
            restTemplate.post(path)
                .send({
                    from: userId,
                    at: '',
                    group: adminTeamId,
                    groupType: 1,
                    contentType: 1,
                    content: "请问:居民签约人数是否达标"
                })
                .end(function (err, response) {
                    if(response.status === 200){
                        console.log(response.body);
                    }
                    response.status.should.equal(200);
                    done();
                });
        });
    });
    // 向讨论组发送群消息
    describe('when send GROUP of consult team message correctly', function () {
        it('should return 200', function (done) {
            var path = APIv1.Chats.Base + APIv1.Chats.GM;
            restTemplate.post(path)
                .send({
                    from: '0de705f962dd11e69faffa163e8aee56',
                    at: '794f637bd3c64b948b112f16911a7883',
                    group: consultGroupId,
                    groupType: 2,
                    contentType: 1,
                    content: "庄医生,患者体征数据是否正常?"
                })
                .end(function (err, response) {
                    if(response.status === 200){
                        console.log(response.body);
                    }
                    response.status.should.equal(200);
                    done();
                });
        });
    });
    // 所有聊天列表
    describe('when get ALL CHAT list', function () {
        it('should return 200 and all chat list', function (done) {
            var path = APIv1.Chats.Base + APIv1.Chats.List + "?user_id=" + userId;
            restTemplate.get(path)
                .end(function (err, response) {
                    if(response.status === 200){
                        console.log("User " + userId + "'s all chat list: \n", response.body);
                    }
                    response.status.should.equal(200);
                    done();
                });
        });
    });
    // 最近联系对象
    describe('when get recent chat list, including ', function () {
        it('should return 200 and recent chat list in date span', function (done) {
            var path = APIv1.Chats.Base + APIv1.Chats.Recent + "?user_id=" + userId + "&days=7";
            restTemplate.get(path)
                .end(function (err, response) {
                    if(response.status === 200){
                        console.log("User " + userId + "'s recent chats: \n", response.body);
                    }
                    response.status.should.equal(200);
                    done();
                })
        });
    });
    // 与居民的聊天列表,包括含有居民的群
    describe('when get patient contained chat list', function () {
        it('should return 200 and chat list with patients', function (done) {
            var path = APIv1.Chats.Base + APIv1.Chats.ListWithPatient + "?user_id=" + 'D2016082203';
            restTemplate.get(path)
                .end(function (err, response) {
                    if(response.status === 200){
                        console.log("User " + userId + "'s chats with patients: \n", response.body);
                    }
                    response.status.should.equal(200);
                    done();
                })
        });
    });
    // 与医生的聊天列表,不包含有居民的群
    describe('when get doctor contained only chat list', function () {
        it('should return 200 and chat list with doctors', function (done) {
            var path = APIv1.Chats.Base + APIv1.Chats.ListWithDoctor + "?user_id=0de7421c62dd11e69faffa163e8aee56";
            restTemplate.get(path)
                .end(function (err, response) {
                    if(response.status === 200){
                        console.log("User " + userId + "'s chats with doctors: \n", response.body);
                    }
                    response.status.should.equal(200);
                    done();
                })
        });
    });
    // 所有未读组消息数
    describe('when get ALL GROUP unread chat count', function () {
        it('should return 200 and group chat count', function (done) {
            var path = APIv1.Chats.Base + APIv1.Chats.GMUnreadCount + "?user_id=" + userId;
            restTemplate.get(path)
                .end(function (err, response) {
                    if(response.status === 200) {
                        console.log("User " + userId + "'s group chat count: \n", response.body);
                    }
                    response.status.should.equal(200);
                    done();
                });
        })
    });
    // 所有未读私信数
    describe('when get ALL PRIVATE unread chat list', function () {
        it('should return 200 and private chat count', function (done) {
            var path = APIv1.Chats.Base + APIv1.Chats.PMUnreadCount + "?user_id=" + userId;
            restTemplate.get(path)
                .end(function (err, response) {
                    if(response.status === 200){
                        console.log("User " + userId + "'s private chat count: \n", response.body);
                    }
                    response.status.should.equal(200);
                    done();
                });
        })
    });
    // 所有未读消息数
    describe('when get ALL unread message count', function () {
        it('should return 200 and all unread message count', function (done) {
            var path = APIv1.Chats.Base + APIv1.Chats.UnreadMsgCount + "?user_id=" + userId;
            restTemplate.get(path)
                .end(function (err, response) {
                    if(response.status === 200){
                        console.log("User " + userId + "'s all unread message count: \n", response.body);
                    }
                    response.status.should.equal(200);
                    done();
                });
        });
    });
    // 获取未读私信
    describe('when get unread private messages', function () {
        it('should return 200 and unread private messages', function (done) {
            var path = APIv1.Chats.Base + APIv1.Chats.PMUnread + "?user_id=D2016008240002&peer_id=D2016008240003";
            restTemplate.get(path)
                .end(function (err, response) {
                    if(response.status === 200){
                        console.log("User D2016008240002's unread private message with D2016008240003: \n", response.body);
                    }
                    response.status.should.equal(200);
                    done();
                });
        })
    });
    // 获取未群消息
    describe('when get unread group messages', function () {
        it('should return 200 and unread group messages', function (done) {
            var path = APIv1.Chats.Base + APIv1.Chats.GMUnread + "?group_id=2&user_id=D20160322000003";
            restTemplate.get(path)
                .end(function (err, response) {
                    if(response.status === 200){
                        console.log("User D20160322000003's unread messages in group 2: \n", response.body);
                    }
                    response.status.should.equal(200);
                    done();
                });
        })
    });
    // 获取角标数
    describe('when get badge number', function () {
        it('shout return 200 and badge number', function (done) {
            var path = APIv1.Application.Base + APIv1.Application.BadgeNo + "?user_id=" + userId;
            restTemplate.get(path)
                .end(function (err, response) {
                    if(response.status === 200){
                        console.log("User " + userId + "'s badge number: \n", response.body);
                    }
                    response.status.should.equal(200);
                    done();
                });
        });
    });
});