Просмотр исходного кода

Merge pull request #15350 from overleaf/csh-issue-11625-mongo-ug-5-notifications

Use mongodb-legacy in notifications for callback support

GitOrigin-RevId: 90f05f747e221c1bd61564e2e28e505d0b125467
Christopher Hoskin 2 лет назад
Родитель
Сommit
e86ef1139e

+ 187 - 58
package-lock.json

@@ -28048,6 +28048,84 @@
         "node": ">=12"
       }
     },
+    "node_modules/mongodb-legacy": {
+      "version": "6.0.1",
+      "resolved": "https://registry.npmjs.org/mongodb-legacy/-/mongodb-legacy-6.0.1.tgz",
+      "integrity": "sha512-cbm3UOqAYo6yElNk9CHNp5tQwRl1PCpBpcSkVvlvyg7S+gG6vSt1zrFiEniNaWOwwWnIr/IsAeSo48Nm701B/A==",
+      "dependencies": {
+        "mongodb": "^6.0.0"
+      },
+      "engines": {
+        "node": ">=16.20.1"
+      }
+    },
+    "node_modules/mongodb-legacy/node_modules/bson": {
+      "version": "6.2.0",
+      "resolved": "https://registry.npmjs.org/bson/-/bson-6.2.0.tgz",
+      "integrity": "sha512-ID1cI+7bazPDyL9wYy9GaQ8gEEohWvcUl/Yf0dIdutJxnmInEEyCsb4awy/OiBfall7zBA179Pahi3vCdFze3Q==",
+      "engines": {
+        "node": ">=16.20.1"
+      }
+    },
+    "node_modules/mongodb-legacy/node_modules/gcp-metadata": {
+      "version": "5.3.0",
+      "resolved": "https://registry.npmjs.org/gcp-metadata/-/gcp-metadata-5.3.0.tgz",
+      "integrity": "sha512-FNTkdNEnBdlqF2oatizolQqNANMrcqJt6AAYt99B3y1aLLC8Hc5IOBb+ZnnzllodEEf6xMBp6wRcBbc16fa65w==",
+      "optional": true,
+      "peer": true,
+      "dependencies": {
+        "gaxios": "^5.0.0",
+        "json-bigint": "^1.0.0"
+      },
+      "engines": {
+        "node": ">=12"
+      }
+    },
+    "node_modules/mongodb-legacy/node_modules/mongodb": {
+      "version": "6.1.0",
+      "resolved": "https://registry.npmjs.org/mongodb/-/mongodb-6.1.0.tgz",
+      "integrity": "sha512-AvzNY0zMkpothZ5mJAaIo2bGDjlJQqqAbn9fvtVgwIIUPEfdrqGxqNjjbuKyrgQxg2EvCmfWdjq+4uj96c0YPw==",
+      "dependencies": {
+        "@mongodb-js/saslprep": "^1.1.0",
+        "bson": "^6.1.0",
+        "mongodb-connection-string-url": "^2.6.0"
+      },
+      "engines": {
+        "node": ">=16.20.1"
+      },
+      "peerDependencies": {
+        "@aws-sdk/credential-providers": "^3.188.0",
+        "@mongodb-js/zstd": "^1.1.0",
+        "gcp-metadata": "^5.2.0",
+        "kerberos": "^2.0.1",
+        "mongodb-client-encryption": ">=6.0.0 <7",
+        "snappy": "^7.2.2",
+        "socks": "^2.7.1"
+      },
+      "peerDependenciesMeta": {
+        "@aws-sdk/credential-providers": {
+          "optional": true
+        },
+        "@mongodb-js/zstd": {
+          "optional": true
+        },
+        "gcp-metadata": {
+          "optional": true
+        },
+        "kerberos": {
+          "optional": true
+        },
+        "mongodb-client-encryption": {
+          "optional": true
+        },
+        "snappy": {
+          "optional": true
+        },
+        "socks": {
+          "optional": true
+        }
+      }
+    },
     "node_modules/mongoose": {
       "version": "5.13.20",
       "resolved": "https://registry.npmjs.org/mongoose/-/mongoose-5.13.20.tgz",
@@ -38509,7 +38587,8 @@
         "bunyan": "^1.8.15",
         "express": "^4.18.2",
         "method-override": "^3.0.0",
-        "mongodb": "^4.11.0",
+        "mongodb": "^6.1.0",
+        "mongodb-legacy": "^6.0.1",
         "request": "^2.88.2"
       },
       "devDependencies": {
@@ -38521,54 +38600,70 @@
       }
     },
     "services/notifications/node_modules/bson": {
-      "version": "4.7.2",
-      "resolved": "https://registry.npmjs.org/bson/-/bson-4.7.2.tgz",
-      "integrity": "sha512-Ry9wCtIZ5kGqkJoi6aD8KjxFZEx78guTQDnpXWiNthsxzrxAK/i8E6pCHAIZTbaEFWcOCvbecMukfK7XUvyLpQ==",
-      "dependencies": {
-        "buffer": "^5.6.0"
-      },
+      "version": "6.2.0",
+      "resolved": "https://registry.npmjs.org/bson/-/bson-6.2.0.tgz",
+      "integrity": "sha512-ID1cI+7bazPDyL9wYy9GaQ8gEEohWvcUl/Yf0dIdutJxnmInEEyCsb4awy/OiBfall7zBA179Pahi3vCdFze3Q==",
       "engines": {
-        "node": ">=6.9.0"
+        "node": ">=16.20.1"
       }
     },
-    "services/notifications/node_modules/buffer": {
-      "version": "5.7.1",
-      "resolved": "https://registry.npmjs.org/buffer/-/buffer-5.7.1.tgz",
-      "integrity": "sha512-EHcyIPBQ4BSGlvjB16k5KgAJ27CIsHY/2JBmCRReo48y9rQ3MaUzWX3KVlBa4U7MyX02HdVj0K7C3WaB3ju7FQ==",
-      "funding": [
-        {
-          "type": "github",
-          "url": "https://github.com/sponsors/feross"
-        },
-        {
-          "type": "patreon",
-          "url": "https://www.patreon.com/feross"
-        },
-        {
-          "type": "consulting",
-          "url": "https://feross.org/support"
-        }
-      ],
+    "services/notifications/node_modules/gcp-metadata": {
+      "version": "5.3.0",
+      "resolved": "https://registry.npmjs.org/gcp-metadata/-/gcp-metadata-5.3.0.tgz",
+      "integrity": "sha512-FNTkdNEnBdlqF2oatizolQqNANMrcqJt6AAYt99B3y1aLLC8Hc5IOBb+ZnnzllodEEf6xMBp6wRcBbc16fa65w==",
+      "optional": true,
+      "peer": true,
       "dependencies": {
-        "base64-js": "^1.3.1",
-        "ieee754": "^1.1.13"
+        "gaxios": "^5.0.0",
+        "json-bigint": "^1.0.0"
+      },
+      "engines": {
+        "node": ">=12"
       }
     },
     "services/notifications/node_modules/mongodb": {
-      "version": "4.17.1",
-      "resolved": "https://registry.npmjs.org/mongodb/-/mongodb-4.17.1.tgz",
-      "integrity": "sha512-MBuyYiPUPRTqfH2dV0ya4dcr2E5N52ocBuZ8Sgg/M030nGF78v855B3Z27mZJnp8PxjnUquEnAtjOsphgMZOlQ==",
+      "version": "6.1.0",
+      "resolved": "https://registry.npmjs.org/mongodb/-/mongodb-6.1.0.tgz",
+      "integrity": "sha512-AvzNY0zMkpothZ5mJAaIo2bGDjlJQqqAbn9fvtVgwIIUPEfdrqGxqNjjbuKyrgQxg2EvCmfWdjq+4uj96c0YPw==",
       "dependencies": {
-        "bson": "^4.7.2",
-        "mongodb-connection-string-url": "^2.6.0",
-        "socks": "^2.7.1"
+        "@mongodb-js/saslprep": "^1.1.0",
+        "bson": "^6.1.0",
+        "mongodb-connection-string-url": "^2.6.0"
       },
       "engines": {
-        "node": ">=12.9.0"
+        "node": ">=16.20.1"
       },
-      "optionalDependencies": {
-        "@aws-sdk/credential-providers": "^3.186.0",
-        "@mongodb-js/saslprep": "^1.1.0"
+      "peerDependencies": {
+        "@aws-sdk/credential-providers": "^3.188.0",
+        "@mongodb-js/zstd": "^1.1.0",
+        "gcp-metadata": "^5.2.0",
+        "kerberos": "^2.0.1",
+        "mongodb-client-encryption": ">=6.0.0 <7",
+        "snappy": "^7.2.2",
+        "socks": "^2.7.1"
+      },
+      "peerDependenciesMeta": {
+        "@aws-sdk/credential-providers": {
+          "optional": true
+        },
+        "@mongodb-js/zstd": {
+          "optional": true
+        },
+        "gcp-metadata": {
+          "optional": true
+        },
+        "kerberos": {
+          "optional": true
+        },
+        "mongodb-client-encryption": {
+          "optional": true
+        },
+        "snappy": {
+          "optional": true
+        },
+        "socks": {
+          "optional": true
+        }
       }
     },
     "services/project-history": {
@@ -46791,39 +46886,37 @@
         "express": "^4.18.2",
         "method-override": "^3.0.0",
         "mocha": "^10.2.0",
-        "mongodb": "^4.11.0",
+        "mongodb": "^6.1.0",
+        "mongodb-legacy": "^6.0.1",
         "request": "^2.88.2",
         "sandboxed-module": "^2.0.4",
         "sinon": "^9.2.4"
       },
       "dependencies": {
         "bson": {
-          "version": "4.7.2",
-          "resolved": "https://registry.npmjs.org/bson/-/bson-4.7.2.tgz",
-          "integrity": "sha512-Ry9wCtIZ5kGqkJoi6aD8KjxFZEx78guTQDnpXWiNthsxzrxAK/i8E6pCHAIZTbaEFWcOCvbecMukfK7XUvyLpQ==",
-          "requires": {
-            "buffer": "^5.6.0"
-          }
+          "version": "6.2.0",
+          "resolved": "https://registry.npmjs.org/bson/-/bson-6.2.0.tgz",
+          "integrity": "sha512-ID1cI+7bazPDyL9wYy9GaQ8gEEohWvcUl/Yf0dIdutJxnmInEEyCsb4awy/OiBfall7zBA179Pahi3vCdFze3Q=="
         },
-        "buffer": {
-          "version": "5.7.1",
-          "resolved": "https://registry.npmjs.org/buffer/-/buffer-5.7.1.tgz",
-          "integrity": "sha512-EHcyIPBQ4BSGlvjB16k5KgAJ27CIsHY/2JBmCRReo48y9rQ3MaUzWX3KVlBa4U7MyX02HdVj0K7C3WaB3ju7FQ==",
+        "gcp-metadata": {
+          "version": "5.3.0",
+          "resolved": "https://registry.npmjs.org/gcp-metadata/-/gcp-metadata-5.3.0.tgz",
+          "integrity": "sha512-FNTkdNEnBdlqF2oatizolQqNANMrcqJt6AAYt99B3y1aLLC8Hc5IOBb+ZnnzllodEEf6xMBp6wRcBbc16fa65w==",
+          "optional": true,
+          "peer": true,
           "requires": {
-            "base64-js": "^1.3.1",
-            "ieee754": "^1.1.13"
+            "gaxios": "^5.0.0",
+            "json-bigint": "^1.0.0"
           }
         },
         "mongodb": {
-          "version": "4.17.1",
-          "resolved": "https://registry.npmjs.org/mongodb/-/mongodb-4.17.1.tgz",
-          "integrity": "sha512-MBuyYiPUPRTqfH2dV0ya4dcr2E5N52ocBuZ8Sgg/M030nGF78v855B3Z27mZJnp8PxjnUquEnAtjOsphgMZOlQ==",
+          "version": "6.1.0",
+          "resolved": "https://registry.npmjs.org/mongodb/-/mongodb-6.1.0.tgz",
+          "integrity": "sha512-AvzNY0zMkpothZ5mJAaIo2bGDjlJQqqAbn9fvtVgwIIUPEfdrqGxqNjjbuKyrgQxg2EvCmfWdjq+4uj96c0YPw==",
           "requires": {
-            "@aws-sdk/credential-providers": "^3.186.0",
             "@mongodb-js/saslprep": "^1.1.0",
-            "bson": "^4.7.2",
-            "mongodb-connection-string-url": "^2.6.0",
-            "socks": "^2.7.1"
+            "bson": "^6.1.0",
+            "mongodb-connection-string-url": "^2.6.0"
           }
         }
       }
@@ -64043,6 +64136,42 @@
         }
       }
     },
+    "mongodb-legacy": {
+      "version": "6.0.1",
+      "resolved": "https://registry.npmjs.org/mongodb-legacy/-/mongodb-legacy-6.0.1.tgz",
+      "integrity": "sha512-cbm3UOqAYo6yElNk9CHNp5tQwRl1PCpBpcSkVvlvyg7S+gG6vSt1zrFiEniNaWOwwWnIr/IsAeSo48Nm701B/A==",
+      "requires": {
+        "mongodb": "^6.0.0"
+      },
+      "dependencies": {
+        "bson": {
+          "version": "6.2.0",
+          "resolved": "https://registry.npmjs.org/bson/-/bson-6.2.0.tgz",
+          "integrity": "sha512-ID1cI+7bazPDyL9wYy9GaQ8gEEohWvcUl/Yf0dIdutJxnmInEEyCsb4awy/OiBfall7zBA179Pahi3vCdFze3Q=="
+        },
+        "gcp-metadata": {
+          "version": "5.3.0",
+          "resolved": "https://registry.npmjs.org/gcp-metadata/-/gcp-metadata-5.3.0.tgz",
+          "integrity": "sha512-FNTkdNEnBdlqF2oatizolQqNANMrcqJt6AAYt99B3y1aLLC8Hc5IOBb+ZnnzllodEEf6xMBp6wRcBbc16fa65w==",
+          "optional": true,
+          "peer": true,
+          "requires": {
+            "gaxios": "^5.0.0",
+            "json-bigint": "^1.0.0"
+          }
+        },
+        "mongodb": {
+          "version": "6.1.0",
+          "resolved": "https://registry.npmjs.org/mongodb/-/mongodb-6.1.0.tgz",
+          "integrity": "sha512-AvzNY0zMkpothZ5mJAaIo2bGDjlJQqqAbn9fvtVgwIIUPEfdrqGxqNjjbuKyrgQxg2EvCmfWdjq+4uj96c0YPw==",
+          "requires": {
+            "@mongodb-js/saslprep": "^1.1.0",
+            "bson": "^6.1.0",
+            "mongodb-connection-string-url": "^2.6.0"
+          }
+        }
+      }
+    },
     "mongoose": {
       "version": "5.13.20",
       "resolved": "https://registry.npmjs.org/mongoose/-/mongoose-5.13.20.tgz",

+ 3 - 3
services/notifications/app/js/HealthCheckController.js

@@ -18,11 +18,11 @@ const logger = require('@overleaf/logger')
 
 module.exports = {
   check(callback) {
-    const userId = ObjectId()
+    const userId = new ObjectId()
     const cleanupNotifications = callback =>
-      db.notifications.remove({ user_id: userId }, callback)
+      db.notifications.deleteOne({ user_id: userId }, callback)
 
-    let notificationKey = `smoke-test-notification-${ObjectId()}`
+    let notificationKey = `smoke-test-notification-${new ObjectId()}`
     const getOpts = endPath => ({
       url: `http://localhost:${port}/user/${userId}${endPath}`,
       timeout: 5000,

+ 6 - 6
services/notifications/app/js/Notifications.js

@@ -20,7 +20,7 @@ module.exports = Notifications = {
       callback = function () {}
     }
     const query = {
-      user_id: ObjectId(userId),
+      user_id: new ObjectId(userId),
       templateKey: { $exists: true },
     }
     db.notifications.find(query).toArray(callback)
@@ -31,7 +31,7 @@ module.exports = Notifications = {
       callback = function () {}
     }
     const query = {
-      user_id: ObjectId(userId),
+      user_id: new ObjectId(userId),
       key: notification.key,
     }
     return db.notifications.count(query, function (err, count) {
@@ -54,7 +54,7 @@ module.exports = Notifications = {
           return callback()
         }
         const doc = {
-          user_id: ObjectId(userId),
+          user_id: new ObjectId(userId),
           key: notification.key,
           messageOpts: notification.messageOpts,
           templateKey: notification.templateKey,
@@ -88,8 +88,8 @@ module.exports = Notifications = {
 
   removeNotificationId(userId, notificationId, callback) {
     const searchOps = {
-      user_id: ObjectId(userId),
-      _id: ObjectId(notificationId),
+      user_id: new ObjectId(userId),
+      _id: new ObjectId(notificationId),
     }
     const updateOperation = { $unset: { templateKey: true, messageOpts: true } }
     db.notifications.updateOne(searchOps, updateOperation, callback)
@@ -97,7 +97,7 @@ module.exports = Notifications = {
 
   removeNotificationKey(userId, notificationKey, callback) {
     const searchOps = {
-      user_id: ObjectId(userId),
+      user_id: new ObjectId(userId),
       key: notificationKey,
     }
     const updateOperation = { $unset: { templateKey: true } }

+ 1 - 1
services/notifications/app/js/mongodb.js

@@ -1,6 +1,6 @@
 const Metrics = require('@overleaf/metrics')
 const Settings = require('@overleaf/settings')
-const { MongoClient, ObjectId } = require('mongodb')
+const { MongoClient, ObjectId } = require('mongodb-legacy')
 
 const mongoClient = new MongoClient(Settings.mongo.url)
 const mongoDb = mongoClient.db()

+ 2 - 1
services/notifications/package.json

@@ -26,7 +26,8 @@
     "bunyan": "^1.8.15",
     "express": "^4.18.2",
     "method-override": "^3.0.0",
-    "mongodb": "^4.11.0",
+    "mongodb": "^6.1.0",
+    "mongodb-legacy": "^6.0.1",
     "request": "^2.88.2"
   },
   "devDependencies": {

+ 9 - 9
services/notifications/test/unit/js/NotificationsTests.js

@@ -18,7 +18,7 @@ const assert = require('assert')
 const { ObjectId } = require('mongodb')
 
 const userId = '51dc93e6fb625a261300003b'
-const notificationId = 'fb625a26f09d'
+const notificationId = '574ee8d6f40c3a244e704249'
 const notificationKey = 'notification-key'
 
 describe('Notifications Tests', function () {
@@ -46,7 +46,7 @@ describe('Notifications Tests', function () {
     })
 
     this.stubbedNotification = {
-      user_id: ObjectId(userId),
+      user_id: new ObjectId(userId),
       key: 'notification-key',
       messageOpts: 'some info',
       templateKey: 'template-key',
@@ -63,7 +63,7 @@ describe('Notifications Tests', function () {
           if (err) return done(err)
           notifications.should.equal(this.stubbedNotificationArray)
           assert.deepEqual(this.findStub.args[0][0], {
-            user_id: ObjectId(userId),
+            user_id: new ObjectId(userId),
             templateKey: { $exists: true },
           })
           return done()
@@ -75,7 +75,7 @@ describe('Notifications Tests', function () {
   describe('addNotification', function () {
     beforeEach(function () {
       this.stubbedNotification = {
-        user_id: ObjectId(userId),
+        user_id: new ObjectId(userId),
         key: 'notification-key',
         messageOpts: 'some info',
         templateKey: 'template-key',
@@ -150,7 +150,7 @@ describe('Notifications Tests', function () {
     describe('when the notification is set to expire', function () {
       beforeEach(function () {
         this.stubbedNotification = {
-          user_id: ObjectId(userId),
+          user_id: new ObjectId(userId),
           key: 'notification-key',
           messageOpts: 'some info',
           templateKey: 'template-key',
@@ -190,7 +190,7 @@ describe('Notifications Tests', function () {
     return describe('when the notification has a nonsensical expires field', function () {
       beforeEach(function () {
         this.stubbedNotification = {
-          user_id: ObjectId(userId),
+          user_id: new ObjectId(userId),
           key: 'notification-key',
           messageOpts: 'some info',
           templateKey: 'template-key',
@@ -229,8 +229,8 @@ describe('Notifications Tests', function () {
         err => {
           if (err) return done(err)
           const searchOps = {
-            user_id: ObjectId(userId),
-            _id: ObjectId(notificationId),
+            user_id: new ObjectId(userId),
+            _id: new ObjectId(notificationId),
           }
           const updateOperation = {
             $unset: { templateKey: true, messageOpts: true },
@@ -253,7 +253,7 @@ describe('Notifications Tests', function () {
         err => {
           if (err) return done(err)
           const searchOps = {
-            user_id: ObjectId(userId),
+            user_id: new ObjectId(userId),
             key: notificationKey,
           }
           const updateOperation = {