diff --git a/services/web/app/coffee/Features/Institutions/InstitutionsAPI.coffee b/services/web/app/coffee/Features/Institutions/InstitutionsAPI.coffee index 025a82bda0..8ce39d68e3 100644 --- a/services/web/app/coffee/Features/Institutions/InstitutionsAPI.coffee +++ b/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', diff --git a/services/web/app/coffee/Features/Institutions/InstitutionsManager.coffee b/services/web/app/coffee/Features/Institutions/InstitutionsManager.coffee new file mode 100644 index 0000000000..15233c8849 --- /dev/null +++ b/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) diff --git a/services/web/scripts/upgrade_institution_users.js b/services/web/scripts/upgrade_institution_users.js new file mode 100644 index 0000000000..8cf098ca2b --- /dev/null +++ b/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() +}) diff --git a/services/web/test/unit/coffee/Institutions/InstitutionsAPITests.coffee b/services/web/test/unit/coffee/Institutions/InstitutionsAPITests.coffee index 407c373462..7500e46e40 100644 --- a/services/web/test/unit/coffee/Institutions/InstitutionsAPITests.coffee +++ b/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' }] diff --git a/services/web/test/unit/coffee/Institutions/InstitutionsManagerTests.coffee b/services/web/test/unit/coffee/Institutions/InstitutionsManagerTests.coffee new file mode 100644 index 0000000000..acf0478ae2 --- /dev/null +++ b/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()