ThreadManager.js 2.6 KB

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