MessageManager.js 3.0 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126
  1. import { db, ObjectId } from '../../mongodb.js'
  2. export class MissingMessageError extends Error {}
  3. export async function createMessage(roomId, userId, content, timestamp) {
  4. let newMessageOpts = {
  5. content,
  6. room_id: roomId,
  7. user_id: userId,
  8. timestamp,
  9. }
  10. newMessageOpts = _ensureIdsAreObjectIds(newMessageOpts)
  11. const confirmation = await db.messages.insertOne(newMessageOpts)
  12. newMessageOpts._id = confirmation.insertedId
  13. return newMessageOpts
  14. }
  15. export async function getMessages(roomId, limit, before) {
  16. let query = { room_id: roomId }
  17. if (before) {
  18. query.timestamp = { $lt: before }
  19. }
  20. query = _ensureIdsAreObjectIds(query)
  21. return await db.messages
  22. .find(query)
  23. .sort({ timestamp: -1 })
  24. .limit(limit)
  25. .toArray()
  26. }
  27. export async function findAllMessagesInRooms(roomIds) {
  28. return await db.messages
  29. .find({
  30. room_id: { $in: roomIds },
  31. })
  32. .toArray()
  33. }
  34. export async function deleteAllMessagesInRoom(roomId) {
  35. await db.messages.deleteMany({
  36. room_id: roomId,
  37. })
  38. }
  39. export async function deleteAllMessagesInRooms(roomIds) {
  40. await db.messages.deleteMany({
  41. room_id: { $in: roomIds },
  42. })
  43. }
  44. export async function updateMessage(
  45. roomId,
  46. messageId,
  47. userId,
  48. content,
  49. timestamp
  50. ) {
  51. const query = _ensureIdsAreObjectIds({
  52. _id: messageId,
  53. room_id: roomId,
  54. })
  55. if (userId) {
  56. query.user_id = new ObjectId(userId)
  57. }
  58. const res = await db.messages.updateOne(query, {
  59. $set: {
  60. content,
  61. edited_at: timestamp,
  62. },
  63. })
  64. return res.modifiedCount === 1
  65. }
  66. export async function deleteMessage(roomId, messageId) {
  67. const query = _ensureIdsAreObjectIds({
  68. _id: messageId,
  69. room_id: roomId,
  70. })
  71. await db.messages.deleteOne(query)
  72. }
  73. export async function deleteUserMessage(userId, roomId, messageId) {
  74. await db.messages.deleteOne({
  75. _id: new ObjectId(messageId),
  76. user_id: new ObjectId(userId),
  77. room_id: new ObjectId(roomId),
  78. })
  79. }
  80. export async function getMessage(roomId, messageId) {
  81. const query = _ensureIdsAreObjectIds({
  82. _id: messageId,
  83. room_id: roomId,
  84. })
  85. const message = await db.messages.findOne(query)
  86. if (!message) {
  87. throw new MissingMessageError(`Message not found`)
  88. }
  89. return message
  90. }
  91. function _ensureIdsAreObjectIds(query) {
  92. if (query.user_id && !(query.user_id instanceof ObjectId)) {
  93. query.user_id = new ObjectId(query.user_id)
  94. }
  95. if (query.room_id && !(query.room_id instanceof ObjectId)) {
  96. query.room_id = new ObjectId(query.room_id)
  97. }
  98. if (query._id && !(query._id instanceof ObjectId)) {
  99. query._id = new ObjectId(query._id)
  100. }
  101. return query
  102. }
  103. export async function duplicateRoomToOtherRoom(sourceRoomId, targetRoomId) {
  104. const sourceMessages = await findAllMessagesInRooms([sourceRoomId])
  105. const targetMessages = sourceMessages.map(comment => {
  106. return _ensureIdsAreObjectIds({
  107. room_id: targetRoomId,
  108. content: comment.content,
  109. timestamp: comment.timestamp,
  110. user_id: comment.user_id,
  111. })
  112. })
  113. await db.messages.insertMany(targetMessages)
  114. }