import passport from 'passport'; import { Strategy as GitHubStrategy } from 'passport-github2'; import { db } from './database'; passport.serializeUser((user: any, done) => { done(null, user.id); }); passport.deserializeUser((id: number, done) => { try { const stmt = db.prepare('SELECT * FROM users WHERE id = ?'); const user = stmt.get(id); done(null, user); } catch (error) { done(error, null); } }); passport.use(new GitHubStrategy({ clientID: process.env.GITHUB_CLIENT_ID!, clientSecret: process.env.GITHUB_CLIENT_SECRET!, callbackURL: '/auth/github/callback' }, async (accessToken, refreshToken, profile, done) => { try { let user; const existingUser = db.prepare('SELECT * FROM users WHERE github_id = ?').get(profile.id); if (existingUser) { user = existingUser; } else { const stmt = db.prepare(` INSERT INTO users (github_id, username, display_name, avatar_url, email) VALUES (?, ?, ?, ?, ?) `); const result = stmt.run( profile.id, profile.username, profile.displayName || profile.username, profile._json.avatar_url, profile._json.email ); user = db.prepare('SELECT * FROM users WHERE id = ?').get(result.lastInsertRowid); } return done(null, user); } catch (error) { return done(error, undefined); } })); export { passport };