import { Injectable } from '@nestjs/common'; import axios from 'axios'; import { EnvironmentService } from 'src/integrations/environment/environment.service'; import { ConnectedAccountService } from 'src/workspace/calendar-and-messaging/repositories/connected-account/connected-account.service'; @Injectable() export class GoogleAPIsRefreshAccessTokenService { constructor( private readonly environmentService: EnvironmentService, private readonly connectedAccountService: ConnectedAccountService, ) {} async refreshAndSaveAccessToken( workspaceId: string, connectedAccountId: string, ): Promise { const connectedAccount = await this.connectedAccountService.getById( connectedAccountId, workspaceId, ); if (!connectedAccount) { throw new Error( `No connected account found for ${connectedAccountId} in workspace ${workspaceId}`, ); } const refreshToken = connectedAccount.refreshToken; if (!refreshToken) { throw new Error( `No refresh token found for connected account ${connectedAccountId} in workspace ${workspaceId}`, ); } const accessToken = await this.refreshAccessToken(refreshToken); await this.connectedAccountService.updateAccessToken( accessToken, connectedAccountId, workspaceId, ); } async refreshAccessToken(refreshToken: string): Promise { const response = await axios.post( 'https://oauth2.googleapis.com/token', { client_id: this.environmentService.get('AUTH_GOOGLE_CLIENT_ID'), client_secret: this.environmentService.get('AUTH_GOOGLE_CLIENT_SECRET'), refresh_token: refreshToken, grant_type: 'refresh_token', }, { headers: { 'Content-Type': 'application/json', }, }, ); return response.data.access_token; } }