MessageManager.js 3.7 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151
  1. /* eslint-disable
  2. camelcase,
  3. handle-callback-err,
  4. max-len,
  5. no-unused-vars,
  6. */
  7. // TODO: This file was created by bulk-decaffeinate.
  8. // Fix any style issues and re-enable lint.
  9. /*
  10. * decaffeinate suggestions:
  11. * DS102: Remove unnecessary code created because of implicit returns
  12. * DS207: Consider shorter variations of null checks
  13. * Full docs: https://github.com/decaffeinate/decaffeinate/blob/master/docs/suggestions.md
  14. */
  15. let MessageManager
  16. const { ObjectId, getCollection } = require('../../mongodb')
  17. const metrics = require('metrics-sharelatex')
  18. const logger = require('logger-sharelatex')
  19. const messagesCollectionPromise = getCollection('messages')
  20. module.exports = MessageManager = {
  21. createMessage(room_id, user_id, content, timestamp, callback) {
  22. if (callback == null) {
  23. callback = function (error, message) {}
  24. }
  25. let newMessageOpts = {
  26. content,
  27. room_id,
  28. user_id,
  29. timestamp
  30. }
  31. newMessageOpts = this._ensureIdsAreObjectIds(newMessageOpts)
  32. messagesCollectionPromise.then((messages) =>
  33. messages.insertOne(newMessageOpts, function (error, confirmation) {
  34. if (error) {
  35. return callback(error)
  36. }
  37. newMessageOpts._id = confirmation.insertedId
  38. callback(null, newMessageOpts)
  39. })
  40. )
  41. },
  42. getMessages(room_id, limit, before, callback) {
  43. if (callback == null) {
  44. callback = function (error, messages) {}
  45. }
  46. let query = { room_id }
  47. if (before != null) {
  48. query.timestamp = { $lt: before }
  49. }
  50. query = this._ensureIdsAreObjectIds(query)
  51. messagesCollectionPromise.then((messages) =>
  52. messages
  53. .find(query)
  54. .sort({ timestamp: -1 })
  55. .limit(limit)
  56. .toArray(callback)
  57. )
  58. },
  59. findAllMessagesInRooms(room_ids, callback) {
  60. if (callback == null) {
  61. callback = function (error, messages) {}
  62. }
  63. messagesCollectionPromise.then((messages) =>
  64. messages
  65. .find({
  66. room_id: { $in: room_ids }
  67. })
  68. .toArray(callback)
  69. )
  70. },
  71. deleteAllMessagesInRoom(room_id, callback) {
  72. if (callback == null) {
  73. callback = function (error) {}
  74. }
  75. messagesCollectionPromise.then((messages) =>
  76. messages.deleteMany(
  77. {
  78. room_id
  79. },
  80. callback
  81. )
  82. )
  83. },
  84. updateMessage(room_id, message_id, content, timestamp, callback) {
  85. if (callback == null) {
  86. callback = function (error, message) {}
  87. }
  88. const query = this._ensureIdsAreObjectIds({
  89. _id: message_id,
  90. room_id
  91. })
  92. messagesCollectionPromise.then((messages) =>
  93. messages.updateOne(
  94. query,
  95. {
  96. $set: {
  97. content,
  98. edited_at: timestamp
  99. }
  100. },
  101. callback
  102. )
  103. )
  104. },
  105. deleteMessage(room_id, message_id, callback) {
  106. if (callback == null) {
  107. callback = function (error) {}
  108. }
  109. const query = this._ensureIdsAreObjectIds({
  110. _id: message_id,
  111. room_id
  112. })
  113. messagesCollectionPromise.then((messages) =>
  114. messages.deleteOne(query, callback)
  115. )
  116. },
  117. _ensureIdsAreObjectIds(query) {
  118. if (query.user_id != null && !(query.user_id instanceof ObjectId)) {
  119. query.user_id = ObjectId(query.user_id)
  120. }
  121. if (query.room_id != null && !(query.room_id instanceof ObjectId)) {
  122. query.room_id = ObjectId(query.room_id)
  123. }
  124. if (query._id != null && !(query._id instanceof ObjectId)) {
  125. query._id = ObjectId(query._id)
  126. }
  127. return query
  128. }
  129. }
  130. ;[
  131. 'createMessage',
  132. 'getMessages',
  133. 'findAllMessagesInRooms',
  134. 'updateMessage',
  135. 'deleteMessage'
  136. ].map((method) =>
  137. metrics.timeAsyncMethod(
  138. MessageManager,
  139. method,
  140. 'mongo.MessageManager',
  141. logger
  142. )
  143. )