MessageManager.js 2.4 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107
  1. let MessageManager
  2. const { db, ObjectId } = require('../../mongodb')
  3. const metrics = require('@overleaf/metrics')
  4. const logger = require('@overleaf/logger')
  5. async function createMessage(roomId, userId, content, timestamp) {
  6. let newMessageOpts = {
  7. content,
  8. room_id: roomId,
  9. user_id: userId,
  10. timestamp,
  11. }
  12. newMessageOpts = _ensureIdsAreObjectIds(newMessageOpts)
  13. const confirmation = await db.messages.insertOne(newMessageOpts)
  14. newMessageOpts._id = confirmation.insertedId
  15. return newMessageOpts
  16. }
  17. async function getMessages(roomId, limit, before) {
  18. let query = { room_id: roomId }
  19. if (before) {
  20. query.timestamp = { $lt: before }
  21. }
  22. query = _ensureIdsAreObjectIds(query)
  23. return db.messages.find(query).sort({ timestamp: -1 }).limit(limit).toArray()
  24. }
  25. async function findAllMessagesInRooms(roomIds) {
  26. return db.messages
  27. .find({
  28. room_id: { $in: roomIds },
  29. })
  30. .toArray()
  31. }
  32. async function deleteAllMessagesInRoom(roomId) {
  33. await db.messages.deleteMany({
  34. room_id: roomId,
  35. })
  36. }
  37. async function deleteAllMessagesInRooms(roomIds) {
  38. await db.messages.deleteMany({
  39. room_id: { $in: roomIds },
  40. })
  41. }
  42. async function updateMessage(roomId, messageId, userId, content, timestamp) {
  43. const query = _ensureIdsAreObjectIds({
  44. _id: messageId,
  45. room_id: roomId,
  46. })
  47. if (userId) {
  48. query.user_id = ObjectId(userId)
  49. }
  50. await db.messages.updateOne(query, {
  51. $set: {
  52. content,
  53. edited_at: timestamp,
  54. },
  55. })
  56. }
  57. async function deleteMessage(roomId, messageId) {
  58. const query = _ensureIdsAreObjectIds({
  59. _id: messageId,
  60. room_id: roomId,
  61. })
  62. await db.messages.deleteOne(query)
  63. }
  64. function _ensureIdsAreObjectIds(query) {
  65. if (query.user_id && !(query.user_id instanceof ObjectId)) {
  66. query.user_id = ObjectId(query.user_id)
  67. }
  68. if (query.room_id && !(query.room_id instanceof ObjectId)) {
  69. query.room_id = ObjectId(query.room_id)
  70. }
  71. if (query._id && !(query._id instanceof ObjectId)) {
  72. query._id = ObjectId(query._id)
  73. }
  74. return query
  75. }
  76. module.exports = MessageManager = {
  77. createMessage,
  78. getMessages,
  79. findAllMessagesInRooms,
  80. deleteAllMessagesInRoom,
  81. deleteAllMessagesInRooms,
  82. updateMessage,
  83. deleteMessage,
  84. }
  85. ;[
  86. 'createMessage',
  87. 'getMessages',
  88. 'findAllMessagesInRooms',
  89. 'updateMessage',
  90. 'deleteMessage',
  91. ].map(method =>
  92. metrics.timeAsyncMethod(
  93. MessageManager,
  94. method,
  95. 'mongo.MessageManager',
  96. logger
  97. )
  98. )