CommentsController.coffee 4.6 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111
  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. DocumentUpdaterHandler = require "../DocumentUpdater/DocumentUpdaterHandler"
  8. async = require "async"
  9. module.exports = CommentsController =
  10. sendComment: (req, res, next) ->
  11. {project_id, thread_id} = req.params
  12. content = req.body.content
  13. user_id = AuthenticationController.getLoggedInUserId(req)
  14. if !user_id?
  15. err = new Error('no logged-in user')
  16. return next(err)
  17. logger.log {project_id, thread_id, user_id, content}, "sending comment"
  18. ChatApiHandler.sendComment project_id, thread_id, user_id, content, (err, comment) ->
  19. return next(err) if err?
  20. UserInfoManager.getPersonalInfo comment.user_id, (err, user) ->
  21. return next(err) if err?
  22. comment.user = UserInfoController.formatPersonalInfo(user)
  23. EditorRealTimeController.emitToRoom project_id, "new-comment", thread_id, comment, (err) ->
  24. res.send 204
  25. getThreads: (req, res, next) ->
  26. {project_id} = req.params
  27. logger.log {project_id}, "getting comment threads for project"
  28. ChatApiHandler.getThreads project_id, (err, threads) ->
  29. return next(err) if err?
  30. CommentsController._injectUserInfoIntoThreads threads, (error, threads) ->
  31. return next(err) if err?
  32. res.json threads
  33. resolveThread: (req, res, next) ->
  34. {project_id, thread_id} = req.params
  35. user_id = AuthenticationController.getLoggedInUserId(req)
  36. logger.log {project_id, thread_id, user_id}, "resolving comment thread"
  37. ChatApiHandler.resolveThread project_id, thread_id, user_id, (err) ->
  38. return next(err) if err?
  39. UserInfoManager.getPersonalInfo user_id, (err, user) ->
  40. return next(err) if err?
  41. EditorRealTimeController.emitToRoom project_id, "resolve-thread", thread_id, UserInfoController.formatPersonalInfo(user), (err)->
  42. res.send 204
  43. reopenThread: (req, res, next) ->
  44. {project_id, thread_id} = req.params
  45. logger.log {project_id, thread_id}, "reopening comment thread"
  46. ChatApiHandler.reopenThread project_id, thread_id, (err, threads) ->
  47. return next(err) if err?
  48. EditorRealTimeController.emitToRoom project_id, "reopen-thread", thread_id, (err)->
  49. res.send 204
  50. deleteThread: (req, res, next) ->
  51. {project_id, doc_id, thread_id} = req.params
  52. logger.log {project_id, doc_id, thread_id}, "deleting comment thread"
  53. DocumentUpdaterHandler.deleteThread project_id, doc_id, thread_id, (err) ->
  54. return next(err) if err?
  55. ChatApiHandler.deleteThread project_id, thread_id, (err, threads) ->
  56. return next(err) if err?
  57. EditorRealTimeController.emitToRoom project_id, "delete-thread", thread_id, (err)->
  58. res.send 204
  59. editMessage: (req, res, next) ->
  60. {project_id, thread_id, message_id} = req.params
  61. {content} = req.body
  62. logger.log {project_id, thread_id, message_id}, "editing message thread"
  63. ChatApiHandler.editMessage project_id, thread_id, message_id, content, (err) ->
  64. return next(err) if err?
  65. EditorRealTimeController.emitToRoom project_id, "edit-message", thread_id, message_id, content, (err)->
  66. res.send 204
  67. deleteMessage: (req, res, next) ->
  68. {project_id, thread_id, message_id} = req.params
  69. logger.log {project_id, thread_id, message_id}, "deleting message"
  70. ChatApiHandler.deleteMessage project_id, thread_id, message_id, (err, threads) ->
  71. return next(err) if err?
  72. EditorRealTimeController.emitToRoom project_id, "delete-message", thread_id, message_id, (err)->
  73. res.send 204
  74. _injectUserInfoIntoThreads: (threads, callback = (error, threads) ->) ->
  75. userCache = {}
  76. getUserDetails = (user_id, callback = (error, user) ->) ->
  77. return callback(null, userCache[user_id]) if userCache[user_id]?
  78. UserInfoManager.getPersonalInfo user_id, (err, user) ->
  79. return callback(error) if error?
  80. user = UserInfoController.formatPersonalInfo user
  81. userCache[user_id] = user
  82. callback null, user
  83. jobs = []
  84. for thread_id, thread of threads
  85. do (thread) ->
  86. if thread.resolved
  87. jobs.push (cb) ->
  88. getUserDetails thread.resolved_by_user_id, (error, user) ->
  89. cb(error) if error?
  90. thread.resolved_by_user = user
  91. cb()
  92. for message in thread.messages
  93. do (message) ->
  94. jobs.push (cb) ->
  95. getUserDetails message.user_id, (error, user) ->
  96. cb(error) if error?
  97. message.user = user
  98. cb()
  99. async.series jobs, (error) ->
  100. return callback(error) if error?
  101. return callback null, threads