object.searcher.js 4.5 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104
  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 ObjectUtil = require("../../util/object.util.js");
  9. let redis = RedisClient.redisClient().connection;
  10. const REDIS_KEYS = require('../../include/commons').REDIS_KEYS;
  11. const DB_TABLES = require('../../include/commons').DB_TABLES;
  12. class ObjectSearcher extends RedisModel {
  13. constructor() {
  14. super();
  15. }
  16. search(userId, keyword, targetRole, entityType, excludeTopicEndedSessions, page, size) {
  17. let self = this;
  18. async.waterfall([
  19. // 获取会话ID列表,根据参数过滤应该议题已结束的会话
  20. function (callback) {
  21. if (excludeTopicEndedSessions) {
  22. SearchRepo.findTopicEndedSessionIdList(userId, function (err, sessionIdList) {
  23. if (err) return callback(err, null);
  24. callback(null, sessionIdList, keyword, targetRole, entityType);
  25. })
  26. } else {
  27. redis.zrangeAsync(RedisModel.makeRedisKey(REDIS_KEYS.UserSessions, userId), 0, -1)
  28. .then(function (sessionIdList) {
  29. callback(null, sessionIdList, keyword, targetRole, entityType);
  30. })
  31. .catch(function (err) {
  32. return callback(err, null);
  33. });
  34. }
  35. },
  36. // 搜索
  37. function (sessionIdList, keyword, targetRole, entityType, callback) {
  38. if (targetRole !== 'doctor' && targetRole !== 'patient') {
  39. ModelUtil.emitError(self.eventEmitter, "Unknown target role: " + targetRole);
  40. }
  41. let userTable = targetRole === 'doctor' ? DB_TABLES.Doctors : DB_TABLES.Patients;
  42. if (entityType === 'all') {
  43. SearchRepo.searchAll(sessionIdList, keyword, userTable, function (err, res) {
  44. if (err) return callback(err, null);
  45. callback(null, res);
  46. });
  47. } else if (entityType === 'user') {
  48. SearchRepo.searchUser(sessionIdList, keyword, userTable, page, size, function (err, res) {
  49. if (err) return callback(err, null);
  50. res.forEach(function (user) {
  51. if(!user.avatar) user.avatar = "";
  52. user.birthdate = user.birthdate ? ObjectUtil.timestampToLong(user.birthdate) : "";
  53. });
  54. if (userTable == DB_TABLES.Patients) {
  55. callback(null, {patients: res});
  56. } else {
  57. callback(null, {doctors: res});
  58. }
  59. });
  60. } else if (entityType === 'session') {
  61. SearchRepo.searchSessions(sessionIdList, keyword, userTable, page, size, function (err, res) {
  62. if (err) return callback(err, null);
  63. callback(null, {sessions: res});
  64. });
  65. } else if (entityType === 'message') {
  66. SearchRepo.searchMessages(sessionIdList, keyword, page, size, function (err, res) {
  67. if (err) return callback(err, null);
  68. res.forEach(function (message) {
  69. message.timestamp = ObjectUtil.timestampToLong(message.timestamp);
  70. });
  71. callback(null, {messages: res});
  72. });
  73. } else {
  74. callback(new Error("Unknown entity type: " + entityType), null);
  75. }
  76. }
  77. ],
  78. function (err, res) {
  79. if (err) {
  80. return ModelUtil.emitError(self.eventEmitter, "Search failed", err);
  81. }
  82. ModelUtil.emitOK(self.eventEmitter, res);
  83. });
  84. }
  85. }
  86. module.exports = ObjectSearcher;