|
@ -1,81 +1,135 @@
|
|
|
/**
|
|
|
* 搜索。
|
|
|
*/
|
|
|
"use strict";
|
|
|
'use strict';
|
|
|
|
|
|
let ImDb = require('../mysql/db/im.db');
|
|
|
let async = require("async");
|
|
|
|
|
|
const DB_TABLES = require('../../include/commons').DB_TABLES;
|
|
|
|
|
|
class SearchRepo {
|
|
|
constructor() {
|
|
|
}
|
|
|
|
|
|
static searchDoctors(keyword, page, size, handler) {
|
|
|
if(page<=0)page = 1;
|
|
|
page = (page-1)*size;
|
|
|
let sql = "select d.id, d.name, d.sex, d.birthdate, d.avatar, d.level from doctors d where d.name like ? limit ?, ?";
|
|
|
|
|
|
/**
|
|
|
* 查询正常会话及议题已结束的会话(P2P, MUC)
|
|
|
*
|
|
|
* @param userId
|
|
|
* @param handler
|
|
|
*/
|
|
|
static findTopicEndedSessionIdList(userId, handler) {
|
|
|
let sql = "SELECT s.id " +
|
|
|
"FROM sessions s, topics t, participants p " +
|
|
|
"WHERE p.participant_id = '' AND p.session_id = s.id AND s.id = t.session_id AND t.end_message_id IS NOT NULL AND s.`type` IN (1) " +
|
|
|
"UNION " +
|
|
|
"SELECT s.id " +
|
|
|
"FROM sessions s, participants p " +
|
|
|
"WHERE p.participant_id = '' AND p.session_id = s.id AND s.`type` IN (2, 3)";
|
|
|
ImDb.execQuery({
|
|
|
sql: sql,
|
|
|
args: ['%' + keyword + '%',page , size],
|
|
|
args: [userId, userId],
|
|
|
handler: handler
|
|
|
});
|
|
|
})
|
|
|
|
|
|
}
|
|
|
|
|
|
/**
|
|
|
* 搜索会话。
|
|
|
* 全部搜索
|
|
|
*
|
|
|
* TODO: 还需要联合搜索包含特定用户的会话。当前只实现了按会话名称搜索。
|
|
|
* @param sessionIdList
|
|
|
* @param keyword
|
|
|
* @param userTable
|
|
|
* @param handler
|
|
|
*/
|
|
|
static searchAll(sessionIdList, keyword, userTable, handler) {
|
|
|
async.waterfall([
|
|
|
function (callback) {
|
|
|
SearchRepo.searchUser(sessionIdList, keyword, userTable, 0, 3, function (err, res) {
|
|
|
if (err) return handler(err, null);
|
|
|
|
|
|
let data = {};
|
|
|
if (userTable == DB_TABLES.Doctors) {
|
|
|
data.doctors = res;
|
|
|
} else {
|
|
|
data.patients = res;
|
|
|
}
|
|
|
|
|
|
callback(null, data);
|
|
|
});
|
|
|
},
|
|
|
function (data, callback) {
|
|
|
SearchRepo.searchSessions(sessionIdList, keyword, 0, 3, function (err, res) {
|
|
|
if (err) return handler(err, null);
|
|
|
|
|
|
data.sessions = res;
|
|
|
|
|
|
callback(null, data);
|
|
|
})
|
|
|
},
|
|
|
function (data, callback) {
|
|
|
SearchRepo.searchMessages(sessionIdList, keyword, 0, 3, function (err, res) {
|
|
|
if (err) return handler(err, null);
|
|
|
|
|
|
data.messages = res;
|
|
|
|
|
|
handler(null, data);
|
|
|
})
|
|
|
}
|
|
|
]);
|
|
|
}
|
|
|
|
|
|
/**
|
|
|
* 用户搜索
|
|
|
*
|
|
|
* @param userId
|
|
|
* @param sessionIdList
|
|
|
* @param keyword
|
|
|
* @param userTable
|
|
|
* @param page
|
|
|
* @param size
|
|
|
* @param handler
|
|
|
*/
|
|
|
static searchSessions(userId, keyword, page, size, handler) {
|
|
|
let sql = "select s.id, s.name, s.type, s.create_date, s.business_type," +
|
|
|
"(SELECT group_concat(d.name) FROM doctors d,participants p1 WHERE p1.participant_id = d.id and p1.session_id = s.id and d.name like ?) as members," +
|
|
|
"(SELECT group_concat(d.avatar) FROM doctors d,participants p1 WHERE p1.participant_id = d.id and p1.session_id = s.id) as images from sessions s" +
|
|
|
" where s.id in (select id from sessions s, participants p where s.id = p.session_id and p.participant_id = ?) " +
|
|
|
"and s.type <> 0 and s.name like ? limit ?, ?";
|
|
|
static searchUser(sessionIdList, keyword, userTable, page, size, handler) {
|
|
|
let sql = "select u.id, u.name, u.sex, u.avatar from sessions s, participants p, " + userTable + " u where s.id in ('" +
|
|
|
sessionIdList.join("', '") +
|
|
|
"') AND s.id = p.session_id AND p.participant_id = u.id and u.name like ? limit ?, ?";
|
|
|
|
|
|
keyword = '%' + keyword + '%';
|
|
|
ImDb.execQuery({
|
|
|
sql: sql,
|
|
|
args: [ '%' + keyword + '%',userId, '%' + keyword + '%', page * size, size],
|
|
|
args: [keyword, page * size, size],
|
|
|
handler: handler
|
|
|
});
|
|
|
}
|
|
|
|
|
|
/**
|
|
|
* 搜索会话消息。
|
|
|
*
|
|
|
* @param userId
|
|
|
* @param keyword
|
|
|
* @param page
|
|
|
* @param size
|
|
|
* @param handler
|
|
|
* 会话搜索
|
|
|
*/
|
|
|
static searchSessions(sessionIdList, keyword, page, size, handler) {
|
|
|
let sql = "select s.id, s.name, s.type, s.create_date, s.business_type from sessions s where s.id in ('" +
|
|
|
sessionIdList.join("', '") +
|
|
|
"') and s.name like ? limit ?, ? ";
|
|
|
|
|
|
keyword = '%' + keyword + '%';
|
|
|
ImDb.execQuery({
|
|
|
sql: sql,
|
|
|
args: [keyword, page * size, size],
|
|
|
handler: handler
|
|
|
});
|
|
|
}
|
|
|
|
|
|
/**
|
|
|
* 消息搜索
|
|
|
*/
|
|
|
static searchMessages(userId, keyword, page, size, handler) {
|
|
|
let sql = "SELECT * FROM( " +
|
|
|
"SELECT s.id session_id, s.name session_name, s.type session_type, s.create_date, s.business_type, count(m.id) count, max(m.content) message_content " +
|
|
|
"FROM sessions s, participants p, muc_messages m " +
|
|
|
"WHERE p.participant_id = ? and p.session_id = s.id and s.id = m.session_id and m.content_type = 1 AND m.content LIKE ? " +
|
|
|
"GROUP BY s.id, s.name, s.type, s.create_date, s.business_type "+
|
|
|
"UNION " +
|
|
|
"SELECT s.id session_id, s.name session_name, s.type session_type, s.create_date, s.business_type, count(m.id) count, max(m.content) message_content " +
|
|
|
"FROM sessions s, participants p, group_messages m " +
|
|
|
"WHERE p.participant_id = ? and p.session_id = s.id and s.id = m.session_id and m.content_type = 1 AND m.content LIKE ? " +
|
|
|
"GROUP BY s.id, s.name, s.type, s.create_date, s.business_type "+
|
|
|
"UNION " +
|
|
|
"SELECT s.id session_id, s.name session_name, s.type session_type, s.create_date, s.business_type, count(m.id) count, max(m.content) message_content " +
|
|
|
"FROM sessions s, participants p, p2p_messages m " +
|
|
|
"WHERE p.participant_id = ? and p.session_id = s.id and s.id = m.session_id and m.content_type = 1 AND m.content LIKE ? " +
|
|
|
"GROUP BY s.id, s.name, s.type, s.create_date, s.business_type "+
|
|
|
") X LIMIT ?, ?";
|
|
|
static searchMessages(sessionIdList, keyword, page, size, handler) {
|
|
|
let sql = "SELECT s.id, s.name, s.type, s.create_date, s.business_type, m.sender_name, m.content " +
|
|
|
"FROM sessions s, p2p_messages m " +
|
|
|
"WHERE s.id IN('" + sessionIdList.join("', '") + "') AND s.id = m.session_id AND s.`type` IN (1,2,3) AND m.content_type = 1 AND m.content LIKE ? " +
|
|
|
"GROUP BY s.id " +
|
|
|
"ORDER BY s.last_message_time " +
|
|
|
"LIMIT ?, ?";
|
|
|
|
|
|
keyword = '%' + keyword + '%';
|
|
|
ImDb.execQuery({
|
|
|
sql: sql,
|
|
|
args: [userId, keyword, userId, keyword, userId, keyword, page * size, size],
|
|
|
args: [keyword, page * size, size],
|
|
|
handler: handler
|
|
|
});
|
|
|
}
|