MessageManager.js 2.7 KB

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