Improve messaging behavior (#13746)

This PR contains multiple small enhancements
This commit is contained in:
Charles Bochet
2025-08-07 20:21:18 +02:00
committed by GitHub
parent 6c2e11f830
commit 4baabd80ef
12 changed files with 236 additions and 147 deletions
@@ -4,6 +4,7 @@ import axios from 'axios';
import { z } from 'zod';
import { TwentyConfigService } from 'src/engine/core-modules/twenty-config/twenty-config.service';
import { ConnectedAccountTokens } from 'src/modules/connected-account/refresh-tokens-manager/services/connected-account-refresh-tokens.service';
export type GoogleTokens = {
accessToken: string;
@@ -20,7 +21,9 @@ interface GoogleRefreshTokenResponse {
export class GoogleAPIRefreshAccessTokenService {
constructor(private readonly twentyConfigService: TwentyConfigService) {}
async refreshAccessToken(refreshToken: string): Promise<GoogleTokens> {
async refreshAccessToken(
refreshToken: string,
): Promise<ConnectedAccountTokens> {
const response = await axios.post<GoogleRefreshTokenResponse>(
'https://oauth2.googleapis.com/token',
{
@@ -42,6 +45,7 @@ export class GoogleAPIRefreshAccessTokenService {
return {
accessToken: response.data.access_token,
refreshToken,
};
}
}
@@ -4,6 +4,7 @@ import axios from 'axios';
import { z } from 'zod';
import { TwentyConfigService } from 'src/engine/core-modules/twenty-config/twenty-config.service';
import { ConnectedAccountTokens } from 'src/modules/connected-account/refresh-tokens-manager/services/connected-account-refresh-tokens.service';
export type MicrosoftTokens = {
accessToken: string;
@@ -22,7 +23,7 @@ interface MicrosoftRefreshTokenResponse {
export class MicrosoftAPIRefreshAccessTokenService {
constructor(private readonly twentyConfigService: TwentyConfigService) {}
async refreshTokens(refreshToken: string): Promise<MicrosoftTokens> {
async refreshTokens(refreshToken: string): Promise<ConnectedAccountTokens> {
const response = await axios.post<MicrosoftRefreshTokenResponse>(
'https://login.microsoftonline.com/common/oauth2/v2.0/token',
new URLSearchParams({
@@ -4,14 +4,8 @@ import { ConnectedAccountProvider } from 'twenty-shared/types';
import { assertUnreachable } from 'twenty-shared/utils';
import { TwentyORMManager } from 'src/engine/twenty-orm/twenty-orm.manager';
import {
GoogleAPIRefreshAccessTokenService,
GoogleTokens,
} from 'src/modules/connected-account/refresh-tokens-manager/drivers/google/services/google-api-refresh-access-token.service';
import {
MicrosoftAPIRefreshAccessTokenService,
MicrosoftTokens,
} from 'src/modules/connected-account/refresh-tokens-manager/drivers/microsoft/services/microsoft-api-refresh-tokens.service';
import { GoogleAPIRefreshAccessTokenService } from 'src/modules/connected-account/refresh-tokens-manager/drivers/google/services/google-api-refresh-access-token.service';
import { MicrosoftAPIRefreshAccessTokenService } from 'src/modules/connected-account/refresh-tokens-manager/drivers/microsoft/services/microsoft-api-refresh-tokens.service';
import {
ConnectedAccountRefreshAccessTokenException,
ConnectedAccountRefreshAccessTokenExceptionCode,
@@ -19,7 +13,10 @@ import {
import { ConnectedAccountWorkspaceEntity } from 'src/modules/connected-account/standard-objects/connected-account.workspace-entity';
import { isAxiosTemporaryError } from 'src/modules/messaging/message-import-manager/drivers/gmail/utils/is-axios-gaxios-error.util';
export type ConnectedAccountTokens = GoogleTokens | MicrosoftTokens;
export type ConnectedAccountTokens = {
accessToken: string;
refreshToken: string;
};
@Injectable()
export class ConnectedAccountRefreshTokensService {
@@ -36,7 +33,7 @@ export class ConnectedAccountRefreshTokensService {
async refreshAndSaveTokens(
connectedAccount: ConnectedAccountWorkspaceEntity,
workspaceId: string,
): Promise<string> {
): Promise<ConnectedAccountTokens> {
const refreshToken = connectedAccount.refreshToken;
if (!refreshToken) {
@@ -52,23 +49,17 @@ export class ConnectedAccountRefreshTokensService {
workspaceId,
);
try {
const connectedAccountRepository =
await this.twentyORMManager.getRepository<ConnectedAccountWorkspaceEntity>(
'connectedAccount',
);
await connectedAccountRepository.update(
{ id: connectedAccount.id },
connectedAccountTokens,
const connectedAccountRepository =
await this.twentyORMManager.getRepository<ConnectedAccountWorkspaceEntity>(
'connectedAccount',
);
} catch (error) {
throw new Error(
`Error saving the new tokens for connected account ${connectedAccount.id} in workspace ${workspaceId}: ${error.message} `,
);
}
return connectedAccountTokens.accessToken;
await connectedAccountRepository.update(
{ id: connectedAccount.id },
connectedAccountTokens,
);
return connectedAccountTokens;
}
async refreshTokens(