Przeglądaj źródła

update the entire users features on assign bonus bu don't update
the user features if there is nothing to update when assigning bonus

Henry Oswald 11 lat temu
rodzic
commit
f1d07811df

+ 11 - 10
services/web/app/coffee/Features/Referal/ReferalAllocator.coffee

@@ -38,28 +38,29 @@ module.exports = ReferalAllocator =
 			return callback(new Error("user not found")) if !user?
 			return callback(new Error("user not found")) if !user?
 			logger.log user_id: user_id, refered_user_count: user.refered_user_count, "assigning bonus"
 			logger.log user_id: user_id, refered_user_count: user.refered_user_count, "assigning bonus"
 			if user.refered_user_count? and user.refered_user_count > 0
 			if user.refered_user_count? and user.refered_user_count > 0
-				newFeatures = ReferalAllocator._calculateBonuses(user)
+				newFeatures = ReferalAllocator._calculateFeatures(user)
+				if _.isEqual newFeatures, user.features
+					return callback()
 				User.update query, { $set: features: newFeatures }, callback
 				User.update query, { $set: features: newFeatures }, callback
-
 			else
 			else
 				callback()
 				callback()
-		
-	_calculateBonuses : (user)->
-		bonusLevel = ReferalAllocator._getBonusLevel(user)
 
 
-		newFeatures = {}
+	_calculateFeatures : (user)->
+		bonusLevel = ReferalAllocator._getBonusLevel(user)
+		currentFeatures = _.clone(user.features) #need to clone because we exend with underscore later
+		betterBonusFeatures = {}
 		_.each Settings.bonus_features["#{bonusLevel}"], (bonusLevel, key)->
 		_.each Settings.bonus_features["#{bonusLevel}"], (bonusLevel, key)->
 			currentLevel = user?.features?[key]
 			currentLevel = user?.features?[key]
 			if _.isBoolean(currentLevel) and currentLevel == false
 			if _.isBoolean(currentLevel) and currentLevel == false
-				newFeatures[key] = bonusLevel
+				betterBonusFeatures[key] = bonusLevel
 
 
-			if _.isNumber(currentLevel) 
+			if _.isNumber(currentLevel)
 				if currentLevel == -1
 				if currentLevel == -1
 					return
 					return
 				bonusIsGreaterThanCurrent = currentLevel < bonusLevel
 				bonusIsGreaterThanCurrent = currentLevel < bonusLevel
 				if bonusIsGreaterThanCurrent or bonusLevel == -1
 				if bonusIsGreaterThanCurrent or bonusLevel == -1
-					newFeatures[key] = bonusLevel
-
+					betterBonusFeatures[key] = bonusLevel
+		newFeatures = _.extend(currentFeatures, betterBonusFeatures)
 		return newFeatures
 		return newFeatures
 
 
 
 

+ 21 - 2
services/web/test/UnitTests/coffee/Referal/ReferalAllocatorTests.coffee

@@ -87,7 +87,7 @@ describe 'Referalallocator', ->
 					features:{collaborators:1, dropbox:false, versioning:false} 
 					features:{collaborators:1, dropbox:false, versioning:false} 
 				}
 				}
 
 
-				@User.findOne = sinon.stub().callsArgWith 1, null,stubbedUser
+				@User.findOne = sinon.stub().callsArgWith 1, null, stubbedUser
 				@User.update = sinon.stub().callsArgWith 2, null
 				@User.update = sinon.stub().callsArgWith 2, null
 				@ReferalAllocator.assignBonus @user_id, @callback
 				@ReferalAllocator.assignBonus @user_id, @callback
 
 
@@ -110,6 +110,25 @@ describe 'Referalallocator', ->
 			it "should call the callback", ->
 			it "should call the callback", ->
 				@callback.called.should.equal true
 				@callback.called.should.equal true
 	
 	
+		describe "when there is nothing to assign", ->
+
+			beforeEach ->
+				@ReferalAllocator._calculateBonuses = sinon.stub().returns({})
+				@stubbedUser =
+					refered_user_count:4
+					features:{collaborators:3, versioning:true, dropbox:false}
+				@Settings.bonus_features =
+					"4":
+						collaborators:3
+						versioning:true
+						dropbox:false
+				@User.findOne = sinon.stub().callsArgWith 1, null, @stubbedUser
+				@User.update = sinon.stub().callsArgWith 2, null
+
+			it "should not call update if there are no bonuses to apply", (done)->
+				@ReferalAllocator.assignBonus @user_id, (err)=>
+					@User.update.called.should.equal false
+					done()
 
 
 		describe "when the user has better features already", ->
 		describe "when the user has better features already", ->
 			
 			
@@ -138,7 +157,7 @@ describe 'Referalallocator', ->
 			it "should not overright if the user has -1 users", (done)->
 			it "should not overright if the user has -1 users", (done)->
 				@stubbedUser.features.collaborators = -1
 				@stubbedUser.features.collaborators = -1
 				@ReferalAllocator.assignBonus @user_id, =>
 				@ReferalAllocator.assignBonus @user_id, =>
-					@User.update.calledWith({_id: @user_id }, {$set: features:{dropbox:true, versioning:false} }).should.equal true
+					@User.update.calledWith({_id: @user_id }, {$set: features:{dropbox:true, versioning:false, collaborators:-1} }).should.equal true
 					done()
 					done()
 
 
 		describe "when the user is not at a bonus level", ->
 		describe "when the user is not at a bonus level", ->