/** * 用户、会话及消息搜索。 * * 注意:此模型效率堪忧,但为了实现先这样做。更稳妥的方案是使用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.js"); 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, 4, function (err, doctors) { if (err) return callback(err, null); let data = {}; let buffer = []; doctors.forEach(function (doctor) { buffer.push(doctor); }); data.doctor = buffer; callback(null, data); }); }, function (data, callback) { self.searchSessions(userId, keyword, 0, 4, function (err, sessions) { if (err) return callback(err, null); let buffer = []; sessions.forEach(function (session) { buffer.push(session); }); data.groups = buffer; callback(null, data); }); }, function (data, callback) { self.searchMessages(userId, keyword, 0, 4, function (err, sessions) { if (err) return callback(err, null); let buffer = []; sessions.forEach(function (session) { buffer.push(session); }); data.content = buffer; 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, doctors) { if (handler) { handler(err, doctors); } else { if (err) { ModelUtil.emitError(self.eventEmitter, "Search doctors failed", err); } else { doctors.forEach(function (doctor) { doctor.avatar = doctor.avatar ? doctor.avatar : ""; doctor.birthdate = doctor.birthdate ? doctor.birthdate : ""; }); ModelUtil.emitOK(self.eventEmitter, doctors); } } }); } /** * 会话搜索。 * * @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 { sessions.forEach(function (session) { session.create_date = ObjectUtil.timestampToLong(session.create_date); }); 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 { messages.forEach(function (message) { message.create_time = ObjectUtil.timestampToLong(message.create_time); }); ModelUtil.emitOK(self.eventEmitter, messages); } } }); } } module.exports = MySqlSearcher;