MessageManager.js 2.4 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108
  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. const res = await db.messages.updateOne(query, {
  51. $set: {
  52. content,
  53. edited_at: timestamp,
  54. },
  55. })
  56. return res.modifiedCount === 1
  57. }
  58. async function deleteMessage(roomId, messageId) {
  59. const query = _ensureIdsAreObjectIds({
  60. _id: messageId,
  61. room_id: roomId,
  62. })
  63. await db.messages.deleteOne(query)
  64. }
  65. function _ensureIdsAreObjectIds(query) {
  66. if (query.user_id && !(query.user_id instanceof ObjectId)) {
  67. query.user_id = ObjectId(query.user_id)
  68. }
  69. if (query.room_id && !(query.room_id instanceof ObjectId)) {
  70. query.room_id = ObjectId(query.room_id)
  71. }
  72. if (query._id && !(query._id instanceof ObjectId)) {
  73. query._id = ObjectId(query._id)
  74. }
  75. return query
  76. }
  77. module.exports = MessageManager = {
  78. createMessage,
  79. getMessages,
  80. findAllMessagesInRooms,
  81. deleteAllMessagesInRoom,
  82. deleteAllMessagesInRooms,
  83. updateMessage,
  84. deleteMessage,
  85. }
  86. ;[
  87. 'createMessage',
  88. 'getMessages',
  89. 'findAllMessagesInRooms',
  90. 'updateMessage',
  91. 'deleteMessage',
  92. ].map(method =>
  93. metrics.timeAsyncMethod(
  94. MessageManager,
  95. method,
  96. 'mongo.MessageManager',
  97. logger
  98. )
  99. )