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

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