import { PassportStrategy } from '@nestjs/passport'; import { Injectable } from '@nestjs/common'; import { Strategy, VerifyCallback } from 'passport-google-oauth20'; import { ConfigService } from '@nestjs/config'; import { PersonaService } from './persona.service'; @Injectable() export class GoogleStrategy extends PassportStrategy(Strategy, 'google') { constructor( private readonly personaService: PersonaService, private readonly config: ConfigService, ) { const clientID = config.get('GOOGLE_CLIENT_ID'); const clientSecret = config.get('GOOGLE_CLIENT_SECRET'); const callbackURL = config.get('GOOGLE_CALLBACK_URL'); if (!clientID || !clientSecret || !callbackURL) { throw new Error( 'Las variables de entorno de Google OAuth no están definidas', ); } super({ clientID, clientSecret, callbackURL, scope: ['email', 'profile'], passReqToCallback: true, }); } authorizationParams() { return { prompt: 'select_account', }; } async validate( req: any, accessToken: string, refreshToken: string, profile: any, done: VerifyCallback, ): Promise { try { const email = profile.emails?.[0]?.value || ''; const nombre = profile.name?.givenName || ''; const apellido = profile.name?.familyName || ''; const user = await this.personaService.validateOrCreateGoogleUser({ email, nombre, apellido, }); done(null, user); } catch (error) { done(error, false); } } }