ChatController.coffee 2.5 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465
  1. ChatApiHandler = require("./ChatApiHandler")
  2. EditorRealTimeController = require("../Editor/EditorRealTimeController")
  3. logger = require("logger-sharelatex")
  4. AuthenticationController = require('../Authentication/AuthenticationController')
  5. UserInfoManager = require('../User/UserInfoManager')
  6. UserInfoController = require('../User/UserInfoController')
  7. async = require "async"
  8. module.exports = ChatController =
  9. sendMessage: (req, res, next)->
  10. project_id = req.params.project_id
  11. content = req.body.content
  12. user_id = AuthenticationController.getLoggedInUserId(req)
  13. if !user_id?
  14. err = new Error('no logged-in user')
  15. return next(err)
  16. ChatApiHandler.sendGlobalMessage project_id, user_id, content, (err, message) ->
  17. return next(err) if err?
  18. UserInfoManager.getPersonalInfo message.user_id, (err, user) ->
  19. return next(err) if err?
  20. message.user = UserInfoController.formatPersonalInfo(user)
  21. EditorRealTimeController.emitToRoom project_id, "new-chat-message", message
  22. res.send(204)
  23. getMessages: (req, res, next)->
  24. project_id = req.params.project_id
  25. query = req.query
  26. logger.log project_id:project_id, query:query, "getting messages"
  27. ChatApiHandler.getGlobalMessages project_id, query.limit, query.before, (err, messages) ->
  28. return next(err) if err?
  29. ChatController._injectUserInfoIntoThreads {global: { messages: messages }}, (err) ->
  30. return next(err) if err?
  31. logger.log length: messages?.length, "sending messages to client"
  32. res.json messages
  33. _injectUserInfoIntoThreads: (threads, callback = (error, threads) ->) ->
  34. # There will be a lot of repitition of user_ids, so first build a list
  35. # of unique ones to perform db look ups on, then use these to populate the
  36. # user fields
  37. user_ids = {}
  38. for thread_id, thread of threads
  39. if thread.resolved
  40. user_ids[thread.resolved_by_user_id] = true
  41. for message in thread.messages
  42. user_ids[message.user_id] = true
  43. jobs = []
  44. users = {}
  45. for user_id, _ of user_ids
  46. do (user_id) ->
  47. jobs.push (cb) ->
  48. UserInfoManager.getPersonalInfo user_id, (err, user) ->
  49. return cb(error) if error?
  50. user = UserInfoController.formatPersonalInfo user
  51. users[user_id] = user
  52. cb()
  53. async.series jobs, (error) ->
  54. return callback(error) if error?
  55. for thread_id, thread of threads
  56. if thread.resolved
  57. thread.resolved_by_user = users[thread.resolved_by_user_id]
  58. for message in thread.messages
  59. message.user = users[message.user_id]
  60. return callback null, threads