|
|
@@ -8,6 +8,7 @@ Settings = require("settings-sharelatex")
|
|
|
logger = require("logger-sharelatex")
|
|
|
ObjectId = require('mongoose').Types.ObjectId
|
|
|
ReferalAllocator = require("../Referal/ReferalAllocator")
|
|
|
+V1SubscriptionManager = require("./V1SubscriptionManager")
|
|
|
|
|
|
oneMonthInSeconds = 60 * 60 * 24 * 30
|
|
|
|
|
|
@@ -105,38 +106,66 @@ module.exports = SubscriptionUpdater =
|
|
|
|
|
|
_setUsersMinimumFeatures: (user_id, callback)->
|
|
|
jobs =
|
|
|
- subscription: (cb)->
|
|
|
- SubscriptionLocator.getUsersSubscription user_id, cb
|
|
|
- groupSubscription: (cb)->
|
|
|
- SubscriptionLocator.getGroupSubscriptionMemberOf user_id, cb
|
|
|
- v1PlanCode: (cb) ->
|
|
|
- Modules = require '../../infrastructure/Modules'
|
|
|
- Modules.hooks.fire 'getV1PlanCode', user_id, (err, results) ->
|
|
|
- cb(err, results?[0] || null)
|
|
|
+ individualFeatures: (cb)->
|
|
|
+ SubscriptionLocator.getUsersSubscription user_id, (err, sub)->
|
|
|
+ cb err, SubscriptionUpdater._subscriptionToFeatures(sub)
|
|
|
+ groupFeatures: (cb) ->
|
|
|
+ SubscriptionLocator.getGroupSubscriptionsMemberOf user_id, (err, subs) ->
|
|
|
+ cb err, (subs or []).map SubscriptionUpdater._subscriptionToFeatures
|
|
|
+ v1Features: (cb) ->
|
|
|
+ V1SubscriptionManager.getPlanCodeFromV1 user_id, (err, planCode) ->
|
|
|
+ cb err, SubscriptionUpdater._planCodeToFeatures(planCode)
|
|
|
+ bonusFeatures: (cb) ->
|
|
|
+ ReferalAllocator.getBonusFeatures user_id, cb
|
|
|
async.series jobs, (err, results)->
|
|
|
if err?
|
|
|
logger.err err:err, user_id:user_id,
|
|
|
"error getting subscription or group for _setUsersMinimumFeatures"
|
|
|
return callback(err)
|
|
|
- {subscription, groupSubscription, v1PlanCode} = results
|
|
|
- # Group Subscription
|
|
|
- if groupSubscription? and groupSubscription.planCode?
|
|
|
- logger.log user_id:user_id, "using group which user is memor of for features"
|
|
|
- UserFeaturesUpdater.updateFeatures user_id, groupSubscription.planCode, callback
|
|
|
- # Personal Subscription
|
|
|
- else if subscription? and subscription.planCode? and subscription.planCode != Settings.defaultPlanCode
|
|
|
- logger.log user_id:user_id, "using users subscription plan code for features"
|
|
|
- UserFeaturesUpdater.updateFeatures user_id, subscription.planCode, callback
|
|
|
- # V1 Subscription
|
|
|
- else if v1PlanCode?
|
|
|
- logger.log user_id: user_id, "using the V1 plan for features"
|
|
|
- UserFeaturesUpdater.updateFeatures user_id, v1PlanCode, callback
|
|
|
- # Default
|
|
|
+
|
|
|
+ {individualFeatures, groupFeatures, v1Features, bonusFeatures} = results
|
|
|
+ logger.log {user_id, individualFeatures, groupFeatures, v1Features, bonusFeatures}, 'merging user features'
|
|
|
+ featureSets = groupFeatures.concat [individualFeatures, v1Features, bonusFeatures]
|
|
|
+ features = _.reduce(featureSets, SubscriptionUpdater._mergeFeatures, Settings.defaultFeatures)
|
|
|
+
|
|
|
+ logger.log {user_id, features}, 'updating user features'
|
|
|
+ UserFeaturesUpdater.updateFeatures user_id, features, callback
|
|
|
+
|
|
|
+ _mergeFeatures: (featuresA, featuresB) ->
|
|
|
+ features = Object.assign({}, featuresA)
|
|
|
+ for key, value of featuresB
|
|
|
+ # Special merging logic for non-boolean features
|
|
|
+ if key == 'compileGroup'
|
|
|
+ if features['compileGroup'] == 'priority' or featuresB['compileGroup'] == 'priority'
|
|
|
+ features['compileGroup'] = 'priority'
|
|
|
+ else
|
|
|
+ features['compileGroup'] = 'standard'
|
|
|
+ else if key == 'collaborators'
|
|
|
+ if features['collaborators'] == -1 or featuresB['collaborators'] == -1
|
|
|
+ features['collaborators'] = -1
|
|
|
+ else
|
|
|
+ features['collaborators'] = Math.max(
|
|
|
+ features['collaborators'] or 0,
|
|
|
+ featuresB['collaborators'] or 0
|
|
|
+ )
|
|
|
+ else if key == 'compileTimeout'
|
|
|
+ features['compileTimeout'] = Math.max(
|
|
|
+ features['compileTimeout'] or 0,
|
|
|
+ featuresB['compileTimeout'] or 0
|
|
|
+ )
|
|
|
else
|
|
|
- logger.log user_id:user_id, "using default features for user with no subscription or group"
|
|
|
- UserFeaturesUpdater.updateFeatures user_id, Settings.defaultPlanCode, (err)->
|
|
|
- if err?
|
|
|
- logger.err err:err, user_id:user_id, "Error setting minimum user feature"
|
|
|
- return callback(err)
|
|
|
- ReferalAllocator.assignBonus user_id, callback
|
|
|
+ # Boolean keys, true is better
|
|
|
+ features[key] = features[key] or featuresB[key]
|
|
|
+ return features
|
|
|
|
|
|
+ _subscriptionToFeatures: (subscription) ->
|
|
|
+ SubscriptionUpdater._planCodeToFeatures(subscription?.planCode)
|
|
|
+
|
|
|
+ _planCodeToFeatures: (planCode) ->
|
|
|
+ if !planCode?
|
|
|
+ return {}
|
|
|
+ plan = PlansLocator.findLocalPlanInSettings planCode
|
|
|
+ if !plan?
|
|
|
+ return {}
|
|
|
+ else
|
|
|
+ return plan.features
|