1
0
Fork 0
mirror of https://github.com/overleaf/overleaf.git synced 2025-04-08 16:42:35 +00:00

add emails endpoints

This commit is contained in:
Tim Alby 2018-06-08 19:05:19 +02:00
parent bc6a38a4f1
commit e614ed9248
6 changed files with 250 additions and 1 deletions

View file

@ -0,0 +1,43 @@
AuthenticationController = require('../Authentication/AuthenticationController')
UserGetter = require("./UserGetter")
UserUpdater = require("./UserUpdater")
EmailHelper = require("../Helpers/EmailHelper")
logger = require("logger-sharelatex")
module.exports = UserEmailsController =
list: (req, res) ->
userId = AuthenticationController.getLoggedInUserId(req)
UserGetter.getUserFullEmails userId, (error, fullEmails) ->
return res.sendStatus 500 if error?
res.json fullEmails
add: (req, res) ->
userId = AuthenticationController.getLoggedInUserId(req)
email = EmailHelper.parseEmail(req.body.email)
return res.sendStatus 422 unless email?
UserUpdater.addEmailAddress userId, email, (error)->
return res.sendStatus 500 if error?
res.sendStatus 200
remove: (req, res) ->
userId = AuthenticationController.getLoggedInUserId(req)
email = EmailHelper.parseEmail(req.body.email)
return res.sendStatus 422 unless email?
UserUpdater.removeEmailAddress userId, email, (error)->
return res.sendStatus 500 if error?
res.sendStatus 200
setDefault: (req, res) ->
userId = AuthenticationController.getLoggedInUserId(req)
email = EmailHelper.parseEmail(req.body.email)
return res.sendStatus 422 unless email?
UserUpdater.setDefaultEmailAddress userId, email, (error)->
return res.sendStatus 500 if error?
res.sendStatus 200

View file

@ -25,6 +25,17 @@ module.exports = UserGetter =
@getUser userId, { email: 1 }, (error, user) ->
callback(error, user?.email)
getUserFullEmails: (userId, callback = (error, emails) ->) ->
@getUser userId, { email: 1, emails: 1 }, (error, user) ->
return callback error if error?
return callback new Error('User not Found') unless user
fullEmails = user.emails.map (emailData) ->
emailData.default = emailData.email == user.email
emailData
callback null, fullEmails
getUserByMainEmail: (email, projection, callback = (error, user) ->) ->
email = email.trim()
if arguments.length == 2

View file

@ -17,6 +17,7 @@ NotificationsController = require("./Features/Notifications/NotificationsControl
CollaboratorsRouter = require('./Features/Collaborators/CollaboratorsRouter')
UserInfoController = require('./Features/User/UserInfoController')
UserController = require("./Features/User/UserController")
UserEmailsController = require("./Features/User/UserEmailsController")
UserPagesController = require('./Features/User/UserPagesController')
DocumentController = require('./Features/Documents/DocumentController')
CompileManager = require("./Features/Compile/CompileManager")
@ -107,6 +108,18 @@ module.exports = class Router
timeInterval: 60
}),
UserController.changePassword
webRouter.get '/user/emails',
AuthenticationController.requireLogin(),
UserEmailsController.list
webRouter.post '/user/emails',
AuthenticationController.requireLogin(),
UserEmailsController.add
webRouter.delete '/user/emails',
AuthenticationController.requireLogin(),
UserEmailsController.remove
webRouter.post '/user/emails/default',
AuthenticationController.requireLogin(),
UserEmailsController.setDefault
webRouter.get '/user/sessions',
AuthenticationController.requireLogin(),

View file

@ -0,0 +1,157 @@
sinon = require('sinon')
assertCalledWith = sinon.assert.calledWith
assertNotCalled = sinon.assert.notCalled
chai = require('chai')
should = chai.should()
assert = chai.assert
modulePath = "../../../../app/js/Features/User/UserEmailsController.js"
SandboxedModule = require('sandboxed-module')
MockRequest = require "../helpers/MockRequest"
MockResponse = require "../helpers/MockResponse"
describe "UserEmailsController", ->
beforeEach ->
@req = new MockRequest()
@user =
_id: 'mock-user-id'
@UserGetter =
getUserFullEmails: sinon.stub()
@AuthenticationController =
getLoggedInUserId: sinon.stub().returns(@user._id)
@UserUpdater =
addEmailAddress: sinon.stub()
removeEmailAddress: sinon.stub()
setDefaultEmailAddress: sinon.stub()
@EmailHelper =
parseEmail: sinon.stub()
@UserEmailsController = SandboxedModule.require modulePath, requires:
"../Authentication/AuthenticationController": @AuthenticationController
"./UserGetter": @UserGetter
"./UserUpdater": @UserUpdater
"../Helpers/EmailHelper": @EmailHelper
"logger-sharelatex":
log: -> console.log(arguments)
err: ->
describe 'List', ->
beforeEach ->
it 'lists emails', (done) ->
fullEmails = [{some: 'data'}]
@UserGetter.getUserFullEmails.callsArgWith 1, null, fullEmails
@UserEmailsController.list @req,
json: (response) =>
assert.deepEqual response, fullEmails
assertCalledWith @UserGetter.getUserFullEmails, @user._id
done()
it 'handles error', (done) ->
@UserGetter.getUserFullEmails.callsArgWith 1, new Error('Oups')
@UserEmailsController.list @req,
sendStatus: (code) =>
code.should.equal 500
done()
describe 'Add', ->
beforeEach ->
@newEmail = 'new_email@baz.com'
@req.body.email = @newEmail
@EmailHelper.parseEmail.returns @newEmail
it 'adds new email', (done) ->
@UserUpdater.addEmailAddress.callsArgWith 2, null
@UserEmailsController.add @req,
sendStatus: (code) =>
code.should.equal 200
assertCalledWith @EmailHelper.parseEmail, @newEmail
assertCalledWith @UserUpdater.addEmailAddress, @user._id, @newEmail
done()
it 'handles email parse error', (done) ->
@EmailHelper.parseEmail.returns null
@UserEmailsController.add @req,
sendStatus: (code) =>
code.should.equal 422
assertNotCalled @UserUpdater.addEmailAddress
done()
it 'handles error', (done) ->
@UserUpdater.addEmailAddress.callsArgWith 2, new Error('Oups')
@UserEmailsController.add @req,
sendStatus: (code) =>
code.should.equal 500
done()
describe 'remove', ->
beforeEach ->
@email = 'email_to_remove@bar.com'
@req.body.email = @email
@EmailHelper.parseEmail.returns @email
it 'removes email', (done) ->
@UserUpdater.removeEmailAddress.callsArgWith 2, null
@UserEmailsController.remove @req,
sendStatus: (code) =>
code.should.equal 200
assertCalledWith @EmailHelper.parseEmail, @email
assertCalledWith @UserUpdater.removeEmailAddress, @user._id, @email
done()
it 'handles email parse error', (done) ->
@EmailHelper.parseEmail.returns null
@UserEmailsController.remove @req,
sendStatus: (code) =>
code.should.equal 422
assertNotCalled @UserUpdater.removeEmailAddress
done()
it 'handles error', (done) ->
@UserUpdater.removeEmailAddress.callsArgWith 2, new Error('Oups')
@UserEmailsController.remove @req,
sendStatus: (code) =>
code.should.equal 500
done()
describe 'setDefault', ->
beforeEach ->
@email = "email_to_set_default@bar.com"
@req.body.email = @email
@EmailHelper.parseEmail.returns @email
it 'sets default email', (done) ->
@UserUpdater.setDefaultEmailAddress.callsArgWith 2, null
@UserEmailsController.setDefault @req,
sendStatus: (code) =>
code.should.equal 200
assertCalledWith @EmailHelper.parseEmail, @email
assertCalledWith @UserUpdater.setDefaultEmailAddress, @user._id, @email
done()
it 'handles email parse error', (done) ->
@EmailHelper.parseEmail.returns null
@UserEmailsController.setDefault @req,
sendStatus: (code) =>
code.should.equal 422
assertNotCalled @UserUpdater.setDefaultEmailAddress
done()
it 'handles error', (done) ->
@UserUpdater.setDefaultEmailAddress.callsArgWith 2, new Error('Oups')
@UserEmailsController.setDefault @req,
sendStatus: (code) =>
code.should.equal 500
done()

View file

@ -9,7 +9,13 @@ expect = require("chai").expect
describe "UserGetter", ->
beforeEach ->
@fakeUser = {_id:"12390i"}
@fakeUser =
_id: '12390i'
email: 'email2@foo.bar'
emails: [
{ email: 'email1@foo.bar' }
{ email: 'email2@foo.bar' }
]
@findOne = sinon.stub().callsArgWith(2, null, @fakeUser)
@Mongo =
db: users: findOne: @findOne
@ -35,6 +41,24 @@ describe "UserGetter", ->
error.should.exist
done()
describe "getUserFullEmails", -
it "should get user", (done)->
@UserGetter.getUser = sinon.stub().callsArgWith(2, null, @fakeUser)
projection = email: 1, emails: 1
@UserGetter.getUserFullEmails @fakeUser._id, (error, fullEmails) =>
@UserGetter.getUser.called.should.equal true
@UserGetter.getUser.calledWith(@fakeUser._id, projection).should.equal true
done()
it "should fetch emails data", (done)->
@UserGetter.getUser = sinon.stub().callsArgWith(2, null, @fakeUser)
@UserGetter.getUserFullEmails @fakeUser._id, (error, fullEmails) =>
assert.deepEqual fullEmails, [
{ email: 'email1@foo.bar', default: false }
{ email: 'email2@foo.bar', default: true }
]
done()
describe "getUserbyMainEmail", ->
it "query user by main email", (done)->
email = 'hello@world.com'

View file

@ -5,6 +5,7 @@ class MockRequest
params: {}
query: {}
body: {}
_parsedUrl:{}
i18n:
translate:->