60 lines
1.5 KiB
JavaScript
60 lines
1.5 KiB
JavaScript
![]() |
import { observeMethod, observeQuery } from '../utils/rx';
|
||
|
|
||
|
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);
|
||
|
console.log('provider', provider);
|
||
|
console.log('id', profile.id);
|
||
|
findIdent({
|
||
|
provider: provider,
|
||
|
externalId: profile.id
|
||
|
})
|
||
|
.flatMap(identity => {
|
||
|
const modified = new Date();
|
||
|
if (!identity || identity.externalId !== profile.id) {
|
||
|
return observeQuery(UserIdentity, 'create', {
|
||
|
provider,
|
||
|
externalId: profile.id,
|
||
|
authScheme,
|
||
|
profile,
|
||
|
credentials,
|
||
|
userId,
|
||
|
created: modified,
|
||
|
modified
|
||
|
});
|
||
|
}
|
||
|
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);
|
||
|
}
|