MessageManager.js 2.2 KB

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