82 lines
2.2 KiB
JavaScript
82 lines
2.2 KiB
JavaScript
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);
|
|
}
|