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); // leave room for suffix 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); // Save only ID to session }); passport.deserializeUser(async (id, done) => { try { const user = await User.findById(id); done(null, user); // Attach full user object to req.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 // Important for Cloudflare/HuggingFace proxies }, async (accessToken, refreshToken, profile, done) => { try { // Check if user exists const existingUser = await User.findOne({ googleId: profile.id }); if (existingUser) { return done(null, existingUser); } const email = profile.emails[0].value; // 👇 AUTO-GENERATE USERNAME const username = await generateUniqueUsername(email); // Create new user 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 // Default Karma } }).save(); done(null, newUser); } catch (err) { console.error("Auth Error:", err); done(err, null); } } ) );