"use strict"; let RedisModel = require('./../redis.model.js'); let ModelUtil = require('../../util/model.util'); let RedisClient = require('../../repository/redis/redis.client.js'); let SearchRepo = require('../../repository/mysql/search.repo'); let log = require('../../util/log.js'); let async = require("async"); let redis = RedisClient.redisClient().connection; const REDIS_KEYS = require('../../include/commons').REDIS_KEYS; const DB_TABLES = require('../../include/commons').DB_TABLES; class ObjectSearcher extends RedisModel { constructor() { super(); } search(userId, keyword, targetRole, entityType, excludeTopicEndedSessions, page, size) { let self = this; async.waterfall([ // 获取会话ID列表,根据参数过滤应该议题已结束的会话 function (callback) { if (excludeTopicEndedSessions=="true") { SearchRepo.findTopicEndedSessionIdList(userId, function (err, sessionIdList) { if (err) return callback(err, null); callback(null, sessionIdList, keyword, targetRole, entityType); }) }else if(excludeTopicEndedSessions=="false"){ SearchRepo.findTopicActiveSessionIdList(userId, function (err, sessionIdList) { if (err) return callback(err, null); callback(null, sessionIdList, keyword, targetRole, entityType); }) }else { redis.zrangeAsync(RedisModel.makeRedisKey(REDIS_KEYS.UserSessions, userId), 0, -1) .then(function (sessionIdList) { callback(null, sessionIdList, keyword, targetRole, entityType); }) .catch(function (err) { return callback(err, null); }); } }, function (sessionIdList, keyword, targetRole, entityType, callback) { var sessionList=[]; for(var j in sessionIdList){ sessionList.push(sessionIdList[j].id||sessionIdList[j]); } if(sessionList.length==0){ callback(null, ""); return; } if (targetRole !== 'doctor' && targetRole !== 'patient') { ModelUtil.emitError(self.eventEmitter, "Unknown target role: " + targetRole); } let userTable = targetRole === 'doctor' ? DB_TABLES.Doctors : DB_TABLES.Patients; // 综合搜索与分类搜索 if (entityType === 'all') { SearchRepo.searchAll(sessionList,userId, keyword, userTable, function (err, res) { if (err) return callback(err, null); callback(null, res); }); } else if (entityType === 'user') { SearchRepo.searchUser(sessionList,userId, keyword, userTable, page, size, function (err, res) { if (err) return callback(err, null); callback(null, {users: SearchRepo.userForge(res)}); }); } else if (entityType === 'session') { SearchRepo.searchSessions(sessionList,userId, keyword, page, size, function (err, res) { if (err) return callback(err, null); callback(null, {sessions: SearchRepo.sessionForge(res, keyword)}); }); } else if (entityType === 'message') { SearchRepo.searchMessages(sessionList,userId, keyword, page, size, function (err, res) { if (err) return callback(err, null); callback(null, {messages: SearchRepo.messageForge(res)}); }); } else { callback(new Error("Unknown entity type: " + entityType), null); } } ], function (err, res) { if (err) { return ModelUtil.emitError(self.eventEmitter, "Search failed", err); } ModelUtil.emitOK(self.eventEmitter, res); }); } } module.exports = ObjectSearcher;