MessageHttpController.coffee 4.6 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112
  1. logger = require "logger-sharelatex"
  2. metrics = require "metrics-sharelatex"
  3. MessageManager = require "./MessageManager"
  4. MessageFormatter = require "./MessageFormatter"
  5. ThreadManager = require "../Threads/ThreadManager"
  6. {ObjectId} = require "../../mongojs"
  7. module.exports = MessageHttpController =
  8. DEFAULT_MESSAGE_LIMIT: 50
  9. MAX_MESSAGE_LENGTH: 10 * 1024 # 10kb, about 1,500 words
  10. getGlobalMessages: (req, res, next) ->
  11. MessageHttpController._getMessages(ThreadManager.GLOBAL_THREAD, req, res, next)
  12. sendGlobalMessage: (req, res, next) ->
  13. MessageHttpController._sendMessage(ThreadManager.GLOBAL_THREAD, req, res, next)
  14. sendThreadMessage: (req, res, next) ->
  15. MessageHttpController._sendMessage(req.params.thread_id, req, res, next)
  16. getAllThreads: (req, res, next) ->
  17. {project_id} = req.params
  18. logger.log {project_id}, "getting all threads"
  19. ThreadManager.findAllThreadRooms project_id, (error, rooms) ->
  20. return next(error) if error?
  21. room_ids = rooms.map (r) -> r._id
  22. MessageManager.findAllMessagesInRooms room_ids, (error, messages) ->
  23. return next(error) if error?
  24. threads = MessageFormatter.groupMessagesByThreads rooms, messages
  25. res.json threads
  26. resolveThread: (req, res, next) ->
  27. {project_id, thread_id} = req.params
  28. {user_id} = req.body
  29. logger.log {user_id, project_id, thread_id}, "marking thread as resolved"
  30. ThreadManager.resolveThread project_id, thread_id, user_id, (error) ->
  31. return next(error) if error?
  32. res.send 204 # No content
  33. reopenThread: (req, res, next) ->
  34. {project_id, thread_id} = req.params
  35. logger.log {project_id, thread_id}, "reopening thread"
  36. ThreadManager.reopenThread project_id, thread_id, (error) ->
  37. return next(error) if error?
  38. res.send 204 # No content
  39. deleteThread: (req, res, next) ->
  40. {project_id, thread_id} = req.params
  41. logger.log {project_id, thread_id}, "deleting thread"
  42. ThreadManager.deleteThread project_id, thread_id, (error, room_id) ->
  43. return next(error) if error?
  44. MessageManager.deleteAllMessagesInRoom room_id, (error) ->
  45. return next(error) if error?
  46. res.send 204 # No content
  47. editMessage: (req, res, next) ->
  48. {content} = req?.body
  49. {project_id, thread_id, message_id} = req.params
  50. logger.log {project_id, thread_id, message_id, content}, "editing message"
  51. ThreadManager.findOrCreateThread project_id, thread_id, (error, room) ->
  52. return next(error) if error?
  53. MessageManager.updateMessage room._id, message_id, content, Date.now(), (error) ->
  54. return next(error) if error?
  55. res.send(204)
  56. deleteMessage: (req, res, next) ->
  57. {project_id, thread_id, message_id} = req.params
  58. logger.log {project_id, thread_id, message_id}, "deleting message"
  59. ThreadManager.findOrCreateThread project_id, thread_id, (error, room) ->
  60. return next(error) if error?
  61. MessageManager.deleteMessage room._id, message_id, (error, message) ->
  62. return next(error) if error?
  63. res.send(204)
  64. _sendMessage: (client_thread_id, req, res, next) ->
  65. {user_id, content} = req?.body
  66. {project_id} = req.params
  67. if !ObjectId.isValid(user_id)
  68. return res.send(400, "Invalid user_id")
  69. if !content?
  70. return res.send(400, "No content provided")
  71. if content.length > @MAX_MESSAGE_LENGTH
  72. return res.send(400, "Content too long (> #{@MAX_MESSAGE_LENGTH} bytes)")
  73. logger.log {client_thread_id, project_id, user_id, content}, "new message received"
  74. ThreadManager.findOrCreateThread project_id, client_thread_id, (error, thread) ->
  75. return next(error) if error?
  76. MessageManager.createMessage thread._id, user_id, content, Date.now(), (error, message) ->
  77. return next(error) if error?
  78. message = MessageFormatter.formatMessageForClientSide(message)
  79. message.room_id = project_id
  80. res.send(201, message)
  81. _getMessages: (client_thread_id, req, res, next) ->
  82. {project_id} = req.params
  83. if req.query?.before?
  84. before = parseInt(req.query.before, 10)
  85. else
  86. before = null
  87. if req.query?.limit?
  88. limit = parseInt(req.query.limit, 10)
  89. else
  90. limit = MessageHttpController.DEFAULT_MESSAGE_LIMIT
  91. logger.log {limit, before, project_id, client_thread_id}, "get message request received"
  92. ThreadManager.findOrCreateThread project_id, client_thread_id, (error, thread) ->
  93. return next(error) if error?
  94. thread_object_id = thread._id
  95. logger.log {limit, before, project_id, client_thread_id, thread_object_id}, "found or created thread"
  96. MessageManager.getMessages thread_object_id, limit, before, (error, messages) ->
  97. return next(error) if error?
  98. messages = MessageFormatter.formatMessagesForClientSide messages
  99. logger.log {project_id, messages}, "got messages"
  100. res.send 200, messages