Merge pull request #705 from sharelatex/afc-import-team-from-v1

Changes to allow importing a team from v1
This commit is contained in:
Alberto Fernández-Capel
2018-07-03 13:39:19 +01:00
committed by GitHub
3 changed files with 61 additions and 32 deletions
@@ -33,3 +33,6 @@ module.exports =
getGroupsWithEmailInvite: (email, callback) -> getGroupsWithEmailInvite: (email, callback) ->
Subscription.find { invited_emails: email }, callback Subscription.find { invited_emails: email }, callback
getGroupWithV1Id: (v1TeamId, callback) ->
Subscription.findOne { "overleaf.id": v1TeamId }, callback
@@ -2,6 +2,7 @@ async = require("async")
_ = require("underscore") _ = require("underscore")
Subscription = require('../../models/Subscription').Subscription Subscription = require('../../models/Subscription').Subscription
SubscriptionLocator = require("./SubscriptionLocator") SubscriptionLocator = require("./SubscriptionLocator")
UserGetter = require("../User/UserGetter")
PlansLocator = require("./PlansLocator") PlansLocator = require("./PlansLocator")
Settings = require("settings-sharelatex") Settings = require("settings-sharelatex")
logger = require("logger-sharelatex") logger = require("logger-sharelatex")
@@ -24,17 +25,26 @@ module.exports = SubscriptionUpdater =
return callback(err) if err? return callback(err) if err?
SubscriptionUpdater._updateSubscriptionFromRecurly recurlySubscription, subscription, callback SubscriptionUpdater._updateSubscriptionFromRecurly recurlySubscription, subscription, callback
addUserToGroup: (adminUser_id, user_id, callback)-> addUserToGroup: (adminUserId, userId, callback)->
logger.log adminUser_id:adminUser_id, user_id:user_id, "adding user into mongo subscription" @addUsersToGroup(adminUserId, [userId], callback)
addUsersToGroup: (adminUserId, memberIds, callback)->
logger.log adminUserId: adminUserId, memberIds: memberIds, "adding members into mongo subscription"
searchOps = searchOps =
admin_id: adminUser_id admin_id: adminUserId
insertOperation = insertOperation =
"$addToSet": {member_ids:user_id} { $push: { member_ids: { $each: memberIds } } }
Subscription.findAndModify searchOps, insertOperation, (err, subscription)->
if err? Subscription.findAndModify searchOps, insertOperation, (err, subscription) ->
logger.err err:err, searchOps:searchOps, insertOperation:insertOperation, "error findy and modify add user to group" return callback(err) if err?
return callback(err)
FeaturesUpdater.refreshFeatures user_id, callback # Only apply features updates to users, not user stubs
UserGetter.getUsers memberIds, { _id: 1 }, (err, users) ->
return callback(err) if err?
userIds = users.map (u) -> u._id.toString()
async.map userIds, FeaturesUpdater.refreshFeatures, callback
removeUserFromGroup: (adminUser_id, user_id, callback)-> removeUserFromGroup: (adminUser_id, user_id, callback)->
searchOps = searchOps =
@@ -47,6 +57,9 @@ module.exports = SubscriptionUpdater =
return callback(err) return callback(err)
FeaturesUpdater.refreshFeatures user_id, callback FeaturesUpdater.refreshFeatures user_id, callback
deleteWithV1Id: (v1TeamId, callback)->
Subscription.deleteOne { "overleaf.id": v1TeamId }, callback
deleteSubscription: (subscription_id, callback = (error) ->) -> deleteSubscription: (subscription_id, callback = (error) ->) ->
SubscriptionLocator.getSubscription subscription_id, (err, subscription) -> SubscriptionLocator.getSubscription subscription_id, (err, subscription) ->
return callback(err) if err? return callback(err) if err?
@@ -58,12 +58,18 @@ describe "SubscriptionUpdater", ->
@PlansLocator = @PlansLocator =
findLocalPlanInSettings: sinon.stub().returns({}) findLocalPlanInSettings: sinon.stub().returns({})
@UserGetter =
getUsers: (memberIds, projection, callback) ->
users = memberIds.map (id) -> { _id: id }
callback(null, users)
@ReferalFeatures = getBonusFeatures: sinon.stub().callsArgWith(1) @ReferalFeatures = getBonusFeatures: sinon.stub().callsArgWith(1)
@Modules = {hooks: {fire: sinon.stub().callsArgWith(2, null, null)}} @Modules = {hooks: {fire: sinon.stub().callsArgWith(2, null, null)}}
@SubscriptionUpdater = SandboxedModule.require modulePath, requires: @SubscriptionUpdater = SandboxedModule.require modulePath, requires:
'../../models/Subscription': Subscription:@SubscriptionModel '../../models/Subscription': Subscription:@SubscriptionModel
'./UserFeaturesUpdater': @UserFeaturesUpdater './UserFeaturesUpdater': @UserFeaturesUpdater
'./SubscriptionLocator': @SubscriptionLocator './SubscriptionLocator': @SubscriptionLocator
'../User/UserGetter': @UserGetter
'./PlansLocator': @PlansLocator './PlansLocator': @PlansLocator
"logger-sharelatex": log:-> "logger-sharelatex": log:->
'settings-sharelatex': @Settings 'settings-sharelatex': @Settings
@@ -73,7 +79,6 @@ describe "SubscriptionUpdater", ->
describe "syncSubscription", -> describe "syncSubscription", ->
beforeEach -> beforeEach ->
@SubscriptionLocator.getUsersSubscription.callsArgWith(1, null, @subscription) @SubscriptionLocator.getUsersSubscription.callsArgWith(1, null, @subscription)
@SubscriptionUpdater._updateSubscriptionFromRecurly = sinon.stub().callsArgWith(2) @SubscriptionUpdater._updateSubscriptionFromRecurly = sinon.stub().callsArgWith(2)
@@ -87,7 +92,6 @@ describe "SubscriptionUpdater", ->
done() done()
it "should not call updateFeatures with group subscription if recurly subscription is not expired", (done)-> it "should not call updateFeatures with group subscription if recurly subscription is not expired", (done)->
@SubscriptionUpdater.syncSubscription @recurlySubscription, @adminUser._id, (err)=> @SubscriptionUpdater.syncSubscription @recurlySubscription, @adminUser._id, (err)=>
@SubscriptionLocator.getUsersSubscription.calledWith(@adminUser._id).should.equal true @SubscriptionLocator.getUsersSubscription.calledWith(@adminUser._id).should.equal true
@SubscriptionUpdater._updateSubscriptionFromRecurly.called.should.equal true @SubscriptionUpdater._updateSubscriptionFromRecurly.called.should.equal true
@@ -143,7 +147,6 @@ describe "SubscriptionUpdater", ->
done() done()
describe "_createNewSubscription", -> describe "_createNewSubscription", ->
it "should create a new subscription then update the subscription", (done)-> it "should create a new subscription then update the subscription", (done)->
@SubscriptionUpdater._createNewSubscription @adminUser._id, => @SubscriptionUpdater._createNewSubscription @adminUser._id, =>
@@ -153,15 +156,25 @@ describe "SubscriptionUpdater", ->
done() done()
describe "addUserToGroup", -> describe "addUserToGroup", ->
beforeEach ->
@SubscriptionUpdater.addUsersToGroup = sinon.stub().yields(null)
it "delegates to addUsersToGroup", (done)->
@SubscriptionUpdater.addUserToGroup @adminUser._id, @otherUserId, =>
@SubscriptionUpdater.addUsersToGroup
.calledWith(@adminUser._id, [@otherUserId]).should.equal true
done()
describe "addUsersToGroup", ->
beforeEach -> beforeEach ->
@FeaturesUpdater.refreshFeatures = sinon.stub().callsArgWith(1) @FeaturesUpdater.refreshFeatures = sinon.stub().callsArgWith(1)
it "should add the users id to the group as a set", (done)-> it "should add the user ids to the group as a set", (done)->
@SubscriptionUpdater.addUserToGroup @adminUser._id, @otherUserId, => @SubscriptionUpdater.addUsersToGroup @adminUser._id, [@otherUserId], =>
searchOps = searchOps =
admin_id: @adminUser._id admin_id: @adminUser._id
insertOperation = insertOperation =
"$addToSet": {member_ids:@otherUserId} { $push: { member_ids: { $each: [@otherUserId] } } }
@findAndModifyStub.calledWith(searchOps, insertOperation).should.equal true @findAndModifyStub.calledWith(searchOps, insertOperation).should.equal true
done() done()