| 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); |
| } |
| } |
| ) |
| ); |