MessageManager.js 2.3 KB

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