ChatController.js 3.9 KB

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