MessageManager.js 2.4 KB

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