mirror of
https://github.com/overleaf/overleaf.git
synced 2025-04-23 06:18:07 +00:00
decorate emails list with affiliation data
This commit is contained in:
parent
c81f9c24ed
commit
c6de896bb5
3 changed files with 71 additions and 5 deletions
services/web
app/coffee/Features/User
test
|
@ -3,6 +3,8 @@ metrics = require('metrics-sharelatex')
|
|||
logger = require('logger-sharelatex')
|
||||
db = mongojs.db
|
||||
ObjectId = mongojs.ObjectId
|
||||
settings = require "settings-sharelatex"
|
||||
request = require "request"
|
||||
|
||||
module.exports = UserGetter =
|
||||
getUser: (query, projection, callback = (error, user) ->) ->
|
||||
|
@ -30,11 +32,9 @@ module.exports = UserGetter =
|
|||
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
|
||||
getAffiliations userId, (error, affiliationsData) ->
|
||||
return callback error if error?
|
||||
callback null, decorateFullEmails(user.email, user.emails, affiliationsData)
|
||||
|
||||
getUserByMainEmail: (email, projection, callback = (error, user) ->) ->
|
||||
email = email.trim()
|
||||
|
@ -81,6 +81,35 @@ module.exports = UserGetter =
|
|||
return callback(message: 'alread_exists') if user?
|
||||
callback(error)
|
||||
|
||||
decorateFullEmails = (defaultEmail, emailsData, affiliationsData) ->
|
||||
emailsData.map (emailData) ->
|
||||
emailData.default = emailData.email == defaultEmail
|
||||
|
||||
affiliation = affiliationsData.find (aff) -> aff.email == emailData.email
|
||||
if affiliation?
|
||||
{ institution, inferred, role, department } = affiliation
|
||||
emailData.affiliation = { institution, inferred, role, department }
|
||||
else
|
||||
emailsData.affiliation = null
|
||||
|
||||
emailData
|
||||
|
||||
getAffiliations = (userId, callback = (error) ->) ->
|
||||
return callback(null, []) unless settings?.apis?.v1?.url # service is not configured
|
||||
request {
|
||||
method: 'GET'
|
||||
url: "#{settings.apis.v1.url}/api/v2/users/#{userId.toString()}/affiliations"
|
||||
auth: { user: settings.apis.v1.user, pass: settings.apis.v1.pass }
|
||||
json: true,
|
||||
timeout: 20 * 1000
|
||||
}, (error, response, body) ->
|
||||
return callback(error) if error?
|
||||
unless 200 <= response.statusCode < 300
|
||||
errorMessage = "Couldn't get affiliations: #{response.statusCode}"
|
||||
return callback(new Error(errorMessage))
|
||||
|
||||
callback(null, body)
|
||||
|
||||
[
|
||||
'getUser',
|
||||
'getUserEmail',
|
||||
|
|
|
@ -42,6 +42,9 @@ module.exports = MockV1Api =
|
|||
@exportParams = Object.assign({}, req.body)
|
||||
res.json exportId: @exportId
|
||||
|
||||
app.get "/api/v2/users/:userId/affiliations", (req, res, next) =>
|
||||
res.json []
|
||||
|
||||
app.post "/api/v2/users/:userId/affiliations", (req, res, next) =>
|
||||
res.sendStatus 201
|
||||
|
||||
|
|
|
@ -20,11 +20,15 @@ describe "UserGetter", ->
|
|||
@Mongo =
|
||||
db: users: findOne: @findOne
|
||||
ObjectId: (id) -> return id
|
||||
settings = apis: { v1: { url: 'v1.url', user: '', pass: '' } }
|
||||
@request = sinon.stub()
|
||||
|
||||
@UserGetter = SandboxedModule.require modulePath, requires:
|
||||
"logger-sharelatex": log:->
|
||||
"../../infrastructure/mongojs": @Mongo
|
||||
"metrics-sharelatex": timeAsyncMethod: sinon.stub()
|
||||
'settings-sharelatex': settings
|
||||
'request': @request
|
||||
|
||||
describe "getUser", ->
|
||||
it "should get user", (done)->
|
||||
|
@ -42,6 +46,9 @@ describe "UserGetter", ->
|
|||
done()
|
||||
|
||||
describe "getUserFullEmails", -
|
||||
beforeEach ->
|
||||
@request.callsArgWith(1, null, { statusCode: 200 }, [])
|
||||
|
||||
it "should get user", (done)->
|
||||
@UserGetter.getUser = sinon.stub().callsArgWith(2, null, @fakeUser)
|
||||
projection = email: 1, emails: 1
|
||||
|
@ -59,6 +66,33 @@ describe "UserGetter", ->
|
|||
]
|
||||
done()
|
||||
|
||||
it "should merge affiliation data", (done)->
|
||||
@UserGetter.getUser = sinon.stub().callsArgWith(2, null, @fakeUser)
|
||||
affiliationsData = [
|
||||
{
|
||||
email: 'email1@foo.bar'
|
||||
role: 'Prof'
|
||||
department: 'Maths'
|
||||
inferred: false
|
||||
institution: { name: 'University Name', isUniversity: true }
|
||||
}
|
||||
]
|
||||
@request.callsArgWith(1, null, { statusCode: 200 }, affiliationsData)
|
||||
@UserGetter.getUserFullEmails @fakeUser._id, (error, fullEmails) =>
|
||||
assert.deepEqual fullEmails, [
|
||||
{
|
||||
email: 'email1@foo.bar'
|
||||
default: false
|
||||
affiliation:
|
||||
institution: affiliationsData[0].institution
|
||||
inferred: affiliationsData[0].inferred
|
||||
department: affiliationsData[0].department
|
||||
role: affiliationsData[0].role
|
||||
}
|
||||
{ email: 'email2@foo.bar', default: true }
|
||||
]
|
||||
done()
|
||||
|
||||
describe "getUserbyMainEmail", ->
|
||||
it "query user by main email", (done)->
|
||||
email = 'hello@world.com'
|
||||
|
|
Loading…
Add table
Reference in a new issue