3216 request a new access token for the gmail api when it expires (#3224)

* refresh access token

* refresh and save access token

* update module

* refreshing access token before fetching the emails

* remove log
This commit is contained in:
bosiraphael
2024-01-03 18:00:31 +01:00
committed by GitHub
parent 90f89e31a6
commit 4ebaacc306
3 changed files with 87 additions and 1 deletions

View File

@ -0,0 +1,75 @@
import { Injectable } from '@nestjs/common';
import axios from 'axios';
import { TypeORMService } from 'src/database/typeorm/typeorm.service';
import { EnvironmentService } from 'src/integrations/environment/environment.service';
import { DataSourceService } from 'src/metadata/data-source/data-source.service';
@Injectable()
export class RefreshAccessTokenService {
constructor(
private readonly environmentService: EnvironmentService,
private readonly dataSourceService: DataSourceService,
private readonly typeORMService: TypeORMService,
) {}
async refreshAndSaveAccessToken(
workspaceId: string,
workspaceMemberId: string,
): Promise<void> {
const dataSourceMetadata =
await this.dataSourceService.getLastDataSourceMetadataFromWorkspaceIdOrFail(
workspaceId,
);
const workspaceDataSource = await this.typeORMService.connectToDataSource(
dataSourceMetadata,
);
if (!workspaceDataSource) {
throw new Error('No workspace data source found');
}
const connectedAccounts = await workspaceDataSource?.query(
`SELECT * FROM ${dataSourceMetadata.schema}."connectedAccount" WHERE "provider" = 'gmail' AND "accountOwnerId" = $1`,
[workspaceMemberId],
);
if (!connectedAccounts || connectedAccounts.length === 0) {
throw new Error('No connected account found');
}
const refreshToken = connectedAccounts[0]?.refreshToken;
if (!refreshToken) {
throw new Error('No refresh token found');
}
const accessToken = await this.refreshAccessToken(refreshToken);
await workspaceDataSource?.query(
`UPDATE ${dataSourceMetadata.schema}."connectedAccount" SET "accessToken" = $1 WHERE "id" = $2`,
[accessToken, connectedAccounts[0].id],
);
}
async refreshAccessToken(refreshToken: string): Promise<string> {
const response = await axios.post(
'https://oauth2.googleapis.com/token',
{
client_id: this.environmentService.getAuthGoogleClientId(),
client_secret: this.environmentService.getAuthGoogleClientSecret(),
refresh_token: refreshToken,
grant_type: 'refresh_token',
},
{
headers: {
'Content-Type': 'application/json',
},
},
);
return response.data.access_token;
}
}