File size: 2,037 Bytes
9470e9f
 
 
 
2c9c0b3
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
9470e9f
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
559a977
9470e9f
 
 
 
 
 
 
 
 
 
 
2c9c0b3
 
 
 
 
9470e9f
 
 
 
2c9c0b3
9470e9f
 
559a977
 
 
 
 
9470e9f
 
 
 
 
 
 
 
 
 
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
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);
      }
    }
  )
);