ThreadManager.js 2.5 KB

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