diff --git a/packages/app-store/googlecalendar/lib/CalendarService.ts b/packages/app-store/googlecalendar/lib/CalendarService.ts index 60c97c4b6b..746fd4c902 100644 --- a/packages/app-store/googlecalendar/lib/CalendarService.ts +++ b/packages/app-store/googlecalendar/lib/CalendarService.ts @@ -58,7 +58,20 @@ export default class GoogleCalendarService implements Calendar { }); myGoogleAuth.setCredentials(googleCredentials); } catch (err) { - this.log.error("Error refreshing google token", err); + let message; + if (err instanceof Error) message = err.message; + else message = String(err); + // if not invalid_grant, default behaviour (which admittedly isn't great) + if (message !== "invalid_grant") return myGoogleAuth; + // when the error is invalid grant, it's unrecoverable and the credential marked invalid. + // TODO: Evaluate bubbling up and handling this in the CalendarManager. IMO this should be done + // but this is a bigger refactor. + await prisma.credential.update({ + where: { id: credential.id }, + data: { + invalid: true, + }, + }); } return myGoogleAuth; }; diff --git a/packages/core/getCalendarsEvents.ts b/packages/core/getCalendarsEvents.ts index b00bdc674d..21103a27ff 100644 --- a/packages/core/getCalendarsEvents.ts +++ b/packages/core/getCalendarsEvents.ts @@ -11,7 +11,10 @@ const getCalendarsEvents = async ( dateTo: string, selectedCalendars: SelectedCalendar[] ): Promise => { - const calendarCredentials = withCredentials.filter((credential) => credential.type.endsWith("_calendar")); + const calendarCredentials = withCredentials + .filter((credential) => credential.type.endsWith("_calendar")) + // filter out invalid credentials - these won't work. + .filter((credential) => !credential.invalid); const calendars = await Promise.all(calendarCredentials.map((credential) => getCalendar(credential))); performance.mark("getBusyCalendarTimesStart"); const results = calendars.map(async (c, i) => {