mongodb.js 4.6 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126
  1. const { ObjectId, ReadPreference } = require('mongodb')
  2. const OError = require('@overleaf/o-error')
  3. const Settings = require('@overleaf/settings')
  4. const { getNativeDb } = require('./Mongoose')
  5. if (
  6. typeof global.beforeEach === 'function' &&
  7. process.argv.join(' ').match(/unit/)
  8. ) {
  9. throw new Error(
  10. 'It looks like unit tests are running, but you are connecting to Mongo. Missing a stub?'
  11. )
  12. }
  13. const READ_PREFERENCE_PRIMARY = ReadPreference.primary.mode
  14. const READ_PREFERENCE_SECONDARY = Settings.mongo.hasSecondaries
  15. ? ReadPreference.secondary.mode
  16. : ReadPreference.secondaryPreferred.mode
  17. let setupDbPromise
  18. async function waitForDb() {
  19. if (!setupDbPromise) {
  20. setupDbPromise = setupDb()
  21. }
  22. await setupDbPromise
  23. }
  24. const db = {}
  25. async function setupDb() {
  26. const internalDb = await getNativeDb()
  27. db.contacts = internalDb.collection('contacts')
  28. db.deletedFiles = internalDb.collection('deletedFiles')
  29. db.deletedProjects = internalDb.collection('deletedProjects')
  30. db.deletedSubscriptions = internalDb.collection('deletedSubscriptions')
  31. db.deletedUsers = internalDb.collection('deletedUsers')
  32. db.dropboxEntities = internalDb.collection('dropboxEntities')
  33. db.dropboxProjects = internalDb.collection('dropboxProjects')
  34. db.docHistory = internalDb.collection('docHistory')
  35. db.docHistoryIndex = internalDb.collection('docHistoryIndex')
  36. db.docSnapshots = internalDb.collection('docSnapshots')
  37. db.docs = internalDb.collection('docs')
  38. db.feedbacks = internalDb.collection('feedbacks')
  39. db.githubSyncEntityVersions = internalDb.collection(
  40. 'githubSyncEntityVersions'
  41. )
  42. db.githubSyncProjectStates = internalDb.collection('githubSyncProjectStates')
  43. db.githubSyncUserCredentials = internalDb.collection(
  44. 'githubSyncUserCredentials'
  45. )
  46. db.institutions = internalDb.collection('institutions')
  47. db.messages = internalDb.collection('messages')
  48. db.migrations = internalDb.collection('migrations')
  49. db.notifications = internalDb.collection('notifications')
  50. db.oauthAccessTokens = internalDb.collection('oauthAccessTokens')
  51. db.oauthApplications = internalDb.collection('oauthApplications')
  52. db.oauthAuthorizationCodes = internalDb.collection('oauthAuthorizationCodes')
  53. db.projectAuditLogEntries = internalDb.collection('projectAuditLogEntries')
  54. db.projectHistoryChunks = internalDb.collection('projectHistoryChunks')
  55. db.projectHistoryFailures = internalDb.collection('projectHistoryFailures')
  56. db.projectHistoryLabels = internalDb.collection('projectHistoryLabels')
  57. db.projectHistoryMetaData = internalDb.collection('projectHistoryMetaData')
  58. db.projectHistorySyncState = internalDb.collection('projectHistorySyncState')
  59. db.projectInvites = internalDb.collection('projectInvites')
  60. db.projects = internalDb.collection('projects')
  61. db.publishers = internalDb.collection('publishers')
  62. db.rooms = internalDb.collection('rooms')
  63. db.samlCache = internalDb.collection('samlCache')
  64. db.samlLogs = internalDb.collection('samlLogs')
  65. db.spellingPreferences = internalDb.collection('spellingPreferences')
  66. db.splittests = internalDb.collection('splittests')
  67. db.ssoConfigs = internalDb.collection('ssoConfigs')
  68. db.subscriptions = internalDb.collection('subscriptions')
  69. db.surveys = internalDb.collection('surveys')
  70. db.systemmessages = internalDb.collection('systemmessages')
  71. db.tags = internalDb.collection('tags')
  72. db.teamInvites = internalDb.collection('teamInvites')
  73. db.templates = internalDb.collection('templates')
  74. db.tokens = internalDb.collection('tokens')
  75. db.userAuditLogEntries = internalDb.collection('userAuditLogEntries')
  76. db.users = internalDb.collection('users')
  77. db.userstubs = internalDb.collection('userstubs')
  78. db.onboardingDataCollection = internalDb.collection(
  79. 'onboardingDataCollection'
  80. )
  81. }
  82. async function getCollectionNames() {
  83. const internalDb = await getNativeDb()
  84. const collections = await internalDb.collections()
  85. return collections.map(collection => collection.collectionName)
  86. }
  87. async function dropTestDatabase() {
  88. const internalDb = await getNativeDb()
  89. const dbName = internalDb.databaseName
  90. const env = process.env.NODE_ENV
  91. if (dbName !== 'test-overleaf' || env !== 'test') {
  92. throw new OError(
  93. `Refusing to clear database '${dbName}' in environment '${env}'`
  94. )
  95. }
  96. await internalDb.dropDatabase()
  97. }
  98. /**
  99. * WARNING: Consider using a pre-populated collection from `db` to avoid typos!
  100. */
  101. async function getCollectionInternal(name) {
  102. const internalDb = await getNativeDb()
  103. return internalDb.collection(name)
  104. }
  105. module.exports = {
  106. db,
  107. ObjectId,
  108. getCollectionNames,
  109. getCollectionInternal,
  110. dropTestDatabase,
  111. waitForDb,
  112. READ_PREFERENCE_PRIMARY,
  113. READ_PREFERENCE_SECONDARY,
  114. }