MessageHttpController.coffee 4.3 KB

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