ThreadManager.js 2.7 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134
  1. let ThreadManager
  2. const { db, ObjectId } = require('../../mongodb')
  3. const logger = require('@overleaf/logger')
  4. const metrics = require('@overleaf/metrics')
  5. const GLOBAL_THREAD = 'GLOBAL'
  6. async function findOrCreateThread(projectId, threadId) {
  7. let query, update
  8. projectId = ObjectId(projectId.toString())
  9. if (threadId !== GLOBAL_THREAD) {
  10. threadId = ObjectId(threadId.toString())
  11. }
  12. if (threadId === GLOBAL_THREAD) {
  13. query = {
  14. project_id: projectId,
  15. thread_id: { $exists: false },
  16. }
  17. update = {
  18. project_id: projectId,
  19. }
  20. } else {
  21. query = {
  22. project_id: projectId,
  23. thread_id: threadId,
  24. }
  25. update = {
  26. project_id: projectId,
  27. thread_id: threadId,
  28. }
  29. }
  30. const result = await db.rooms.findOneAndUpdate(
  31. query,
  32. { $set: update },
  33. { upsert: true, returnDocument: 'after' }
  34. )
  35. return result.value
  36. }
  37. async function findAllThreadRooms(projectId) {
  38. return db.rooms
  39. .find(
  40. {
  41. project_id: ObjectId(projectId.toString()),
  42. thread_id: { $exists: true },
  43. },
  44. {
  45. thread_id: 1,
  46. resolved: 1,
  47. }
  48. )
  49. .toArray()
  50. }
  51. async function findAllThreadRoomsAndGlobalThread(projectId) {
  52. return db.rooms
  53. .find(
  54. {
  55. project_id: ObjectId(projectId.toString()),
  56. },
  57. {
  58. thread_id: 1,
  59. resolved: 1,
  60. }
  61. )
  62. .toArray()
  63. }
  64. async function resolveThread(projectId, threadId, userId) {
  65. await db.rooms.updateOne(
  66. {
  67. project_id: ObjectId(projectId.toString()),
  68. thread_id: ObjectId(threadId.toString()),
  69. },
  70. {
  71. $set: {
  72. resolved: {
  73. user_id: userId,
  74. ts: new Date(),
  75. },
  76. },
  77. }
  78. )
  79. }
  80. async function reopenThread(projectId, threadId) {
  81. await db.rooms.updateOne(
  82. {
  83. project_id: ObjectId(projectId.toString()),
  84. thread_id: ObjectId(threadId.toString()),
  85. },
  86. {
  87. $unset: {
  88. resolved: true,
  89. },
  90. }
  91. )
  92. }
  93. async function deleteThread(projectId, threadId) {
  94. const room = await findOrCreateThread(projectId, threadId)
  95. await db.rooms.deleteOne({
  96. _id: room._id,
  97. })
  98. return room._id
  99. }
  100. async function deleteAllThreadsInProject(projectId) {
  101. await db.rooms.deleteMany({
  102. project_id: ObjectId(projectId.toString()),
  103. })
  104. }
  105. module.exports = ThreadManager = {
  106. GLOBAL_THREAD,
  107. findOrCreateThread,
  108. findAllThreadRooms,
  109. findAllThreadRoomsAndGlobalThread,
  110. resolveThread,
  111. reopenThread,
  112. deleteThread,
  113. deleteAllThreadsInProject,
  114. }
  115. ;[
  116. 'findOrCreateThread',
  117. 'findAllThreadRooms',
  118. 'resolveThread',
  119. 'reopenThread',
  120. 'deleteThread',
  121. ].map(method =>
  122. metrics.timeAsyncMethod(ThreadManager, method, 'mongo.ThreadManager', logger)
  123. )