MessageHttpController.js 6.0 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158
  1. /* eslint-disable
  2. camelcase,
  3. max-len,
  4. no-unused-vars,
  5. */
  6. // TODO: This file was created by bulk-decaffeinate.
  7. // Fix any style issues and re-enable lint.
  8. /*
  9. * decaffeinate suggestions:
  10. * DS102: Remove unnecessary code created because of implicit returns
  11. * DS207: Consider shorter variations of null checks
  12. * Full docs: https://github.com/decaffeinate/decaffeinate/blob/master/docs/suggestions.md
  13. */
  14. let MessageHttpController;
  15. const logger = require("logger-sharelatex");
  16. const metrics = require("metrics-sharelatex");
  17. const MessageManager = require("./MessageManager");
  18. const MessageFormatter = require("./MessageFormatter");
  19. const ThreadManager = require("../Threads/ThreadManager");
  20. const {ObjectId} = require("../../mongojs");
  21. module.exports = (MessageHttpController = {
  22. DEFAULT_MESSAGE_LIMIT: 50,
  23. MAX_MESSAGE_LENGTH: 10 * 1024, // 10kb, about 1,500 words
  24. getGlobalMessages(req, res, next) {
  25. return MessageHttpController._getMessages(ThreadManager.GLOBAL_THREAD, req, res, next);
  26. },
  27. sendGlobalMessage(req, res, next) {
  28. return MessageHttpController._sendMessage(ThreadManager.GLOBAL_THREAD, req, res, next);
  29. },
  30. sendThreadMessage(req, res, next) {
  31. return MessageHttpController._sendMessage(req.params.thread_id, req, res, next);
  32. },
  33. getAllThreads(req, res, next) {
  34. const {project_id} = req.params;
  35. logger.log({project_id}, "getting all threads");
  36. return ThreadManager.findAllThreadRooms(project_id, function(error, rooms) {
  37. if (error != null) { return next(error); }
  38. const room_ids = rooms.map(r => r._id);
  39. return MessageManager.findAllMessagesInRooms(room_ids, function(error, messages) {
  40. if (error != null) { return next(error); }
  41. const threads = MessageFormatter.groupMessagesByThreads(rooms, messages);
  42. return res.json(threads);
  43. });
  44. });
  45. },
  46. resolveThread(req, res, next) {
  47. const {project_id, thread_id} = req.params;
  48. const {user_id} = req.body;
  49. logger.log({user_id, project_id, thread_id}, "marking thread as resolved");
  50. return ThreadManager.resolveThread(project_id, thread_id, user_id, function(error) {
  51. if (error != null) { return next(error); }
  52. return res.send(204);
  53. });
  54. }, // No content
  55. reopenThread(req, res, next) {
  56. const {project_id, thread_id} = req.params;
  57. logger.log({project_id, thread_id}, "reopening thread");
  58. return ThreadManager.reopenThread(project_id, thread_id, function(error) {
  59. if (error != null) { return next(error); }
  60. return res.send(204);
  61. });
  62. }, // No content
  63. deleteThread(req, res, next) {
  64. const {project_id, thread_id} = req.params;
  65. logger.log({project_id, thread_id}, "deleting thread");
  66. return ThreadManager.deleteThread(project_id, thread_id, function(error, room_id) {
  67. if (error != null) { return next(error); }
  68. return MessageManager.deleteAllMessagesInRoom(room_id, function(error) {
  69. if (error != null) { return next(error); }
  70. return res.send(204);
  71. });
  72. });
  73. }, // No content
  74. editMessage(req, res, next) {
  75. const {content} = req != null ? req.body : undefined;
  76. const {project_id, thread_id, message_id} = req.params;
  77. logger.log({project_id, thread_id, message_id, content}, "editing message");
  78. return ThreadManager.findOrCreateThread(project_id, thread_id, function(error, room) {
  79. if (error != null) { return next(error); }
  80. return MessageManager.updateMessage(room._id, message_id, content, Date.now(), function(error) {
  81. if (error != null) { return next(error); }
  82. return res.send(204);
  83. });
  84. });
  85. },
  86. deleteMessage(req, res, next) {
  87. const {project_id, thread_id, message_id} = req.params;
  88. logger.log({project_id, thread_id, message_id}, "deleting message");
  89. return ThreadManager.findOrCreateThread(project_id, thread_id, function(error, room) {
  90. if (error != null) { return next(error); }
  91. return MessageManager.deleteMessage(room._id, message_id, function(error, message) {
  92. if (error != null) { return next(error); }
  93. return res.send(204);
  94. });
  95. });
  96. },
  97. _sendMessage(client_thread_id, req, res, next) {
  98. const {user_id, content} = req != null ? req.body : undefined;
  99. const {project_id} = req.params;
  100. if (!ObjectId.isValid(user_id)) {
  101. return res.send(400, "Invalid user_id");
  102. }
  103. if ((content == null)) {
  104. return res.send(400, "No content provided");
  105. }
  106. if (content.length > this.MAX_MESSAGE_LENGTH) {
  107. return res.send(400, `Content too long (> ${this.MAX_MESSAGE_LENGTH} bytes)`);
  108. }
  109. logger.log({client_thread_id, project_id, user_id, content}, "new message received");
  110. return ThreadManager.findOrCreateThread(project_id, client_thread_id, function(error, thread) {
  111. if (error != null) { return next(error); }
  112. return MessageManager.createMessage(thread._id, user_id, content, Date.now(), function(error, message) {
  113. if (error != null) { return next(error); }
  114. message = MessageFormatter.formatMessageForClientSide(message);
  115. message.room_id = project_id;
  116. return res.send(201, message);
  117. });
  118. });
  119. },
  120. _getMessages(client_thread_id, req, res, next) {
  121. let before, limit;
  122. const {project_id} = req.params;
  123. if ((req.query != null ? req.query.before : undefined) != null) {
  124. before = parseInt(req.query.before, 10);
  125. } else {
  126. before = null;
  127. }
  128. if ((req.query != null ? req.query.limit : undefined) != null) {
  129. limit = parseInt(req.query.limit, 10);
  130. } else {
  131. limit = MessageHttpController.DEFAULT_MESSAGE_LIMIT;
  132. }
  133. logger.log({limit, before, project_id, client_thread_id}, "get message request received");
  134. return ThreadManager.findOrCreateThread(project_id, client_thread_id, function(error, thread) {
  135. if (error != null) { return next(error); }
  136. const thread_object_id = thread._id;
  137. logger.log({limit, before, project_id, client_thread_id, thread_object_id}, "found or created thread");
  138. return MessageManager.getMessages(thread_object_id, limit, before, function(error, messages) {
  139. if (error != null) { return next(error); }
  140. messages = MessageFormatter.formatMessagesForClientSide(messages);
  141. logger.log({project_id, messages}, "got messages");
  142. return res.send(200, messages);
  143. });
  144. });
  145. }
  146. });