mongodb.js 3.7 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103
  1. const Settings = require('@overleaf/settings')
  2. const { MongoClient, ObjectId } = require('mongodb')
  3. const { addConnectionDrainer } = require('./GracefulShutdown')
  4. if (
  5. typeof global.beforeEach === 'function' &&
  6. process.argv.join(' ').match(/unit/)
  7. ) {
  8. throw new Error(
  9. 'It looks like unit tests are running, but you are connecting to Mongo. Missing a stub?'
  10. )
  11. }
  12. const clientPromise = MongoClient.connect(
  13. Settings.mongo.url,
  14. Settings.mongo.options
  15. )
  16. addConnectionDrainer('mongodb', async () => {
  17. const client = await clientPromise
  18. client.close()
  19. })
  20. let setupDbPromise
  21. async function waitForDb() {
  22. if (!setupDbPromise) {
  23. setupDbPromise = setupDb()
  24. }
  25. await setupDbPromise
  26. }
  27. const db = {}
  28. async function setupDb() {
  29. const internalDb = (await clientPromise).db()
  30. db.contacts = internalDb.collection('contacts')
  31. db.deletedFiles = internalDb.collection('deletedFiles')
  32. db.deletedProjects = internalDb.collection('deletedProjects')
  33. db.deletedSubscriptions = internalDb.collection('deletedSubscriptions')
  34. db.deletedUsers = internalDb.collection('deletedUsers')
  35. db.docHistory = internalDb.collection('docHistory')
  36. db.docHistoryIndex = internalDb.collection('docHistoryIndex')
  37. db.docOps = internalDb.collection('docOps')
  38. db.docSnapshots = internalDb.collection('docSnapshots')
  39. db.docs = internalDb.collection('docs')
  40. db.githubSyncEntityVersions = internalDb.collection(
  41. 'githubSyncEntityVersions'
  42. )
  43. db.githubSyncProjectStates = internalDb.collection('githubSyncProjectStates')
  44. db.githubSyncUserCredentials = internalDb.collection(
  45. 'githubSyncUserCredentials'
  46. )
  47. db.institutions = internalDb.collection('institutions')
  48. db.messages = internalDb.collection('messages')
  49. db.migrations = internalDb.collection('migrations')
  50. db.notifications = internalDb.collection('notifications')
  51. db.oauthAccessTokens = internalDb.collection('oauthAccessTokens')
  52. db.oauthApplications = internalDb.collection('oauthApplications')
  53. db.oauthAuthorizationCodes = internalDb.collection('oauthAuthorizationCodes')
  54. db.projectHistoryFailures = internalDb.collection('projectHistoryFailures')
  55. db.projectHistoryLabels = internalDb.collection('projectHistoryLabels')
  56. db.projectHistoryMetaData = internalDb.collection('projectHistoryMetaData')
  57. db.projectHistorySyncState = internalDb.collection('projectHistorySyncState')
  58. db.projectInvites = internalDb.collection('projectInvites')
  59. db.projects = internalDb.collection('projects')
  60. db.publishers = internalDb.collection('publishers')
  61. db.rooms = internalDb.collection('rooms')
  62. db.samlCache = internalDb.collection('samlCache')
  63. db.samlLogs = internalDb.collection('samlLogs')
  64. db.spellingPreferences = internalDb.collection('spellingPreferences')
  65. db.splittests = internalDb.collection('splittests')
  66. db.subscriptions = internalDb.collection('subscriptions')
  67. db.surveys = internalDb.collection('surveys')
  68. db.systemmessages = internalDb.collection('systemmessages')
  69. db.tags = internalDb.collection('tags')
  70. db.teamInvites = internalDb.collection('teamInvites')
  71. db.templates = internalDb.collection('templates')
  72. db.tokens = internalDb.collection('tokens')
  73. db.users = internalDb.collection('users')
  74. db.userstubs = internalDb.collection('userstubs')
  75. }
  76. async function getCollectionNames() {
  77. const internalDb = (await clientPromise).db()
  78. const collections = await internalDb.collections()
  79. return collections.map(collection => collection.collectionName)
  80. }
  81. /**
  82. * WARNING: Consider using a pre-populated collection from `db` to avoid typos!
  83. */
  84. async function getCollectionInternal(name) {
  85. const internalDb = (await clientPromise).db()
  86. return internalDb.collection(name)
  87. }
  88. module.exports = {
  89. db,
  90. ObjectId,
  91. getCollectionNames,
  92. getCollectionInternal,
  93. waitForDb,
  94. }