Handle Network errors in messaging sync (#5795)

In this PR, I'm doing 2 things:
- refresh connectedAccount token on message-list-fetch. It's currently
only refresh while doing the messages-import. However messages-import
stage are only triggered if new messages are detected (which could take
days or week depending of the messageChannel activity). We should also
refresh it while trying to fetch the list
- handle Unhandled Gmail error code 500 with reason "backendError".
These can occur on gmail side. In this case, we just retry later.
This commit is contained in:
Charles Bochet
2024-06-09 22:46:11 +02:00
committed by GitHub
parent 01c0378b7a
commit 3c5a4ba692
2 changed files with 41 additions and 1 deletions

View File

@ -94,6 +94,24 @@ export class MessagingErrorHandlingService {
workspaceId,
);
break;
case 500:
if (reason === 'backendError') {
await this.handleRateLimitExceeded(
error,
syncStep,
messageChannel,
workspaceId,
);
} else {
await this.messagingChannelSyncStatusService.markAsFailedUnknownAndFlushMessagesToImport(
messageChannel.id,
workspaceId,
);
throw new Error(
`Unhandled Gmail error code ${code} with reason ${reason}`,
);
}
break;
case 'ECONNRESET':
case 'ENOTFOUND':
case 'ECONNABORTED':

View File

@ -23,6 +23,8 @@ import { MessagingChannelSyncStatusService } from 'src/modules/messaging/common/
import { MessagingGmailClientProvider } from 'src/modules/messaging/message-import-manager/drivers/gmail/providers/messaging-gmail-client.provider';
import { MESSAGING_GMAIL_USERS_MESSAGES_LIST_MAX_RESULT } from 'src/modules/messaging/message-import-manager/drivers/gmail/constants/messaging-gmail-users-messages-list-max-result.constant';
import { MESSAGING_GMAIL_EXCLUDED_CATEGORIES } from 'src/modules/messaging/message-import-manager/drivers/gmail/constants/messaging-gmail-excluded-categories';
import { GoogleAPIRefreshAccessTokenService } from 'src/modules/connected-account/services/google-api-refresh-access-token/google-api-refresh-access-token.service';
import { ConnectedAccountRepository } from 'src/modules/connected-account/repositories/connected-account.repository';
@Injectable()
export class MessagingGmailFullMessageListFetchService {
@ -40,8 +42,11 @@ export class MessagingGmailFullMessageListFetchService {
MessageChannelMessageAssociationWorkspaceEntity,
)
private readonly messageChannelMessageAssociationRepository: MessageChannelMessageAssociationRepository,
@InjectObjectMetadataRepository(ConnectedAccountWorkspaceEntity)
private readonly connectedAccountRepository: ConnectedAccountRepository,
private readonly messagingChannelSyncStatusService: MessagingChannelSyncStatusService,
private readonly gmailErrorHandlingService: MessagingErrorHandlingService,
private readonly googleAPIsRefreshAccessTokenService: GoogleAPIRefreshAccessTokenService,
) {}
public async processMessageListFetch(
@ -54,9 +59,26 @@ export class MessagingGmailFullMessageListFetchService {
workspaceId,
);
await this.googleAPIsRefreshAccessTokenService.refreshAndSaveAccessToken(
workspaceId,
connectedAccount.id,
);
const refreshedConnectedAccount =
await this.connectedAccountRepository.getById(
connectedAccount.id,
workspaceId,
);
if (!refreshedConnectedAccount) {
throw new Error(
`Connected account ${connectedAccount.id} not found in workspace ${workspaceId}`,
);
}
const gmailClient: gmail_v1.Gmail =
await this.gmailClientProvider.getGmailClient(
connectedAccount.refreshToken,
refreshedConnectedAccount.refreshToken,
);
const { error: gmailError } =