search.repo.js 5.3 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152
  1. 'use strict';
  2. let ImDb = require('../mysql/db/im.db');
  3. let async = require("async");
  4. let ObjectUtil = require("../../util/object.util.js");
  5. const DB_TABLES = require('../../include/commons').DB_TABLES;
  6. class SearchRepo {
  7. constructor() {
  8. }
  9. /**
  10. * 查询正常会话及议题已结束的会话(P2P, MUC)
  11. *
  12. * @param userId
  13. * @param handler
  14. */
  15. static findTopicEndedSessionIdList(userId, handler) {
  16. let sql = "SELECT s.id " +
  17. "FROM sessions s, topics t, participants p " +
  18. "WHERE p.participant_id = ? AND p.session_id = s.id AND s.id = t.session_id AND t.end_message_id IS NOT NULL AND s.`type` IN (1) " +
  19. " UNION " +
  20. "SELECT s.id " +
  21. "FROM sessions s, participants p " +
  22. "WHERE p.participant_id = ? AND p.session_id = s.id AND s.`type` IN (2, 3)";
  23. ImDb.execQuery({
  24. sql: sql,
  25. args: [userId, userId],
  26. handler: handler
  27. });
  28. }
  29. /**
  30. * 全部搜索
  31. *
  32. * @param sessionIdList
  33. * @param keyword
  34. * @param userTable
  35. * @param handler
  36. */
  37. static searchAll(sessionIdList, keyword, userTable, handler) {
  38. async.waterfall([
  39. function (callback) {
  40. SearchRepo.searchUser(sessionIdList, keyword, userTable, 0, 3, function (err, res) {
  41. if (err) return handler(err, null);
  42. let data = {};
  43. if (userTable == DB_TABLES.Doctors) {
  44. data.doctors = res;
  45. } else {
  46. data.patients = res;
  47. }
  48. callback(null, data);
  49. });
  50. },
  51. function (data, callback) {
  52. SearchRepo.searchSessions(sessionIdList, keyword, 0, 3, function (err, res) {
  53. if (err) return handler(err, null);
  54. data.sessions = res;
  55. callback(null, data);
  56. })
  57. },
  58. function (data, callback) {
  59. SearchRepo.searchMessages(sessionIdList, keyword, 0, 3, function (err, res) {
  60. if (err) return handler(err, null);
  61. res.forEach(function (message) {
  62. message.timestamp = ObjectUtil.timestampToLong(message.timestamp);
  63. });
  64. data.messages = res;
  65. handler(null, data);
  66. })
  67. }
  68. ]);
  69. }
  70. /**
  71. * 用户搜索
  72. *
  73. * @param sessionIdList
  74. * @param keyword
  75. * @param userTable
  76. * @param page
  77. * @param size
  78. * @param handler
  79. */
  80. static searchUser(sessionIdList, keyword, userTable, page, size, handler) {
  81. let sql = "SELECT u.id, u.name, u.sex, u.avatar FROM sessions s, participants p, " + userTable +
  82. " u WHERE s.id in (?) AND s.id = p.session_id AND p.participant_id = u.id AND u.name like ? limit ?, ?";
  83. keyword = '%' + keyword + '%';
  84. ImDb.execQuery({
  85. sql: sql,
  86. args: [sessionIdList, keyword, page * size, size],
  87. handler: handler
  88. });
  89. }
  90. /**
  91. * 会话搜索
  92. */
  93. static searchSessions(sessionIdList, keyword, page, size, handler) {
  94. if(sessionIdList.length == 0){
  95. return handler(null, []);
  96. }
  97. let sql = "SELECT s.id, s.name, s.type, s.create_date, s.business_type FROM sessions s WHERE s.id in (?) AND s.name LIKE ? LIMIT ?, ? ";
  98. keyword = '%' + keyword + '%';
  99. ImDb.execQuery({
  100. sql: sql,
  101. args: [sessionIdList, keyword, page * size, size],
  102. handler: handler
  103. });
  104. }
  105. /**
  106. * 消息搜索
  107. */
  108. static searchMessages(sessionIdList, keyword, page, size, handler) {
  109. let sql = "SELECT * FROM(" +
  110. "SELECT s.id session_id, s.name session_name, s.type session_type, s.business_type session_business_type, m.id message_id, m.sender_id, m.sender_name, m.timestamp, m.content " +
  111. "FROM sessions s, muc_messages m " +
  112. "WHERE s.id IN (?) AND s.id = m.session_id AND s.`type` = 1 AND m.content_type = 1 AND m.content LIKE ? GROUP BY s.id" +
  113. " UNION " +
  114. "SELECT s.id session_id, s.name session_name, s.type session_type, s.business_type session_business_type, m.id message_id, m.sender_id, m.sender_name, m.timestamp, m.content " +
  115. "FROM sessions s, p2p_messages m " +
  116. "WHERE s.id IN (?) AND s.id = m.session_id AND s.`type` = 2 AND m.content_type = 1 AND m.content LIKE ? GROUP BY s.id" +
  117. " UNION " +
  118. "SELECT s.id session_id, s.name session_name, s.type session_type, s.business_type session_business_type, m.id message_id, m.sender_id, m.sender_name, m.timestamp, m.content " +
  119. "FROM sessions s, group_messages m " +
  120. "WHERE s.id IN (?) AND s.id = m.session_id AND s.`type` = 3 AND m.content_type = 1 AND m.content LIKE ? GROUP BY s.id) X " +
  121. "ORDER BY X.timestamp";
  122. keyword = '%' + keyword + '%';
  123. ImDb.execQuery({
  124. sql: sql,
  125. args: [sessionIdList, keyword, sessionIdList, keyword, sessionIdList, keyword, page * size, size],
  126. handler: handler
  127. });
  128. }
  129. }
  130. module.exports = SearchRepo;