ThreadManager.js 2.2 KB

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