CommentsController.coffee 3.2 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283
  1. ChatApiHandler = require("../Chat/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 = CommentsController =
  9. sendComment: (req, res, next) ->
  10. {project_id, thread_id} = req.params
  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. logger.log {project_id, thread_id, user_id, content}, "sending comment"
  17. ChatApiHandler.sendComment project_id, thread_id, user_id, content, (err, comment) ->
  18. return next(err) if err?
  19. UserInfoManager.getPersonalInfo comment.user_id, (err, user) ->
  20. return next(err) if err?
  21. comment.user = UserInfoController.formatPersonalInfo(user)
  22. EditorRealTimeController.emitToRoom project_id, "new-comment", thread_id, comment, (err) ->
  23. res.send 204
  24. getThreads: (req, res, next) ->
  25. {project_id} = req.params
  26. logger.log {project_id}, "getting comment threads for project"
  27. ChatApiHandler.getThreads project_id, (err, threads) ->
  28. return next(err) if err?
  29. CommentsController._injectUserInfoIntoThreads threads, (error, threads) ->
  30. return next(err) if err?
  31. res.json threads
  32. resolveThread: (req, res, next) ->
  33. {project_id, thread_id} = req.params
  34. user_id = AuthenticationController.getLoggedInUserId(req)
  35. logger.log {project_id, thread_id, user_id}, "resolving comment thread"
  36. ChatApiHandler.resolveThread project_id, thread_id, user_id, (err) ->
  37. return next(err) if err?
  38. UserInfoManager.getPersonalInfo user_id, (err, user) ->
  39. return next(err) if err?
  40. EditorRealTimeController.emitToRoom project_id, "resolve-thread", thread_id, UserInfoController.formatPersonalInfo(user), (err)->
  41. res.send 204
  42. reopenThread: (req, res, next) ->
  43. {project_id, thread_id} = req.params
  44. logger.log {project_id, thread_id}, "reopening comment thread"
  45. ChatApiHandler.reopenThread project_id, thread_id, (err, threads) ->
  46. return next(err) if err?
  47. EditorRealTimeController.emitToRoom project_id, "reopen-thread", thread_id, (err)->
  48. res.send 204
  49. _injectUserInfoIntoThreads: (threads, callback = (error, threads) ->) ->
  50. userCache = {}
  51. getUserDetails = (user_id, callback = (error, user) ->) ->
  52. return callback(null, userCache[user_id]) if userCache[user_id]?
  53. UserInfoManager.getPersonalInfo user_id, (err, user) ->
  54. return callback(error) if error?
  55. user = UserInfoController.formatPersonalInfo user
  56. userCache[user_id] = user
  57. callback null, user
  58. jobs = []
  59. for thread in threads
  60. do (thread) ->
  61. if thread.resolved
  62. jobs.push (cb) ->
  63. getUserDetails thread.resolved_by_user_id, (error, user) ->
  64. cb(error) if error?
  65. thread.resolved_by_user = user
  66. cb()
  67. for message in thread.messages
  68. do (message) ->
  69. jobs.push (cb) ->
  70. getUserDetails message.user_id, (error, user) ->
  71. cb(error) if error?
  72. message.user = user
  73. cb()
  74. async.series jobs, (error) ->
  75. return callback(error) if error?
  76. return callback null, threads