diff --git a/server/auth-orcid/fetchUserDetails.js b/server/auth-orcid/fetchUserDetails.js index bb88a45dac458b2b0b500bf71a52f9d13f962159..cfce4282d7cadedce9409b9c5a21af4ff179ba17 100644 --- a/server/auth-orcid/fetchUserDetails.js +++ b/server/auth-orcid/fetchUserDetails.js @@ -1,15 +1,19 @@ const superagent = require('superagent') const _ = require('lodash') const logger = require('@pubsweet/logger') +const { Identity } = require('@pubsweet/models') -const apiRoot = 'https://api.sandbox.orcid.org/v2.1' +const apiRoot = + process.env.NODE_ENV === 'production' + ? 'https://pub.orcid.org/v3.0' + : 'https://pub.sandbox.orcid.org/v3.0' // request data from orcid API -const request = (user, endpoint) => +const request = (identity, endpoint) => superagent - .get(`${apiRoot}/${user.orcid}/${endpoint}`) + .get(`${apiRoot}/${identity.identifier}/${endpoint}`) .set('Accept', 'application/json') - .set('Authorization', `Bearer ${user.oauth.accessToken}`) + .set('Authorization', `Bearer ${identity.oauth.accessToken}`) // convert API date object into Date const toDate = date => { @@ -22,10 +26,15 @@ const toDate = date => { } module.exports = async user => { + const identity = await Identity.query().findOne({ + userId: user.id, + type: 'orcid', + }) + logger.debug('processing response from orcid api') const [personResponse, employmentsResponse] = await Promise.all([ - request(user, 'person'), - request(user, 'employments'), + request(identity, 'person'), + request(identity, 'employments'), ]) const firstName = _.get(personResponse, 'body.name.given-names.value') @@ -33,16 +42,18 @@ module.exports = async user => { const email = _.get(personResponse, 'body.emails.email[0].email') const employments = _.get(employmentsResponse, 'body.employment-summary') - const institution = employments.length - ? // sort by most recently ended - employments - .sort((a, b) => toDate(a['end-date']) - toDate(b['end-date'])) - .pop().organization.name - : null + + const institution = + employments && employments.length + ? // sort by most recently ended + employments + .sort((a, b) => toDate(a['end-date']) - toDate(b['end-date'])) + .pop().organization.name + : null logger.debug(`fetchUserDetails returning: first: ${firstName}, - last: ${lastName} + last: ${lastName}, email: ${email}, institution: ${institution}`) return { diff --git a/server/auth-orcid/orcid.js b/server/auth-orcid/orcid.js index ae2889d044f3cd457bbbce40f35b3278c2f6832a..d0ef6cb5d2e49ae10bd076a9af84ac2489b02a6c 100644 --- a/server/auth-orcid/orcid.js +++ b/server/auth-orcid/orcid.js @@ -2,7 +2,7 @@ const passport = require('passport') const OrcidStrategy = require('passport-orcid') const config = require('config') const authentication = require('pubsweet-server/src/authentication') - +const fetchUserDetails = require('./fetchUserDetails') const CALLBACK_URL = '/auth/orcid/callback' module.exports = app => { @@ -46,6 +46,13 @@ module.exports = app => { isDefault: true, }, }).saveGraph() + + // Do another request to the ORCID API for aff/name + const userDetails = await fetchUserDetails(user) + + user.defaultIdentity.name = `${userDetails.firstName} ${userDetails.lastName}` + user.defaultIdentity.aff = userDetails.institution + user.saveGraph() } } catch (err) { done(err) diff --git a/server/model-user/src/graphql.js b/server/model-user/src/graphql.js index d9d312acb879ecd39fcc2bddbb8c3383e07da89d..ae71cd4aa39a3e09c548967a13de9a9239d6d357 100644 --- a/server/model-user/src/graphql.js +++ b/server/model-user/src/graphql.js @@ -203,14 +203,8 @@ const typeDefs = ` online: Boolean } - type Name { - surname: String - givenNames: String - title: String - } - interface Identity { - name: Name + name: String aff: String # JATS <aff> email: String # JATS <aff> type: String @@ -220,14 +214,14 @@ const typeDefs = ` # local identity (not from ORCID, etc.) type LocalIdentity implements Identity { - name: Name + name: String email: String aff: String type: String } type ExternalIdentity implements Identity { - name: Name + name: String identifier: String email: String aff: String @@ -263,6 +257,16 @@ const typeDefs = ` username: String! password: String! } + + # Common types + scalar DateTime + + interface Object { + id: ID! + created: DateTime! + updated: DateTime + } + ` module.exports = { resolvers, typeDefs } diff --git a/server/model-user/src/migrations/1592915682-change-identities-constraint.sql b/server/model-user/src/migrations/1592915682-change-identities-constraint.sql new file mode 100644 index 0000000000000000000000000000000000000000..29ad1b5ed0cb3a24800788b949766efec0213b77 --- /dev/null +++ b/server/model-user/src/migrations/1592915682-change-identities-constraint.sql @@ -0,0 +1,6 @@ +alter table identities +drop constraint identities_user_id_fkey, +add constraint sidentities_user_id_fkey + foreign key (user_id) + references users(id) + on delete cascade; \ No newline at end of file