object.searcher.js 4.2 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485868788899091929394959697
  1. "use strict";
  2. let RedisModel = require('./../redis.model.js');
  3. let ModelUtil = require('../../util/model.util');
  4. let RedisClient = require('../../repository/redis/redis.client.js');
  5. let SearchRepo = require('../../repository/mysql/search.repo');
  6. let log = require('../../util/log.js');
  7. let async = require("async");
  8. let redis = RedisClient.redisClient().connection;
  9. const REDIS_KEYS = require('../../include/commons').REDIS_KEYS;
  10. const DB_TABLES = require('../../include/commons').DB_TABLES;
  11. class ObjectSearcher extends RedisModel {
  12. constructor() {
  13. super();
  14. }
  15. search(userId, keyword, targetRole, entityType, excludeTopicEndedSessions, page, size) {
  16. let self = this;
  17. async.waterfall([
  18. // 获取会话ID列表,根据参数过滤应该议题已结束的会话
  19. function (callback) {
  20. if (excludeTopicEndedSessions) {
  21. SearchRepo.findTopicEndedSessionIdList(userId, function (err, sessionIdList) {
  22. if (err) return callback(err, null);
  23. callback(null, sessionIdList, keyword, targetRole, entityType);
  24. })
  25. } else {
  26. redis.zrangeAsync(RedisModel.makeRedisKey(REDIS_KEYS.UserSessions, userId), 0, -1)
  27. .then(function (sessionIdList) {
  28. callback(null, sessionIdList, keyword, targetRole, entityType);
  29. })
  30. .catch(function (err) {
  31. return callback(err, null);
  32. });
  33. }
  34. },
  35. function (sessionIdList, keyword, targetRole, entityType, callback) {
  36. var sessionList=[];
  37. for(var j in sessionIdList){
  38. sessionList.push(sessionIdList[j].id);
  39. }
  40. if(sessionList.length==0){
  41. callback(null, "");
  42. return;
  43. }
  44. if (targetRole !== 'doctor' && targetRole !== 'patient') {
  45. ModelUtil.emitError(self.eventEmitter, "Unknown target role: " + targetRole);
  46. }
  47. let userTable = targetRole === 'doctor' ? DB_TABLES.Doctors : DB_TABLES.Patients;
  48. // 综合搜索与分类搜索
  49. if (entityType === 'all') {
  50. SearchRepo.searchAll(sessionList, keyword, userTable, function (err, res) {
  51. if (err) return callback(err, null);
  52. callback(null, res);
  53. });
  54. } else if (entityType === 'user') {
  55. SearchRepo.searchUser(sessionList, keyword, userTable, page, size, function (err, res) {
  56. if (err) return callback(err, null);
  57. callback(null, {users: SearchRepo.userForge(res)});
  58. });
  59. } else if (entityType === 'session') {
  60. SearchRepo.searchSessions(sessionList, keyword, page, size, function (err, res) {
  61. if (err) return callback(err, null);
  62. callback(null, {sessions: SearchRepo.sessionForge(res, keyword)});
  63. });
  64. } else if (entityType === 'message') {
  65. SearchRepo.searchMessages(sessionList, keyword, page, size, function (err, res) {
  66. if (err) return callback(err, null);
  67. callback(null, {messages: SearchRepo.messageForge(res)});
  68. });
  69. } else {
  70. callback(new Error("Unknown entity type: " + entityType), null);
  71. }
  72. }
  73. ],
  74. function (err, res) {
  75. if (err) {
  76. return ModelUtil.emitError(self.eventEmitter, "Search failed", err);
  77. }
  78. ModelUtil.emitOK(self.eventEmitter, res);
  79. });
  80. }
  81. }
  82. module.exports = ObjectSearcher;