overleaf/services/web/scripts/backfill_user_properties.mjs
Liangjun Song 26f3f3e2e2 Merge pull request #21097 from overleaf/ls-scripts-to-esm-1
Migrate scripts folder to esm 1/x

GitOrigin-RevId: 4a4bc9a161f144fdb40ce3f2a0a9313b36c6df81
2024-10-21 08:04:42 +00:00

62 lines
1.9 KiB
JavaScript

import BatchedUpdateModule from './helpers/batchedUpdate.mjs'
import { promiseMapWithLimit } from '@overleaf/promise-utils'
import SubscriptionLocator from '../app/src/Features/Subscription/SubscriptionLocator.js'
import PlansLocator from '../app/src/Features/Subscription/PlansLocator.js'
import FeaturesHelper from '../app/src/Features/Subscription/FeaturesHelper.js'
import AnalyticsManager from '../app/src/Features/Analytics/AnalyticsManager.js'
const { batchedUpdateWithResultHandling } = BatchedUpdateModule
const WRITE_CONCURRENCY = parseInt(process.env.WRITE_CONCURRENCY, 10) || 10
async function getGroupSubscriptionPlanCode(userId) {
const subscriptions =
await SubscriptionLocator.promises.getMemberSubscriptions(userId)
let bestPlanCode = null
let bestFeatures = {}
for (const subscription of subscriptions) {
const plan = PlansLocator.findLocalPlanInSettings(subscription.planCode)
if (
plan &&
FeaturesHelper.isFeatureSetBetter(plan.features, bestFeatures)
) {
bestPlanCode = plan.planCode
bestFeatures = plan.features
}
}
return bestPlanCode
}
async function processUser(user) {
const analyticsId = user.analyticsId || user._id
const groupSubscriptionPlanCode = await getGroupSubscriptionPlanCode(user._id)
if (groupSubscriptionPlanCode) {
await AnalyticsManager.setUserPropertyForAnalyticsId(
analyticsId,
'group-subscription-plan-code',
groupSubscriptionPlanCode
)
}
const matchedFeatureSet = FeaturesHelper.getMatchedFeatureSet(user.features)
if (matchedFeatureSet !== 'personal') {
await AnalyticsManager.setUserPropertyForAnalyticsId(
analyticsId,
'feature-set',
matchedFeatureSet
)
}
}
async function processBatch(users) {
await promiseMapWithLimit(WRITE_CONCURRENCY, users, async user => {
await processUser(user)
})
}
batchedUpdateWithResultHandling('users', {}, processBatch, {
_id: true,
analyticsId: true,
features: true,
})