|
|
|
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 & { _json: any }>(provider: authProviders) {
|
|
|
|
return async (
|
|
|
|
_accessToken: string,
|
|
|
|
_refreshToken: string,
|
|
|
|
profile: ProfileT,
|
|
|
|
done: doneCallback
|
|
|
|
) => {
|
|
|
|
console.log(profile)
|
|
|
|
|
|
|
|
|
|
|
|
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.replace('_normal', ''),
|
|
|
|
}).save((err: string) => {
|
|
|
|
if (err) throw (err);
|
|
|
|
});
|
|
|
|
|
|
|
|
return done(null, newUser);
|
|
|
|
|
|
|
|
} catch (e) {
|
|
|
|
return done(e);
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
export default genericStrategy
|