Explorar el Código

Migration for "notificationsPreferences" collection (#29446)

* Implement notifications preferences model

* NotificationPreferences class

* remove index performance tests

* move to unit tests

* use zod

* saving multiple preference values

* set unique:true

* throw error if preferences can't be parsed

* use z.infer

* strict schema when saving preferences

* fix: update notifPreferenceKey type to only contain key values

---------

Co-authored-by: Domagoj Kriskovic <dom.kriskovic@overleaf.com>
GitOrigin-RevId: 20cf3799c91e6a890ab6217667594d181237c791
Jimmy Domagala-Tang hace 8 meses
padre
commit
ff987aa433

+ 1 - 0
services/web/app/src/infrastructure/mongodb.js

@@ -53,6 +53,7 @@ const db = {
   migrations: internalDb.collection('migrations'),
   notifications: internalDb.collection('notifications'),
   emailNotifications: internalDb.collection('emailNotifications'),
+  notificationsPreferences: internalDb.collection('notificationsPreferences'),
   oauthAccessTokens: internalDb.collection('oauthAccessTokens'),
   oauthApplications: internalDb.collection('oauthApplications'),
   oauthAuthorizationCodes: internalDb.collection('oauthAuthorizationCodes'),

+ 36 - 0
tools/migrations/20251110151140_create_notificationsPreferences_collection.mjs

@@ -0,0 +1,36 @@
+import Helpers from './lib/helpers.mjs'
+import { getCollectionInternal } from './lib/mongodb.mjs'
+
+const tags = ['server-ce', 'server-pro', 'saas']
+
+const indexes = [
+  {
+    // compound index for querying both global (project_id: null) and project-specific notification preferences
+    key: {
+      user_id: 1,
+      project_id: 1,
+    },
+    unique: true,
+    name: 'user_id_1_project_id_1',
+  },
+]
+
+const migrate = async () => {
+  const notificationsPreferences = await getCollectionInternal(
+    'notificationsPreferences'
+  )
+  await Helpers.addIndexesToCollection(notificationsPreferences, indexes)
+}
+
+const rollback = async () => {
+  const notificationsPreferences = await getCollectionInternal(
+    'notificationsPreferences'
+  )
+  await Helpers.dropIndexesFromCollection(notificationsPreferences, indexes)
+}
+
+export default {
+  tags,
+  migrate,
+  rollback,
+}