123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171 |
- /**
- * 用户、会话及消息搜索。
- *
- * 注意:此模型效率堪忧,但为了实现先这样做。更稳妥的方案是使用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;
|