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:
@ -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':
|
||||
|
||||
@ -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 } =
|
||||
|
||||
Reference in New Issue
Block a user