90 lines
2.3 KiB
JavaScript
90 lines
2.3 KiB
JavaScript
|
import { Observable } from 'rx';
|
||
|
import debug from 'debug';
|
||
|
|
||
|
import { observeMethod, observeQuery } from '../../server/utils/rx';
|
||
|
import {
|
||
|
createUserUpdatesFromProfile,
|
||
|
getSocialProvider
|
||
|
} from '../../server/utils/auth';
|
||
|
|
||
|
const log = debug('fcc:models:UserCredential');
|
||
|
module.exports = function(UserCredential) {
|
||
|
UserCredential.link = function(
|
||
|
userId,
|
||
|
_provider,
|
||
|
authScheme,
|
||
|
profile,
|
||
|
credentials,
|
||
|
options = {},
|
||
|
cb
|
||
|
) {
|
||
|
if (typeof options === 'function' && !cb) {
|
||
|
cb = options;
|
||
|
options = {};
|
||
|
}
|
||
|
const User = UserCredential.app.models.User;
|
||
|
const findCred = observeMethod(UserCredential, 'findOne');
|
||
|
const createCred = observeMethod(UserCredential, 'create');
|
||
|
|
||
|
const provider = getSocialProvider(_provider);
|
||
|
const query = {
|
||
|
where: {
|
||
|
provider: provider,
|
||
|
externalId: profile.id
|
||
|
}
|
||
|
};
|
||
|
|
||
|
// find createCred if they exist
|
||
|
// if not create it
|
||
|
// if yes, update credentials
|
||
|
// also if github
|
||
|
// update profile
|
||
|
// update username
|
||
|
// update picture
|
||
|
log('link query', query);
|
||
|
return findCred(query)
|
||
|
.flatMap(_credentials => {
|
||
|
const modified = new Date();
|
||
|
const updateUser = User.update$(
|
||
|
{ id: userId },
|
||
|
createUserUpdatesFromProfile(provider, profile)
|
||
|
);
|
||
|
let updateCredentials;
|
||
|
if (!_credentials) {
|
||
|
updateCredentials = createCred({
|
||
|
provider,
|
||
|
externalId: profile.id,
|
||
|
authScheme,
|
||
|
// we no longer want to keep the profile
|
||
|
// this is information we do not need or use
|
||
|
profile: null,
|
||
|
credentials,
|
||
|
userId,
|
||
|
created: modified,
|
||
|
modified
|
||
|
});
|
||
|
} else {
|
||
|
_credentials.credentials = credentials;
|
||
|
updateCredentials = observeQuery(
|
||
|
_credentials,
|
||
|
'updateAttributes',
|
||
|
{
|
||
|
profile: null,
|
||
|
credentials,
|
||
|
modified
|
||
|
}
|
||
|
);
|
||
|
}
|
||
|
return Observable.combineLatest(
|
||
|
updateUser,
|
||
|
updateCredentials,
|
||
|
(_, credentials) => credentials
|
||
|
);
|
||
|
})
|
||
|
.subscribe(
|
||
|
credentials => cb(null, credentials),
|
||
|
cb
|
||
|
);
|
||
|
};
|
||
|
};
|