Tim Alby 8 лет назад
Родитель
Сommit
66bcdbcac9

+ 9 - 0
services/web/app/coffee/Features/Institutions/InstitutionsAPI.coffee

@@ -4,6 +4,14 @@ settings = require "settings-sharelatex"
 request = require "request"
 
 module.exports = InstitutionsAPI =
+	getInstitutionAffiliations: (institutionId, callback = (error, body) ->) ->
+		makeAffiliationRequest {
+			method: 'GET'
+			path: "/api/v2/institutions/#{institutionId.toString()}/affiliations"
+			defaultErrorMessage: "Couldn't get institution affiliations"
+		}, callback
+
+
 	getUserAffiliations: (userId, callback = (error, body) ->) ->
 		makeAffiliationRequest {
 			method: 'GET'
@@ -77,6 +85,7 @@ makeAffiliationRequest = (requestOptions, callback = (error) ->) ->
 		callback(null, body)
 
 [
+	'getInstitutionAffiliations'
 	'getUserAffiliations',
 	'addAffiliation',
 	'removeAffiliation',

+ 17 - 0
services/web/app/coffee/Features/Institutions/InstitutionsManager.coffee

@@ -0,0 +1,17 @@
+logger = require 'logger-sharelatex'
+async = require 'async'
+db = require("../../infrastructure/mongojs").db
+ObjectId = require("../../infrastructure/mongojs").ObjectId
+{ getInstitutionAffiliations } = require('./InstitutionsAPI')
+FeaturesUpdater = require('../Subscription/FeaturesUpdater')
+
+ASYNC_LIMIT = 10
+module.exports = InstitutionsManager =
+	upgradeInstitutionUsers: (institutionId, callback = (error) ->) ->
+		getInstitutionAffiliations institutionId, (error, affiliations) ->
+			return callback(error) if error
+			async.eachLimit affiliations, ASYNC_LIMIT, refreshFeatures, callback
+
+refreshFeatures = (affiliation, callback) ->
+	userId = ObjectId(affiliation.user_id)
+	FeaturesUpdater.refreshFeatures(userId, true, callback)

+ 16 - 0
services/web/scripts/upgrade_institution_users.js

@@ -0,0 +1,16 @@
+const InstitutionsManager = require(
+  '../app/js/Features/Institutions/InstitutionsManager'
+)
+
+const institutionId = parseInt(process.argv[2])
+if (isNaN(institutionId)) throw new Error('No institution id')
+console.log('Upgrading users of institution', institutionId)
+
+InstitutionsManager.upgradeInstitutionUsers(institutionId, function (error) {
+  if (error) {
+    console.log(error)
+  } else {
+    console.log('DONE 👌')
+  }
+  process.exit()
+})

+ 16 - 0
services/web/test/unit/coffee/Institutions/InstitutionsAPITests.coffee

@@ -25,6 +25,22 @@ describe "InstitutionsAPI", ->
 			email:"hello@world.com"
 		@newEmail = "bob@bob.com"
 
+	describe 'getInstitutionAffiliations', ->
+		it 'get affiliations', (done)->
+			@institutionId = 123
+			responseBody = ['123abc', '456def']
+			@request.yields(null, { statusCode: 200 }, responseBody)
+			@InstitutionsAPI.getInstitutionAffiliations @institutionId, (err, body) =>
+				should.not.exist(err)
+				@request.calledOnce.should.equal true
+				requestOptions = @request.lastCall.args[0]
+				expectedUrl = "v1.url/api/v2/institutions/#{@institutionId}/affiliations"
+				requestOptions.url.should.equal expectedUrl
+				requestOptions.method.should.equal 'GET'
+				should.not.exist(requestOptions.body)
+				body.should.equal responseBody
+				done()
+
 	describe 'getUserAffiliations', ->
 		it 'get affiliations', (done)->
 			responseBody = [{ foo: 'bar' }]

+ 30 - 0
services/web/test/unit/coffee/Institutions/InstitutionsManagerTests.coffee

@@ -0,0 +1,30 @@
+should = require('chai').should()
+SandboxedModule = require('sandboxed-module')
+path = require('path')
+sinon = require('sinon')
+modulePath = path.join __dirname, "../../../../app/js/Features/Institutions/InstitutionsManager"
+
+describe "InstitutionsManager", ->
+	beforeEach ->
+		@institutionId = 123
+		@logger = log: ->
+		@getInstitutionAffiliations = sinon.stub()
+		@refreshFeatures = sinon.stub().yields()
+		@InstitutionsManager = SandboxedModule.require modulePath, requires:
+			'logger-sharelatex': @logger
+			'./InstitutionsAPI':
+				getInstitutionAffiliations: @getInstitutionAffiliations
+			'../Subscription/FeaturesUpdater':
+				refreshFeatures: @refreshFeatures
+
+	describe 'upgradeInstitutionUsers', ->
+		it 'refresh all users Features', (done) ->
+			affiliations = [
+				{ user_id: '123abc123abc123abc123abc' }
+				{ user_id: '456def456def456def456def' }
+			]
+			@getInstitutionAffiliations.yields(null, affiliations)
+			@InstitutionsManager.upgradeInstitutionUsers @institutionId, (error) =>
+				should.not.exist(error)
+				sinon.assert.calledTwice(@refreshFeatures)
+				done()