|
@ -3,6 +3,7 @@
|
|
|
let ImDb = require('../mysql/db/im.db');
|
|
|
let async = require("async");
|
|
|
let ObjectUtil = require("../../util/object.util.js");
|
|
|
let vsprintf = require("sprintf-js").vsprintf;
|
|
|
|
|
|
const DB_TABLES = require('../../include/commons').DB_TABLES;
|
|
|
|
|
@ -30,7 +31,6 @@ class SearchRepo {
|
|
|
args: [userId, userId],
|
|
|
handler: handler
|
|
|
});
|
|
|
|
|
|
}
|
|
|
|
|
|
/**
|
|
@ -42,39 +42,33 @@ class SearchRepo {
|
|
|
* @param handler
|
|
|
*/
|
|
|
static searchAll(sessionIdList, keyword, userTable, handler) {
|
|
|
let data = {};
|
|
|
|
|
|
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;
|
|
|
}
|
|
|
let buffer = SearchRepo.userForge(res);
|
|
|
userTable == DB_TABLES.Doctors ? data.doctors = buffer : data.patients = buffer;
|
|
|
|
|
|
callback(null, data);
|
|
|
callback(null);
|
|
|
});
|
|
|
},
|
|
|
function (data, callback) {
|
|
|
SearchRepo.searchSessions(sessionIdList, keyword, 0, 3, function (err, res) {
|
|
|
function (callback) {
|
|
|
SearchRepo.searchSessions(sessionIdList, keyword, userTable, 0, 3, function (err, res) {
|
|
|
if (err) return handler(err, null);
|
|
|
|
|
|
data.sessions = res;
|
|
|
data.sessions = SearchRepo.sessionForge(res);
|
|
|
|
|
|
callback(null, data);
|
|
|
callback(null);
|
|
|
})
|
|
|
},
|
|
|
function (data, callback) {
|
|
|
function (callback) {
|
|
|
SearchRepo.searchMessages(sessionIdList, keyword, 0, 3, function (err, res) {
|
|
|
if (err) return handler(err, null);
|
|
|
|
|
|
res.forEach(function (message) {
|
|
|
message.timestamp = ObjectUtil.timestampToLong(message.timestamp);
|
|
|
});
|
|
|
|
|
|
data.messages = res;
|
|
|
data.messages = SearchRepo.messageForge(res);
|
|
|
|
|
|
handler(null, data);
|
|
|
})
|
|
@ -93,9 +87,11 @@ class SearchRepo {
|
|
|
* @param handler
|
|
|
*/
|
|
|
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 +
|
|
|
let sql = "SELECT DISTINCT u.id, u.name, u.sex, u.birthdate, u.avatar %s FROM sessions s, participants p, " + userTable +
|
|
|
" u WHERE s.id in (?) AND s.id = p.session_id AND p.participant_id = u.id AND u.name like ? limit ?, ?";
|
|
|
|
|
|
sql = vsprintf(sql, [userTable == DB_TABLES.Doctors ? ', hospital_name' : '']);
|
|
|
|
|
|
keyword = '%' + keyword + '%';
|
|
|
ImDb.execQuery({
|
|
|
sql: sql,
|
|
@ -105,19 +101,22 @@ class SearchRepo {
|
|
|
}
|
|
|
|
|
|
/**
|
|
|
* 会话搜索
|
|
|
* 会话搜索。搜索会话名称与会话成员的名称。若有一个符合,就选中。
|
|
|
*/
|
|
|
static searchSessions(sessionIdList, keyword, page, size, handler) {
|
|
|
if(sessionIdList.length == 0){
|
|
|
static searchSessions(sessionIdList, keyword, userTable, page, size, handler) {
|
|
|
if (sessionIdList.length == 0) {
|
|
|
return handler(null, []);
|
|
|
}
|
|
|
|
|
|
let sql = "SELECT s.id, s.name, s.type, s.create_date, s.business_type FROM sessions s WHERE s.id in (?) AND s.name LIKE ? LIMIT ?, ? ";
|
|
|
let sql = "SELECT s.id, s.name, s.type, s.create_date, s.business_type, u.name participant_name " +
|
|
|
"FROM sessions s, participants p, " + userTable + " u " +
|
|
|
"WHERE s.id IN (?) AND s.id = p.session_id AND p.participant_id = u.id AND (s.name LIKE ? or u.name like ?) " +
|
|
|
"GROUP by s.id LIMIT ?, ?";
|
|
|
|
|
|
keyword = '%' + keyword + '%';
|
|
|
ImDb.execQuery({
|
|
|
sql: sql,
|
|
|
args: [sessionIdList, keyword, page * size, size],
|
|
|
args: [sessionIdList, keyword, keyword, page * size, size],
|
|
|
handler: handler
|
|
|
});
|
|
|
}
|
|
@ -129,16 +128,16 @@ class SearchRepo {
|
|
|
let sql = "SELECT * FROM(" +
|
|
|
"SELECT s.id session_id, s.name session_name, s.type session_type, s.business_type session_business_type, m.id message_id, m.sender_id, m.sender_name, m.timestamp, m.content " +
|
|
|
"FROM sessions s, muc_messages m " +
|
|
|
"WHERE s.id IN (?) AND s.id = m.session_id AND s.`type` = 1 AND m.content_type = 1 AND m.content LIKE ? GROUP BY s.id" +
|
|
|
"WHERE s.id IN (?) AND s.id = m.session_id AND s.`type` = 1 AND m.content_type = 1 AND m.content LIKE ? " +
|
|
|
" UNION " +
|
|
|
"SELECT s.id session_id, s.name session_name, s.type session_type, s.business_type session_business_type, m.id message_id, m.sender_id, m.sender_name, m.timestamp, m.content " +
|
|
|
"FROM sessions s, p2p_messages m " +
|
|
|
"WHERE s.id IN (?) AND s.id = m.session_id AND s.`type` = 2 AND m.content_type = 1 AND m.content LIKE ? GROUP BY s.id" +
|
|
|
"WHERE s.id IN (?) AND s.id = m.session_id AND s.`type` = 2 AND m.content_type = 1 AND m.content LIKE ? " +
|
|
|
" UNION " +
|
|
|
"SELECT s.id session_id, s.name session_name, s.type session_type, s.business_type session_business_type, m.id message_id, m.sender_id, m.sender_name, m.timestamp, m.content " +
|
|
|
"FROM sessions s, group_messages m " +
|
|
|
"WHERE s.id IN (?) AND s.id = m.session_id AND s.`type` = 3 AND m.content_type = 1 AND m.content LIKE ? GROUP BY s.id) X " +
|
|
|
"ORDER BY X.timestamp";
|
|
|
"WHERE s.id IN (?) AND s.id = m.session_id AND s.`type` = 3 AND m.content_type = 1 AND m.content LIKE ? ) X " +
|
|
|
"ORDER BY X.session_id, X.message_id LIMIT ?, ?";
|
|
|
|
|
|
keyword = '%' + keyword + '%';
|
|
|
ImDb.execQuery({
|
|
@ -147,6 +146,55 @@ class SearchRepo {
|
|
|
handler: handler
|
|
|
});
|
|
|
}
|
|
|
|
|
|
static userForge(res) {
|
|
|
res.forEach(function (user) {
|
|
|
if (!user.avatar) user.avatar = "";
|
|
|
|
|
|
user.birthdate = user.birthdate ? ObjectUtil.timestampToLong(user.birthdate) : "";
|
|
|
});
|
|
|
|
|
|
return res;
|
|
|
}
|
|
|
|
|
|
static sessionForge(res) {
|
|
|
res.forEach(function (session) {
|
|
|
session.create_date = ObjectUtil.timestampToLong(session.timestamp);
|
|
|
});
|
|
|
|
|
|
return res;
|
|
|
}
|
|
|
|
|
|
static messageForge(res) {
|
|
|
let result = [];
|
|
|
|
|
|
let lastSessionId = null;
|
|
|
let session = null;
|
|
|
res.forEach(function (message) {
|
|
|
if (message.session_id !== lastSessionId) {
|
|
|
lastSessionId = message.session_id;
|
|
|
session = {
|
|
|
session_id: message.session_id,
|
|
|
session_name: message.session_name,
|
|
|
session_type: message.session_type,
|
|
|
session_business_type: message.session_business_type,
|
|
|
messages: []
|
|
|
};
|
|
|
|
|
|
result.push(session);
|
|
|
}
|
|
|
|
|
|
session.messages.push({
|
|
|
id: message.message_id,
|
|
|
sender_id: message.sender_id,
|
|
|
sender_name: message.sender_name,
|
|
|
timestamp: ObjectUtil.timestampToLong(message.timestamp),
|
|
|
content: message.content
|
|
|
});
|
|
|
});
|
|
|
|
|
|
return result;
|
|
|
}
|
|
|
}
|
|
|
|
|
|
module.exports = SearchRepo;
|
|
|
module.exports = SearchRepo;
|