object.searcher.js 4.6 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103
  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=="true") {
  21. SearchRepo.findTopicEndedSessionIdList(userId, function (err, sessionIdList) {
  22. if (err) return callback(err, null);
  23. callback(null, sessionIdList, keyword, targetRole, entityType);
  24. })
  25. }else if(excludeTopicEndedSessions=="false"){
  26. SearchRepo.findTopicActiveSessionIdList(userId, function (err, sessionIdList) {
  27. if (err) return callback(err, null);
  28. callback(null, sessionIdList, keyword, targetRole, entityType);
  29. })
  30. }else {
  31. redis.zrangeAsync(RedisModel.makeRedisKey(REDIS_KEYS.UserSessions, userId), 0, -1)
  32. .then(function (sessionIdList) {
  33. callback(null, sessionIdList, keyword, targetRole, entityType);
  34. })
  35. .catch(function (err) {
  36. return callback(err, null);
  37. });
  38. }
  39. },
  40. function (sessionIdList, keyword, targetRole, entityType, callback) {
  41. var sessionList=[];
  42. for(var j in sessionIdList){
  43. sessionList.push(sessionIdList[j].id||sessionIdList[j]);
  44. }
  45. if(sessionList.length==0){
  46. callback(null, "");
  47. return;
  48. }
  49. if (targetRole !== 'doctor' && targetRole !== 'patient') {
  50. ModelUtil.emitError(self.eventEmitter, "Unknown target role: " + targetRole);
  51. }
  52. let userTable = targetRole === 'doctor' ? DB_TABLES.Doctors : DB_TABLES.Patients;
  53. // 综合搜索与分类搜索
  54. if (entityType === 'all') {
  55. SearchRepo.searchAll(sessionList,userId, keyword, userTable, function (err, res) {
  56. if (err) return callback(err, null);
  57. callback(null, res);
  58. });
  59. } else if (entityType === 'user') {
  60. SearchRepo.searchUser(sessionList,userId, keyword, userTable, page, size, function (err, res) {
  61. if (err) return callback(err, null);
  62. callback(null, {users: SearchRepo.userForge(res)});
  63. });
  64. } else if (entityType === 'session') {
  65. SearchRepo.searchSessions(sessionList,userId, keyword, page, size, function (err, res) {
  66. if (err) return callback(err, null);
  67. callback(null, {sessions: SearchRepo.sessionForge(res, keyword)});
  68. });
  69. } else if (entityType === 'message') {
  70. SearchRepo.searchMessages(sessionList,userId, keyword, page, size, function (err, res) {
  71. if (err) return callback(err, null);
  72. callback(null, {messages: SearchRepo.messageForge(res)});
  73. });
  74. } else {
  75. callback(new Error("Unknown entity type: " + entityType), null);
  76. }
  77. }
  78. ],
  79. function (err, res) {
  80. if (err) {
  81. return ModelUtil.emitError(self.eventEmitter, "Search failed", err);
  82. }
  83. ModelUtil.emitOK(self.eventEmitter, res);
  84. });
  85. }
  86. }
  87. module.exports = ObjectSearcher;