diff --git a/services/web/app/coffee/Features/User/UserAffiliationsManager.coffee b/services/web/app/coffee/Features/User/UserAffiliationsManager.coffee index 68da2f7cba..2a81ae6bd5 100644 --- a/services/web/app/coffee/Features/User/UserAffiliationsManager.coffee +++ b/services/web/app/coffee/Features/User/UserAffiliationsManager.coffee @@ -31,6 +31,15 @@ module.exports = UserAffiliationsManager = }, callback + endorseAffiliation: (userId, email, role, department, callback = (error) ->) -> + makeAffiliationRequest { + method: 'POST' + path: "/api/v2/users/#{userId.toString()}/affiliations/endorse" + body: { email, role, department } + defaultErrorMessage: "Couldn't endorse affiliation" + }, callback + + deleteAffiliations: (userId, callback = (error) ->) -> makeAffiliationRequest { method: 'DELETE' diff --git a/services/web/app/coffee/Features/User/UserEmailsController.coffee b/services/web/app/coffee/Features/User/UserEmailsController.coffee index a6335521d6..af1a355d6e 100644 --- a/services/web/app/coffee/Features/User/UserEmailsController.coffee +++ b/services/web/app/coffee/Features/User/UserEmailsController.coffee @@ -3,6 +3,7 @@ UserGetter = require("./UserGetter") UserUpdater = require("./UserUpdater") EmailHelper = require("../Helpers/EmailHelper") UserEmailsConfirmationHandler = require "./UserEmailsConfirmationHandler" +{ endorseAffiliation } = require("./UserAffiliationsManager") logger = require("logger-sharelatex") Errors = require "../Errors/Errors" @@ -50,6 +51,17 @@ module.exports = UserEmailsController = return next(error) if error? res.sendStatus 200 + + endorse: (req, res, next) -> + userId = AuthenticationController.getLoggedInUserId(req) + email = EmailHelper.parseEmail(req.body.email) + return res.sendStatus 422 unless email? + + endorseAffiliation userId, email, req.body.role, req.body.department, (error)-> + return next(error) if error? + res.sendStatus 204 + + showConfirm: (req, res, next) -> res.render 'user/confirm_email', { token: req.query.token, diff --git a/services/web/app/coffee/router.coffee b/services/web/app/coffee/router.coffee index ed6ea83c10..2d9cce105d 100644 --- a/services/web/app/coffee/router.coffee +++ b/services/web/app/coffee/router.coffee @@ -126,6 +126,9 @@ module.exports = class Router webRouter.post '/user/emails/default', AuthenticationController.requireLogin(), UserEmailsController.setDefault + webRouter.post '/user/emails/endorse', + AuthenticationController.requireLogin(), + UserEmailsController.endorse webRouter.get '/user/sessions', diff --git a/services/web/test/unit/coffee/User/UserAffiliationsManagerTests.coffee b/services/web/test/unit/coffee/User/UserAffiliationsManagerTests.coffee index dfcd864c09..ff3d96a283 100644 --- a/services/web/test/unit/coffee/User/UserAffiliationsManagerTests.coffee +++ b/services/web/test/unit/coffee/User/UserAffiliationsManagerTests.coffee @@ -125,3 +125,23 @@ describe "UserAffiliationsManager", -> err.message.should.have.string 518 err.message.should.have.string body.errors done() + + describe 'endorseAffiliation', -> + beforeEach -> + @request.callsArgWith(1, null, { statusCode: 204 }) + + it 'endorse affiliation', (done)-> + @UserAffiliationsManager.endorseAffiliation @stubbedUser._id, @newEmail, 'Student','Physics', (err)=> + should.not.exist(err) + @request.calledOnce.should.equal true + requestOptions = @request.lastCall.args[0] + expectedUrl = "v1.url/api/v2/users/#{@stubbedUser._id}/affiliations/endorse" + requestOptions.url.should.equal expectedUrl + requestOptions.method.should.equal 'POST' + + body = requestOptions.body + Object.keys(body).length.should.equal 3 + body.email.should.equal @newEmail + body.role.should.equal 'Student' + body.department.should.equal 'Physics' + done() diff --git a/services/web/test/unit/coffee/User/UserEmailsControllerTests.coffee b/services/web/test/unit/coffee/User/UserEmailsControllerTests.coffee index d55b7fd963..384623a2b5 100644 --- a/services/web/test/unit/coffee/User/UserEmailsControllerTests.coffee +++ b/services/web/test/unit/coffee/User/UserEmailsControllerTests.coffee @@ -26,12 +26,14 @@ describe "UserEmailsController", -> setDefaultEmailAddress: sinon.stub() @EmailHelper = parseEmail: sinon.stub() + @endorseAffiliation = sinon.stub().yields() @UserEmailsController = SandboxedModule.require modulePath, requires: "../Authentication/AuthenticationController": @AuthenticationController "./UserGetter": @UserGetter "./UserUpdater": @UserUpdater "../Helpers/EmailHelper": @EmailHelper "./UserEmailsConfirmationHandler": @UserEmailsConfirmationHandler = {} + "./UserAffiliationsManager": endorseAffiliation: @endorseAffiliation "../Errors/Errors": Errors "logger-sharelatex": log: -> console.log(arguments) @@ -142,6 +144,22 @@ describe "UserEmailsController", -> assertNotCalled @UserUpdater.setDefaultEmailAddress done() + describe 'endorse', -> + beforeEach -> + @email = 'email_to_endorse@bar.com' + @req.body.email = @email + @EmailHelper.parseEmail.returns @email + + it 'endorses affiliation', (done) -> + @req.body.role = 'Role' + @req.body.department = 'Department' + + @UserEmailsController.endorse @req, + sendStatus: (code) => + code.should.equal 204 + assertCalledWith @endorseAffiliation, @user._id, @email, 'Role', 'Department' + done() + describe 'confirm', -> beforeEach -> @UserEmailsConfirmationHandler.confirmEmailFromToken = sinon.stub().yields()