ThreadManager.js 2.4 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113
  1. let ThreadManager
  2. const { db, ObjectId } = require('../../mongodb')
  3. const logger = require('@overleaf/logger')
  4. const metrics = require('@overleaf/metrics')
  5. const { callbackify } = require('util')
  6. const GLOBAL_THREAD = 'GLOBAL'
  7. async function findOrCreateThread(projectId, threadId) {
  8. let query, update
  9. projectId = ObjectId(projectId.toString())
  10. if (threadId !== GLOBAL_THREAD) {
  11. threadId = ObjectId(threadId.toString())
  12. }
  13. if (threadId === 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. const result = await db.rooms.findOneAndUpdate(
  32. query,
  33. { $set: update },
  34. { upsert: true, returnDocument: 'after' }
  35. )
  36. return result.value
  37. }
  38. async function findAllThreadRooms(projectId) {
  39. return db.rooms
  40. .find(
  41. {
  42. project_id: ObjectId(projectId.toString()),
  43. thread_id: { $exists: true },
  44. },
  45. {
  46. thread_id: 1,
  47. resolved: 1,
  48. }
  49. )
  50. .toArray()
  51. }
  52. async function resolveThread(projectId, threadId, userId) {
  53. await db.rooms.updateOne(
  54. {
  55. project_id: ObjectId(projectId.toString()),
  56. thread_id: ObjectId(threadId.toString()),
  57. },
  58. {
  59. $set: {
  60. resolved: {
  61. user_id: userId,
  62. ts: new Date(),
  63. },
  64. },
  65. }
  66. )
  67. }
  68. async function reopenThread(projectId, threadId) {
  69. await db.rooms.updateOne(
  70. {
  71. project_id: ObjectId(projectId.toString()),
  72. thread_id: ObjectId(threadId.toString()),
  73. },
  74. {
  75. $unset: {
  76. resolved: true,
  77. },
  78. }
  79. )
  80. }
  81. async function deleteThread(projectId, threadId) {
  82. const room = await findOrCreateThread(projectId, threadId)
  83. await db.rooms.deleteOne({
  84. _id: room._id,
  85. })
  86. return room._id
  87. }
  88. module.exports = ThreadManager = {
  89. GLOBAL_THREAD,
  90. findOrCreateThread: callbackify(findOrCreateThread),
  91. findAllThreadRooms: callbackify(findAllThreadRooms),
  92. resolveThread: callbackify(resolveThread),
  93. reopenThread: callbackify(reopenThread),
  94. deleteThread: callbackify(deleteThread),
  95. }
  96. ;[
  97. 'findOrCreateThread',
  98. 'findAllThreadRooms',
  99. 'resolveThread',
  100. 'reopenThread',
  101. 'deleteThread',
  102. ].map(method =>
  103. metrics.timeAsyncMethod(ThreadManager, method, 'mongo.ThreadManager', logger)
  104. )