Permalink
Cannot retrieve contributors at this time
Fetching contributors…

import { Observable } from 'rx'; | |
import debugFactory from 'debug'; | |
import dedent from 'dedent'; | |
import { observeMethod, observeQuery } from '../utils/rx'; | |
import { getSocialProvider } from '../utils/auth'; | |
const debug = debugFactory('fcc:userIdent'); | |
export default function({ models }) { | |
const { User, UserIdentity, UserCredential } = models; | |
const findUserById = observeMethod(User, 'findById'); | |
const findIdent = observeMethod(UserIdentity, 'findOne'); | |
UserIdentity.link = function( | |
userId, | |
provider, | |
authScheme, | |
profile, | |
credentials, | |
options = {}, | |
cb | |
) { | |
if (typeof options === 'function' && !cb) { | |
cb = options; | |
options = {}; | |
} | |
const user$ = findUserById(userId); | |
const query = { | |
where: { | |
provider: getSocialProvider(provider), | |
externalId: profile.id | |
} | |
}; | |
debug('link identity query', query); | |
findIdent(query) | |
.flatMap(identity => { | |
const modified = new Date(); | |
if (!identity) { | |
return observeQuery(UserIdentity, 'create', { | |
provider: getSocialProvider(provider), | |
externalId: profile.id, | |
authScheme, | |
profile, | |
credentials, | |
userId, | |
created: modified, | |
modified | |
}); | |
} | |
if (identity.userId.toString() !== userId.toString()) { | |
return Observable.throw( | |
new Error( | |
dedent` | |
Your GitHub is already associated with another account. | |
You may have accidentally created a duplicate account. | |
No worries, though. We can fix this real quick. | |
Please email us with your GitHub username: team@freecodecamp.com. | |
`.split('/n').join(' ') | |
) | |
); | |
} | |
identity.credentials = credentials; | |
return observeQuery(identity, 'updateAttributes', { | |
profile, | |
credentials, | |
modified | |
}); | |
}) | |
.withLatestFrom(user$, (identity, user) => ({ identity, user })) | |
.subscribe( | |
({ identity, user }) => { | |
cb(null, user, identity); | |
}, | |
cb | |
); | |
}; | |
UserCredential.link = UserIdentity.link.bind(UserIdentity); | |
} |