ThreadManager.js 3.2 KB

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