1
0
Fork 0
mirror of https://github.com/overleaf/overleaf.git synced 2025-04-11 22:25:03 +00:00

refactored subscription updater again adding _setUsersMinimumFeatures

single place you can call and the users minimum features are set
This commit is contained in:
Henry Oswald 2016-03-31 16:58:16 +01:00
parent cb3eb88af2
commit 5a201153c7
2 changed files with 98 additions and 62 deletions
services/web
app/coffee/Features/Subscription
test/UnitTests/coffee/Subscription

View file

@ -11,33 +11,18 @@ ReferalAllocator = require("../Referal/ReferalAllocator")
oneMonthInSeconds = 60 * 60 * 24 * 30
module.exports =
module.exports = SubscriptionUpdater =
syncSubscription: (recurlySubscription, adminUser_id, callback) ->
self = @
logger.log adminUser_id:adminUser_id, recurlySubscription:recurlySubscription, "syncSubscription, creating new if subscription does not exist"
jobs =
subscription: (cb)->
SubscriptionLocator.getUsersSubscription adminUser_id, cb
groupSubscription: (cb)->
SubscriptionLocator.getGroupSubscriptionMemberOf adminUser_id, cb
async.series jobs, (err, results)->
{subscription, groupSubscription} = results
SubscriptionLocator.getUsersSubscription adminUser_id, (err, subscription)->
if subscription?
logger.log adminUser_id:adminUser_id, recurlySubscription:recurlySubscription, "subscription does exist"
self._updateSubscription recurlySubscription, subscription, (err)->
if err?
logger.err err:err, adminUser_id:adminUser_id, "error syncing subscription"
return callback(err)
if groupSubscription? and recurlySubscription.state == "expired"
logger.log adminUser_id:adminUser_id, "subscription does exist"
UserFeaturesUpdater.updateFeatures adminUser_id, groupSubscription.planCode, callback
else
callback()
SubscriptionUpdater._updateSubscriptionFromRecurly recurlySubscription, subscription, callback
else
logger.log adminUser_id:adminUser_id, recurlySubscription:recurlySubscription, "subscription does not exist, creating a new one"
self._createNewSubscription adminUser_id, (err, subscription)->
self._updateSubscription recurlySubscription, subscription, callback
SubscriptionUpdater._createNewSubscription adminUser_id, (err, subscription)->
SubscriptionUpdater._updateSubscriptionFromRecurly recurlySubscription, subscription, callback
addUserToGroup: (adminUser_id, user_id, callback)->
logger.log adminUser_id:adminUser_id, user_id:user_id, "adding user into mongo subscription"
@ -60,7 +45,8 @@ module.exports =
if err?
logger.err err:err, searchOps:searchOps, removeOperation:removeOperation, "error removing user from group"
return callback(err)
UserFeaturesUpdater.updateFeatures user_id, Settings.defaultPlanCode, callback
SubscriptionUpdater._setUsersMinimumFeatures user_id, callback
_createNewSubscription: (adminUser_id, callback)->
logger.log adminUser_id:adminUser_id, "creating new subscription"
@ -69,7 +55,7 @@ module.exports =
subscription.save (err)->
callback err, subscription
_updateSubscription: (recurlySubscription, subscription, callback)->
_updateSubscriptionFromRecurly: (recurlySubscription, subscription, callback)->
logger.log recurlySubscription:recurlySubscription, subscription:subscription, "updaing subscription"
plan = PlansLocator.findLocalPlanInSettings(recurlySubscription.plan.plan_code)
if recurlySubscription.state == "expired"
@ -88,8 +74,25 @@ module.exports =
allIds = _.union subscription.members_id, [subscription.admin_id]
jobs = allIds.map (user_id)->
return (cb)->
UserFeaturesUpdater.updateFeatures user_id, subscription.planCode, cb
jobs.push (cb)-> ReferalAllocator.assignBonus subscription.admin_id, cb
SubscriptionUpdater._setUsersMinimumFeatures user_id, cb
async.series jobs, callback
_setUsersMinimumFeatures: (user_id, callback)->
jobs =
subscription: (cb)->
SubscriptionLocator.getUsersSubscription user_id, cb
groupSubscription: (cb)->
SubscriptionLocator.getGroupSubscriptionMemberOf user_id, cb
async.series jobs, (err, results)->
{subscription, groupSubscription} = results
if subscription? and subscription.planCode?
UserFeaturesUpdater.updateFeatures user_id, subscription.planCode, callback
else if groupSubscription? and groupSubscription.planCode?
UserFeaturesUpdater.updateFeatures user_id, groupSubscription.planCode, callback
else
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

View file

@ -5,7 +5,7 @@ modulePath = "../../../../app/js/Features/Subscription/SubscriptionUpdater"
assert = require("chai").assert
ObjectId = require('mongoose').Types.ObjectId
describe "Subscription Updater", ->
describe "SubscriptionUpdater", ->
beforeEach ->
@recurlySubscription =
@ -13,7 +13,7 @@ describe "Subscription Updater", ->
plan:
plan_code: "kjhsakjds"
@adminUser =
_id:"5208dd34438843e2db000007"
_id: @adminuser_id = "5208dd34438843e2db000007"
@otherUserId = "5208dd34438842e2db000005"
@allUserIds = ["13213", "dsadas", "djsaiud89"]
@subscription = subscription =
@ -21,14 +21,14 @@ describe "Subscription Updater", ->
members_id: @allUserIds
save: sinon.stub().callsArgWith(0)
freeTrial:{}
plan_code:"student_or_something"
planCode:"student_or_something"
@groupSubscription =
admin_id: @adminUser._id
members_id: @allUserIds
save: sinon.stub().callsArgWith(0)
freeTrial:{}
plan_code:"group_subscription"
planCode:"group_subscription"
@updateStub = sinon.stub().callsArgWith(2, null)
@ -71,42 +71,33 @@ describe "Subscription Updater", ->
beforeEach ->
@SubscriptionLocator.getUsersSubscription.callsArgWith(1, null, @subscription)
@SubscriptionLocator.getGroupSubscriptionMemberOf.callsArgWith(1, null, @groupSubscription)
@SubscriptionUpdater._updateSubscription = sinon.stub().callsArgWith(2)
@SubscriptionUpdater._updateSubscriptionFromRecurly = sinon.stub().callsArgWith(2)
it "should update the subscription if the user already is admin of one", (done)->
@SubscriptionUpdater._createNewSubscription = sinon.stub()
@SubscriptionUpdater.syncSubscription @recurlySubscription, @adminUser._id, (err)=>
@SubscriptionLocator.getUsersSubscription.calledWith(@adminUser._id).should.equal true
@SubscriptionUpdater._updateSubscription.called.should.equal true
@SubscriptionUpdater._updateSubscription.calledWith(@recurlySubscription, @subscription).should.equal true
done()
it "should sync with the group subscription if the recurly subscription is expired", (done)->
@recurlySubscription.state = "expired"
@SubscriptionUpdater.syncSubscription @recurlySubscription, @adminUser._id, (err)=>
@SubscriptionLocator.getUsersSubscription.calledWith(@adminUser._id).should.equal true
@SubscriptionUpdater._updateSubscription.called.should.equal true
@SubscriptionUpdater._updateSubscription.calledWith(@recurlySubscription, @subscription).should.equal true
@UserFeaturesUpdater.updateFeatures.calledWith(@adminUser._id, @groupSubscription.planCode).should.equal true
@SubscriptionUpdater._updateSubscriptionFromRecurly.called.should.equal true
@SubscriptionUpdater._updateSubscriptionFromRecurly.calledWith(@recurlySubscription, @subscription).should.equal true
done()
it "should not call updateFeatures with group subscription if recurly subscription is not expired", (done)->
@SubscriptionUpdater.syncSubscription @recurlySubscription, @adminUser._id, (err)=>
@SubscriptionLocator.getUsersSubscription.calledWith(@adminUser._id).should.equal true
@SubscriptionUpdater._updateSubscription.called.should.equal true
@SubscriptionUpdater._updateSubscription.calledWith(@recurlySubscription, @subscription).should.equal true
@SubscriptionUpdater._updateSubscriptionFromRecurly.called.should.equal true
@SubscriptionUpdater._updateSubscriptionFromRecurly.calledWith(@recurlySubscription, @subscription).should.equal true
@UserFeaturesUpdater.updateFeatures.called.should.equal false
done()
describe "_updateSubscription", ->
describe "_updateSubscriptionFromRecurly", ->
beforeEach ->
@SubscriptionUpdater._setUsersMinimumFeatures = sinon.stub().callsArgWith(1)
it "should update the subscription with token etc when not expired", (done)->
@SubscriptionUpdater._updateSubscription @recurlySubscription, @subscription, (err)=>
@SubscriptionUpdater._updateSubscriptionFromRecurly @recurlySubscription, @subscription, (err)=>
@subscription.recurlySubscription_id.should.equal @recurlySubscription.uuid
@subscription.planCode.should.equal @recurlySubscription.plan.plan_code
@ -114,43 +105,40 @@ describe "Subscription Updater", ->
assert.equal(@subscription.freeTrial.expiresAt, undefined)
assert.equal(@subscription.freeTrial.planCode, undefined)
@subscription.save.called.should.equal true
@UserFeaturesUpdater.updateFeatures.calledWith(@adminUser._id, @recurlySubscription.plan.plan_code).should.equal true
@SubscriptionUpdater._setUsersMinimumFeatures.calledWith(@adminUser._id).should.equal true
done()
it "should remove the recurlySubscription_id when expired", (done)->
@recurlySubscription.state = "expired"
@SubscriptionUpdater._updateSubscription @recurlySubscription, @subscription, (err)=>
@SubscriptionUpdater._updateSubscriptionFromRecurly @recurlySubscription, @subscription, (err)=>
assert.equal(@subscription.recurlySubscription_id, undefined)
@subscription.save.called.should.equal true
@UserFeaturesUpdater.updateFeatures.calledWith(@adminUser._id, @Settings.defaultPlanCode).should.equal true
@SubscriptionUpdater._setUsersMinimumFeatures.calledWith(@adminUser._id).should.equal true
done()
it "should update all the users features", (done)->
@SubscriptionUpdater._updateSubscription @recurlySubscription, @subscription, (err)=>
@UserFeaturesUpdater.updateFeatures.calledWith(@adminUser._id, @recurlySubscription.plan.plan_code).should.equal true
@UserFeaturesUpdater.updateFeatures.calledWith(@allUserIds[0], @recurlySubscription.plan.plan_code).should.equal true
@UserFeaturesUpdater.updateFeatures.calledWith(@allUserIds[1], @recurlySubscription.plan.plan_code).should.equal true
@UserFeaturesUpdater.updateFeatures.calledWith(@allUserIds[2], @recurlySubscription.plan.plan_code).should.equal true
@SubscriptionUpdater._updateSubscriptionFromRecurly @recurlySubscription, @subscription, (err)=>
@SubscriptionUpdater._setUsersMinimumFeatures.calledWith(@adminUser._id).should.equal true
@SubscriptionUpdater._setUsersMinimumFeatures.calledWith(@allUserIds[0]).should.equal true
@SubscriptionUpdater._setUsersMinimumFeatures.calledWith(@allUserIds[1]).should.equal true
@SubscriptionUpdater._setUsersMinimumFeatures.calledWith(@allUserIds[2]).should.equal true
done()
it "should set group to true and save how many members can be added to group", (done)->
@PlansLocator.findLocalPlanInSettings.withArgs(@recurlySubscription.plan.plan_code).returns({groupPlan:true, membersLimit:5})
@SubscriptionUpdater._updateSubscription @recurlySubscription, @subscription, (err)=>
@SubscriptionUpdater._updateSubscriptionFromRecurly @recurlySubscription, @subscription, (err)=>
@subscription.membersLimit.should.equal 5
@subscription.groupPlan.should.equal true
done()
it "should not set group to true or set groupPlan", (done)->
@SubscriptionUpdater._updateSubscription @recurlySubscription, @subscription, (err)=>
@SubscriptionUpdater._updateSubscriptionFromRecurly @recurlySubscription, @subscription, (err)=>
assert.notEqual @subscription.membersLimit, 5
assert.notEqual @subscription.groupPlan, true
done()
it "should call assignBonus", (done)->
@SubscriptionUpdater._updateSubscription @recurlySubscription, @subscription, (err)=>
@ReferalAllocator.assignBonus.calledWith(@subscription.admin_id).should.equal true
done()
describe "_createNewSubscription", ->
it "should create a new subscription then update the subscription", (done)->
@ -176,6 +164,9 @@ describe "Subscription Updater", ->
done()
describe "removeUserFromGroup", ->
beforeEach ->
@SubscriptionUpdater._setUsersMinimumFeatures = sinon.stub().callsArgWith(1)
it "should pull the users id from the group", (done)->
@SubscriptionUpdater.removeUserFromGroup @adminUser._id, @otherUserId, =>
searchOps =
@ -187,5 +178,47 @@ describe "Subscription Updater", ->
it "should update the users features", (done)->
@SubscriptionUpdater.removeUserFromGroup @adminUser._id, @otherUserId, =>
@UserFeaturesUpdater.updateFeatures.calledWith(@otherUserId, @Settings.defaultPlanCode).should.equal true
@SubscriptionUpdater._setUsersMinimumFeatures.calledWith(@otherUserId).should.equal true
done()
describe "_setUsersMinimumFeatures", ->
it "should call updateFeatures with the subscription if set", (done)->
@SubscriptionLocator.getUsersSubscription.callsArgWith(1, null, @subscription)
@SubscriptionLocator.getGroupSubscriptionMemberOf.callsArgWith(1, null)
@SubscriptionUpdater._setUsersMinimumFeatures @adminUser._id, (err)=>
args = @UserFeaturesUpdater.updateFeatures.args[0]
assert.equal args[0], @adminUser._id
assert.equal args[1], @subscription.planCode
done()
it "should call updateFeatures with the group subscription if set", (done)->
@SubscriptionLocator.getUsersSubscription.callsArgWith(1, null)
@SubscriptionLocator.getGroupSubscriptionMemberOf.callsArgWith(1, null, @groupSubscription)
@SubscriptionUpdater._setUsersMinimumFeatures @adminUser._id, (err)=>
args = @UserFeaturesUpdater.updateFeatures.args[0]
assert.equal args[0], @adminUser._id
assert.equal args[1], @groupSubscription.planCode
done()
it "should call updateFeatures with default if there are no subscriptions for user", (done)->
@SubscriptionLocator.getUsersSubscription.callsArgWith(1, null)
@SubscriptionLocator.getGroupSubscriptionMemberOf.callsArgWith(1, null)
@SubscriptionUpdater._setUsersMinimumFeatures @adminuser_id, (err)=>
args = @UserFeaturesUpdater.updateFeatures.args[0]
assert.equal args[0], @adminUser._id
assert.equal args[1], @Settings.defaultPlanCode
done()
it "should call assignBonus", (done)->
@SubscriptionLocator.getUsersSubscription.callsArgWith(1, null)
@SubscriptionLocator.getGroupSubscriptionMemberOf.callsArgWith(1, null)
@SubscriptionUpdater._setUsersMinimumFeatures @adminuser_id, (err)=>
@ReferalAllocator.assignBonus.calledWith(@adminuser_id).should.equal true
done()