ChatController.js 3.9 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136
  1. /* eslint-disable
  2. camelcase,
  3. node/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.sendStatus(204)
  56. })
  57. }
  58. )
  59. },
  60. getMessages(req, res, next) {
  61. const { project_id } = req.params
  62. const { query } = req
  63. return ChatApiHandler.getGlobalMessages(
  64. project_id,
  65. query.limit,
  66. query.before,
  67. function(err, messages) {
  68. if (err != null) {
  69. return next(err)
  70. }
  71. return ChatController._injectUserInfoIntoThreads(
  72. { global: { messages } },
  73. function(err) {
  74. if (err != null) {
  75. return next(err)
  76. }
  77. return res.json(messages)
  78. }
  79. )
  80. }
  81. )
  82. },
  83. _injectUserInfoIntoThreads(threads, callback) {
  84. // There will be a lot of repitition of user_ids, so first build a list
  85. // of unique ones to perform db look ups on, then use these to populate the
  86. // user fields
  87. let message, thread, thread_id, user_id
  88. if (callback == null) {
  89. callback = function(error, threads) {}
  90. }
  91. const user_ids = {}
  92. for (thread_id in threads) {
  93. thread = threads[thread_id]
  94. if (thread.resolved) {
  95. user_ids[thread.resolved_by_user_id] = true
  96. }
  97. for (message of Array.from(thread.messages)) {
  98. user_ids[message.user_id] = true
  99. }
  100. }
  101. const jobs = []
  102. const users = {}
  103. for (user_id in user_ids) {
  104. const _ = user_ids[user_id]
  105. ;(user_id =>
  106. jobs.push(cb =>
  107. UserInfoManager.getPersonalInfo(user_id, function(error, user) {
  108. if (error != null) return cb(error)
  109. user = UserInfoController.formatPersonalInfo(user)
  110. users[user_id] = user
  111. cb()
  112. })
  113. ))(user_id)
  114. }
  115. return async.series(jobs, function(error) {
  116. if (error != null) {
  117. return callback(error)
  118. }
  119. for (thread_id in threads) {
  120. thread = threads[thread_id]
  121. if (thread.resolved) {
  122. thread.resolved_by_user = users[thread.resolved_by_user_id]
  123. }
  124. for (message of Array.from(thread.messages)) {
  125. message.user = users[message.user_id]
  126. }
  127. }
  128. return callback(null, threads)
  129. })
  130. }
  131. }