From 3680647c9af2508f8d6648b8bf1cf7ca069fa74e Mon Sep 17 00:00:00 2001 From: bosiraphael <71827178+bosiraphael@users.noreply.github.com> Date: Fri, 24 May 2024 18:33:44 +0200 Subject: [PATCH] Fix sync token is no longer valid in calendar sync (#5563) Fix sync token is no longer valid in calendar sync. https://developers.google.com/apps-script/add-ons/calendar/conferencing/sync-calendar-changes#implement_a_sync_trigger_function _Caution: Occasionally sync tokens are invalidated by the server, resulting in a Sync token is no longer valid error. When this happens, your code should conduct a full sync and replace any stored sync tokens you have._ --- .../calendar-channel.repository.ts | 4 +- .../google-calendar-sync.service.ts | 41 +++++++++++++++---- 2 files changed, 35 insertions(+), 10 deletions(-) diff --git a/packages/twenty-server/src/modules/calendar/repositories/calendar-channel.repository.ts b/packages/twenty-server/src/modules/calendar/repositories/calendar-channel.repository.ts index faff7afe4..d0cde3ca8 100644 --- a/packages/twenty-server/src/modules/calendar/repositories/calendar-channel.repository.ts +++ b/packages/twenty-server/src/modules/calendar/repositories/calendar-channel.repository.ts @@ -117,7 +117,7 @@ export class CalendarChannelRepository { } public async updateSyncCursor( - syncCursor: string, + syncCursor: string | null, calendarChannelId: string, workspaceId: string, transactionManager?: EntityManager, @@ -127,7 +127,7 @@ export class CalendarChannelRepository { await this.workspaceDataSourceService.executeRawQuery( `UPDATE ${dataSourceSchema}."calendarChannel" SET "syncCursor" = $1 WHERE "id" = $2`, - [syncCursor, calendarChannelId], + [syncCursor || '', calendarChannelId], workspaceId, transactionManager, ); diff --git a/packages/twenty-server/src/modules/calendar/services/google-calendar-sync/google-calendar-sync.service.ts b/packages/twenty-server/src/modules/calendar/services/google-calendar-sync/google-calendar-sync.service.ts index 6b2fc66c8..762bf0609 100644 --- a/packages/twenty-server/src/modules/calendar/services/google-calendar-sync/google-calendar-sync.service.ts +++ b/packages/twenty-server/src/modules/calendar/services/google-calendar-sync/google-calendar-sync.service.ts @@ -3,6 +3,7 @@ import { InjectRepository } from '@nestjs/typeorm'; import { Repository } from 'typeorm'; import { calendar_v3 as calendarV3 } from 'googleapis'; +import { GaxiosError } from 'gaxios'; import { ConnectedAccountRepository } from 'src/modules/connected-account/repositories/connected-account.repository'; import { BlocklistRepository } from 'src/modules/connected-account/repositories/blocklist.repository'; @@ -320,14 +321,38 @@ export class GoogleCalendarSyncService { let hasMoreEvents = true; while (hasMoreEvents) { - const googleCalendarEvents = await googleCalendarClient.events.list({ - calendarId: 'primary', - maxResults: 500, - syncToken: emailOrDomainToReimport ? undefined : syncToken, - pageToken: nextPageToken, - q: emailOrDomainToReimport, - showDeleted: true, - }); + const googleCalendarEvents = await googleCalendarClient.events + .list({ + calendarId: 'primary', + maxResults: 500, + syncToken: emailOrDomainToReimport ? undefined : syncToken, + pageToken: nextPageToken, + q: emailOrDomainToReimport, + showDeleted: true, + }) + .catch(async (error: GaxiosError) => { + if (error.response?.status !== 410) { + throw error; + } + + await this.calendarChannelRepository.updateSyncCursor( + null, + connectedAccountId, + workspaceId, + ); + + this.logger.log( + `Sync token is no longer valid for connected account ${connectedAccountId} in workspace ${workspaceId}, resetting sync cursor.`, + ); + + return { + data: { + items: [], + nextSyncToken: undefined, + nextPageToken: undefined, + }, + }; + }); nextSyncToken = googleCalendarEvents.data.nextSyncToken; nextPageToken = googleCalendarEvents.data.nextPageToken || undefined;