MessageHttpController.coffee 3.5 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586
  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. MessageManager.populateMessagesAndRoomsWithUsers messages, rooms, (error) ->
  24. return next(error) if error?
  25. threads = MessageFormatter.groupMessagesByThreads rooms, messages
  26. res.json threads
  27. resolveThread: (req, res, next) ->
  28. {project_id, thread_id} = req.params
  29. {user_id} = req.body
  30. logger.log {user_id, project_id, thread_id}, "marking thread as resolved"
  31. ThreadManager.resolveThread project_id, thread_id, user_id, (error) ->
  32. return next(error) if error?
  33. res.send 204 # No content
  34. reopenThread: (req, res, next) ->
  35. {project_id, thread_id} = req.params
  36. logger.log {project_id, thread_id}, "reopening thread"
  37. ThreadManager.reopenThread project_id, thread_id, (error) ->
  38. return next(error) if error?
  39. res.send 204 # No content
  40. _sendMessage: (client_thread_id, req, res, next) ->
  41. {user_id, content} = req?.body
  42. {project_id} = req.params
  43. if !ObjectId.isValid(user_id)
  44. return res.send(400, "Invalid user_id")
  45. logger.log {client_thread_id, project_id, user_id, content}, "new message received"
  46. ThreadManager.findOrCreateThread project_id, client_thread_id, (error, thread) ->
  47. return next(error) if error?
  48. MessageManager.createMessage thread._id, user_id, content, Date.now(), (error, message) ->
  49. return next(error) if error?
  50. MessageManager.populateMessagesAndRoomsWithUsers [message], [], (error) ->
  51. return next(error) if error?
  52. message = MessageFormatter.formatMessageForClientSide(message)
  53. message.room =
  54. id: project_id
  55. res.send(201, message)
  56. _getMessages: (client_thread_id, req, res, next) ->
  57. {project_id} = req.params
  58. if req.query?.before?
  59. before = parseInt(req.query.before, 10)
  60. else
  61. before = null
  62. if req.query?.limit?
  63. limit = parseInt(req.query.limit, 10)
  64. else
  65. limit = MessageHttpController.DEFAULT_MESSAGE_LIMIT
  66. logger.log {limit, before, project_id, client_thread_id}, "get message request received"
  67. ThreadManager.findOrCreateThread project_id, client_thread_id, (error, thread) ->
  68. return next(error) if error?
  69. thread_object_id = thread._id
  70. logger.log {limit, before, project_id, client_thread_id, thread_object_id}, "found or created thread"
  71. MessageManager.getMessages thread_object_id, limit, before, (error, messages) ->
  72. return next(error) if error?
  73. MessageManager.populateMessagesAndRoomsWithUsers messages, [], (error) ->
  74. return next(error) if error?
  75. messages = MessageFormatter.formatMessagesForClientSide messages
  76. logger.log {project_id, messages}, "got messages"
  77. res.send 200, messages