ChatController.js 4.2 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143
  1. /* eslint-disable
  2. camelcase,
  3. handle-callback-err,
  4. max-len,
  5. no-undef,
  6. no-unused-vars,
  7. */
  8. // TODO: This file was created by bulk-decaffeinate.
  9. // Fix any style issues and re-enable lint.
  10. /*
  11. * decaffeinate suggestions:
  12. * DS101: Remove unnecessary use of Array.from
  13. * DS102: Remove unnecessary code created because of implicit returns
  14. * DS207: Consider shorter variations of null checks
  15. * Full docs: https://github.com/decaffeinate/decaffeinate/blob/master/docs/suggestions.md
  16. */
  17. let ChatController
  18. const ChatApiHandler = require('./ChatApiHandler')
  19. const EditorRealTimeController = require('../Editor/EditorRealTimeController')
  20. const logger = require('logger-sharelatex')
  21. const AuthenticationController = require('../Authentication/AuthenticationController')
  22. const UserInfoManager = require('../User/UserInfoManager')
  23. const UserInfoController = require('../User/UserInfoController')
  24. const async = require('async')
  25. module.exports = ChatController = {
  26. sendMessage(req, res, next) {
  27. const { project_id } = req.params
  28. const { content } = req.body
  29. const user_id = AuthenticationController.getLoggedInUserId(req)
  30. if (user_id == null) {
  31. const err = new Error('no logged-in user')
  32. return next(err)
  33. }
  34. return ChatApiHandler.sendGlobalMessage(
  35. project_id,
  36. user_id,
  37. content,
  38. function(err, message) {
  39. if (err != null) {
  40. return next(err)
  41. }
  42. return UserInfoManager.getPersonalInfo(message.user_id, function(
  43. err,
  44. user
  45. ) {
  46. if (err != null) {
  47. return next(err)
  48. }
  49. message.user = UserInfoController.formatPersonalInfo(user)
  50. EditorRealTimeController.emitToRoom(
  51. project_id,
  52. 'new-chat-message',
  53. message
  54. )
  55. return res.send(204)
  56. })
  57. }
  58. )
  59. },
  60. getMessages(req, res, next) {
  61. const { project_id } = req.params
  62. const { query } = req
  63. logger.log({ project_id, query }, 'getting messages')
  64. return ChatApiHandler.getGlobalMessages(
  65. project_id,
  66. query.limit,
  67. query.before,
  68. function(err, messages) {
  69. if (err != null) {
  70. return next(err)
  71. }
  72. return ChatController._injectUserInfoIntoThreads(
  73. { global: { messages } },
  74. function(err) {
  75. if (err != null) {
  76. return next(err)
  77. }
  78. logger.log(
  79. { length: messages != null ? messages.length : undefined },
  80. 'sending messages to client'
  81. )
  82. return res.json(messages)
  83. }
  84. )
  85. }
  86. )
  87. },
  88. _injectUserInfoIntoThreads(threads, callback) {
  89. // There will be a lot of repitition of user_ids, so first build a list
  90. // of unique ones to perform db look ups on, then use these to populate the
  91. // user fields
  92. let message, thread, thread_id, user_id
  93. if (callback == null) {
  94. callback = function(error, threads) {}
  95. }
  96. const user_ids = {}
  97. for (thread_id in threads) {
  98. thread = threads[thread_id]
  99. if (thread.resolved) {
  100. user_ids[thread.resolved_by_user_id] = true
  101. }
  102. for (message of Array.from(thread.messages)) {
  103. user_ids[message.user_id] = true
  104. }
  105. }
  106. const jobs = []
  107. const users = {}
  108. for (user_id in user_ids) {
  109. const _ = user_ids[user_id]
  110. ;(user_id =>
  111. jobs.push(cb =>
  112. UserInfoManager.getPersonalInfo(user_id, function(err, user) {
  113. if (typeof error !== 'undefined' && error !== null) {
  114. return cb(error)
  115. }
  116. user = UserInfoController.formatPersonalInfo(user)
  117. users[user_id] = user
  118. return cb()
  119. })
  120. ))(user_id)
  121. }
  122. return async.series(jobs, function(error) {
  123. if (error != null) {
  124. return callback(error)
  125. }
  126. for (thread_id in threads) {
  127. thread = threads[thread_id]
  128. if (thread.resolved) {
  129. thread.resolved_by_user = users[thread.resolved_by_user_id]
  130. }
  131. for (message of Array.from(thread.messages)) {
  132. message.user = users[message.user_id]
  133. }
  134. }
  135. return callback(null, threads)
  136. })
  137. }
  138. }