|
|
import passport from 'passport'; |
|
|
import { Strategy as GoogleStrategy } from 'passport-google-oauth20'; |
|
|
import User from '../models/User.js'; |
|
|
|
|
|
async function generateUniqueUsername(email) { |
|
|
const base = email |
|
|
.split('@')[0] |
|
|
.toLowerCase() |
|
|
.replace(/[^a-z0-9]/g, '_') |
|
|
.slice(0, 15); |
|
|
|
|
|
let username = base; |
|
|
let suffix = 0; |
|
|
|
|
|
while (await User.exists({ username })) { |
|
|
suffix += 1; |
|
|
username = `${base}_${suffix}`; |
|
|
} |
|
|
|
|
|
return username; |
|
|
} |
|
|
|
|
|
passport.serializeUser((user, done) => { |
|
|
done(null, user.id); |
|
|
}); |
|
|
|
|
|
passport.deserializeUser(async (id, done) => { |
|
|
try { |
|
|
const user = await User.findById(id); |
|
|
done(null, user); |
|
|
} catch (err) { |
|
|
done(err, null); |
|
|
} |
|
|
}); |
|
|
|
|
|
passport.use( |
|
|
new GoogleStrategy( |
|
|
{ |
|
|
clientID: process.env.GOOGLE_CLIENT_ID, |
|
|
clientSecret: process.env.GOOGLE_CLIENT_SECRET, |
|
|
callbackURL: 'https://cragy.fun/api/auth/google/callback', |
|
|
proxy: true |
|
|
}, |
|
|
async (accessToken, refreshToken, profile, done) => { |
|
|
try { |
|
|
|
|
|
const existingUser = await User.findOne({ googleId: profile.id }); |
|
|
|
|
|
if (existingUser) { |
|
|
return done(null, existingUser); |
|
|
} |
|
|
|
|
|
const email = profile.emails[0].value; |
|
|
|
|
|
|
|
|
const username = await generateUniqueUsername(email); |
|
|
|
|
|
|
|
|
const newUser = await new User({ |
|
|
googleId: profile.id, |
|
|
email: profile.emails[0].value, |
|
|
username, |
|
|
displayName: profile.displayName, |
|
|
firstName: profile.name.givenName, |
|
|
lastName: profile.name.familyName, |
|
|
profile: { |
|
|
isComplete: false, |
|
|
karma: 60 |
|
|
} |
|
|
}).save(); |
|
|
|
|
|
done(null, newUser); |
|
|
} catch (err) { |
|
|
console.error("Auth Error:", err); |
|
|
done(err, null); |
|
|
} |
|
|
} |
|
|
) |
|
|
); |