You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
49 lines
1.4 KiB
49 lines
1.4 KiB
4 years ago
|
import { Profile } from 'passport'
|
||
|
import UserModel, { User } from '../models/user'
|
||
|
import { authProviders } from '../types'
|
||
|
|
||
|
type doneCallback = (error: string | null, user?: Promise<User> | User | boolean) => void
|
||
|
|
||
|
function genericStrategy<ProfileT extends Profile>(provider: authProviders) {
|
||
|
return async (
|
||
|
_accessToken: string,
|
||
|
_refreshToken: string,
|
||
|
profile: ProfileT,
|
||
|
done: doneCallback
|
||
|
) => {
|
||
|
if (!profile.emails?.[0].value) {
|
||
|
console.error(`${provider} Email permission not provided`)
|
||
|
return done(null, false);
|
||
|
}
|
||
|
|
||
|
try {
|
||
|
const user = await UserModel.findOne({ provider, providerId: profile.id }).exec();
|
||
|
|
||
|
console.info(`${provider} user found. Logging in.`);
|
||
|
|
||
|
if (user) {
|
||
|
return done(null, user);
|
||
|
}
|
||
|
|
||
|
console.info(`${provider} user not found. Creating.`);
|
||
|
|
||
|
const newUser = new UserModel({
|
||
|
providerId: profile.id,
|
||
|
name: profile.displayName,
|
||
|
provider,
|
||
|
email: profile.emails?.[0].value,
|
||
|
photo: profile.photos?.[0].value,
|
||
|
}).save((err: string) => {
|
||
|
if (err) throw (err);
|
||
|
});
|
||
|
|
||
|
return done(null, newUser);
|
||
|
|
||
|
} catch (e) {
|
||
|
return done(e);
|
||
|
}
|
||
|
}
|
||
|
}
|
||
|
|
||
|
export default genericStrategy
|