ThreadManager.js 2.9 KB

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