From 3024e04a1c3993e81c81cc2d8209d9992d0d5794 Mon Sep 17 00:00:00 2001 From: bosiraphael <71827178+bosiraphael@users.noreply.github.com> Date: Wed, 17 Apr 2024 13:35:23 +0200 Subject: [PATCH] 4971 add issyncenabled toggle in messaging settings (#4995) - Closes #4971 - Fix calendar import to take isSyncEnabled into account --- .../modules/accounts/types/MessageChannel.ts | 2 +- ...ettingsAccountsMessageChannelsListCard.tsx | 4 +- .../SettingsAccountsEmailsInboxSettings.tsx | 31 ++++++++- .../integrations/message-queue/jobs.module.ts | 4 +- .../constants/standard-field-ids.ts | 1 + .../commands/calendar-commands.module.ts | 2 + .../commands/google-calendar-sync.command.ts | 63 +++---------------- .../jobs/google-calendar-sync.cron.job.ts | 23 +------ .../calendar/jobs/google-calendar-sync.job.ts | 2 +- .../google-calendar-sync.module.ts | 2 +- .../google-calendar-sync.service.ts | 0 .../workspace-google-calendar-sync.module.ts | 14 +++++ .../workspace-google-calendar-sync.service.ts | 46 ++++++++++++++ .../crons/jobs/gmail-partial-sync.cron.job.ts | 33 ++++++---- ...etch-message-content-from-cache.service.ts | 7 +-- .../message-channel.object-metadata.ts | 10 +++ 16 files changed, 147 insertions(+), 97 deletions(-) rename packages/twenty-server/src/modules/calendar/services/{ => google-calendar-sync}/google-calendar-sync.module.ts (97%) rename packages/twenty-server/src/modules/calendar/services/{ => google-calendar-sync}/google-calendar-sync.service.ts (100%) create mode 100644 packages/twenty-server/src/modules/calendar/services/workspace-google-calendar-sync/workspace-google-calendar-sync.module.ts create mode 100644 packages/twenty-server/src/modules/calendar/services/workspace-google-calendar-sync/workspace-google-calendar-sync.service.ts diff --git a/packages/twenty-front/src/modules/accounts/types/MessageChannel.ts b/packages/twenty-front/src/modules/accounts/types/MessageChannel.ts index 625147e16..90f28ed78 100644 --- a/packages/twenty-front/src/modules/accounts/types/MessageChannel.ts +++ b/packages/twenty-front/src/modules/accounts/types/MessageChannel.ts @@ -4,6 +4,6 @@ export type MessageChannel = { id: string; handle: string; isContactAutoCreationEnabled?: boolean; - isSynced?: boolean; + isSyncEnabled: boolean; visibility: InboxSettingsVisibilityValue; }; diff --git a/packages/twenty-front/src/modules/settings/accounts/components/SettingsAccountsMessageChannelsListCard.tsx b/packages/twenty-front/src/modules/settings/accounts/components/SettingsAccountsMessageChannelsListCard.tsx index 010691744..1d6e6f28a 100644 --- a/packages/twenty-front/src/modules/settings/accounts/components/SettingsAccountsMessageChannelsListCard.tsx +++ b/packages/twenty-front/src/modules/settings/accounts/components/SettingsAccountsMessageChannelsListCard.tsx @@ -57,7 +57,9 @@ export const SettingsAccountsMessageChannelsListCard = () => { ...messageChannel, syncStatus: messageChannel.connectedAccount?.authFailedAt ? 'failed' - : 'synced', + : messageChannel.isSyncEnabled + ? 'synced' + : 'notSynced', }), ); diff --git a/packages/twenty-front/src/pages/settings/accounts/SettingsAccountsEmailsInboxSettings.tsx b/packages/twenty-front/src/pages/settings/accounts/SettingsAccountsEmailsInboxSettings.tsx index e7abe23c8..b1b717509 100644 --- a/packages/twenty-front/src/pages/settings/accounts/SettingsAccountsEmailsInboxSettings.tsx +++ b/packages/twenty-front/src/pages/settings/accounts/SettingsAccountsEmailsInboxSettings.tsx @@ -1,7 +1,7 @@ import { useEffect } from 'react'; import { useNavigate, useParams } from 'react-router-dom'; import { useTheme } from '@emotion/react'; -import { IconSettings, IconUser } from 'twenty-ui'; +import { IconRefresh, IconSettings, IconUser } from 'twenty-ui'; import { MessageChannel } from '@/accounts/types/MessageChannel'; import { CoreObjectNameSingular } from '@/object-metadata/types/CoreObjectNameSingular'; @@ -52,6 +52,15 @@ export const SettingsAccountsEmailsInboxSettings = () => { }); }; + const handleIsSyncEnabledToggle = (value: boolean) => { + updateOneRecord({ + idToUpdate: messageChannelId, + updateOneRecordInput: { + isSyncEnabled: value, + }, + }); + }; + useEffect(() => { if (!loading && !messageChannel) navigate(AppPath.NotFound); }, [loading, messageChannel, navigate]); @@ -68,7 +77,6 @@ export const SettingsAccountsEmailsInboxSettings = () => { { children: messageChannel.handle || '' }, ]} /> - {/* TODO : discuss the desired sync behaviour and add Synchronization section */}
{ onToggle={handleContactAutoCreationToggle} />
+
+ + + + + } + title="Sync emails" + value={!!messageChannel.isSyncEnabled} + onToggle={handleIsSyncEnabledToggle} + /> +
); diff --git a/packages/twenty-server/src/engine/integrations/message-queue/jobs.module.ts b/packages/twenty-server/src/engine/integrations/message-queue/jobs.module.ts index 843692594..8a049ec98 100644 --- a/packages/twenty-server/src/engine/integrations/message-queue/jobs.module.ts +++ b/packages/twenty-server/src/engine/integrations/message-queue/jobs.module.ts @@ -35,7 +35,8 @@ import { DeleteConnectedAccountAssociatedCalendarDataJob } from 'src/modules/cal import { GoogleCalendarSyncJob } from 'src/modules/calendar/jobs/google-calendar-sync.job'; import { CalendarEventCleanerModule } from 'src/modules/calendar/services/calendar-event-cleaner/calendar-event-cleaner.module'; import { CalendarEventParticipantModule } from 'src/modules/calendar/services/calendar-event-participant/calendar-event-participant.module'; -import { GoogleCalendarSyncModule } from 'src/modules/calendar/services/google-calendar-sync.module'; +import { GoogleCalendarSyncModule } from 'src/modules/calendar/services/google-calendar-sync/google-calendar-sync.module'; +import { WorkspaceGoogleCalendarSyncModule } from 'src/modules/calendar/services/workspace-google-calendar-sync/workspace-google-calendar-sync.module'; import { AutoCompaniesAndContactsCreationModule } from 'src/modules/connected-account/auto-companies-and-contacts-creation/auto-companies-and-contacts-creation.module'; import { CreateCompanyAndContactJob } from 'src/modules/connected-account/auto-companies-and-contacts-creation/jobs/create-company-and-contact.job'; import { GoogleAPIRefreshAccessTokenModule } from 'src/modules/connected-account/services/google-api-refresh-access-token/google-api-refresh-access-token.module'; @@ -63,6 +64,7 @@ import { MessageChannelObjectMetadata } from 'src/modules/messaging/standard-obj EnvironmentModule, HttpModule, GoogleCalendarSyncModule, + WorkspaceGoogleCalendarSyncModule, ObjectMetadataModule, StripeModule, ThreadCleanerModule, diff --git a/packages/twenty-server/src/engine/workspace-manager/workspace-sync-metadata/constants/standard-field-ids.ts b/packages/twenty-server/src/engine/workspace-manager/workspace-sync-metadata/constants/standard-field-ids.ts index f27e8f1e7..c9354a364 100644 --- a/packages/twenty-server/src/engine/workspace-manager/workspace-sync-metadata/constants/standard-field-ids.ts +++ b/packages/twenty-server/src/engine/workspace-manager/workspace-sync-metadata/constants/standard-field-ids.ts @@ -170,6 +170,7 @@ export const messageChannelStandardFieldIds = { type: '20202020-ae95-42d9-a3f1-797a2ea22122', isContactAutoCreationEnabled: '20202020-fabd-4f14-b7c6-3310f6d132c6', messageChannelMessageAssociations: '20202020-49b8-4766-88fd-75f1e21b3d5f', + isSyncEnabled: '20202020-d9a6-48e9-990b-b97fdf22e8dd', syncCursor: '20202020-79d1-41cf-b738-bcf5ed61e256', syncedAt: '20202020-263d-4c6b-ad51-137ada56f7d4', syncStatus: '20202020-56a1-4f7e-9880-a8493bb899cc', diff --git a/packages/twenty-server/src/modules/calendar/commands/calendar-commands.module.ts b/packages/twenty-server/src/modules/calendar/commands/calendar-commands.module.ts index d35fb03d3..75d0cebbd 100644 --- a/packages/twenty-server/src/modules/calendar/commands/calendar-commands.module.ts +++ b/packages/twenty-server/src/modules/calendar/commands/calendar-commands.module.ts @@ -2,6 +2,7 @@ import { Module } from '@nestjs/common'; import { ObjectMetadataRepositoryModule } from 'src/engine/object-metadata-repository/object-metadata-repository.module'; import { GoogleCalendarSyncCommand } from 'src/modules/calendar/commands/google-calendar-sync.command'; +import { WorkspaceGoogleCalendarSyncModule } from 'src/modules/calendar/services/workspace-google-calendar-sync/workspace-google-calendar-sync.module'; import { CalendarChannelObjectMetadata } from 'src/modules/calendar/standard-objects/calendar-channel.object-metadata'; import { ConnectedAccountObjectMetadata } from 'src/modules/connected-account/standard-objects/connected-account.object-metadata'; @@ -11,6 +12,7 @@ import { ConnectedAccountObjectMetadata } from 'src/modules/connected-account/st ConnectedAccountObjectMetadata, CalendarChannelObjectMetadata, ]), + WorkspaceGoogleCalendarSyncModule, ], providers: [GoogleCalendarSyncCommand], }) diff --git a/packages/twenty-server/src/modules/calendar/commands/google-calendar-sync.command.ts b/packages/twenty-server/src/modules/calendar/commands/google-calendar-sync.command.ts index fcd11fe34..f605ad742 100644 --- a/packages/twenty-server/src/modules/calendar/commands/google-calendar-sync.command.ts +++ b/packages/twenty-server/src/modules/calendar/commands/google-calendar-sync.command.ts @@ -1,18 +1,6 @@ -import { Inject } from '@nestjs/common'; - import { Command, CommandRunner, Option } from 'nest-commander'; -import { MessageQueue } from 'src/engine/integrations/message-queue/message-queue.constants'; -import { MessageQueueService } from 'src/engine/integrations/message-queue/services/message-queue.service'; -import { ConnectedAccountRepository } from 'src/modules/connected-account/repositories/connected-account.repository'; -import { - GoogleCalendarSyncJobData, - GoogleCalendarSyncJob, -} from 'src/modules/calendar/jobs/google-calendar-sync.job'; -import { InjectObjectMetadataRepository } from 'src/engine/object-metadata-repository/object-metadata-repository.decorator'; -import { ConnectedAccountObjectMetadata } from 'src/modules/connected-account/standard-objects/connected-account.object-metadata'; -import { CalendarChannelRepository } from 'src/modules/calendar/repositories/calendar-channel.repository'; -import { CalendarChannelObjectMetadata } from 'src/modules/calendar/standard-objects/calendar-channel.object-metadata'; +import { WorkspaceGoogleCalendarSyncService } from 'src/modules/calendar/services/workspace-google-calendar-sync/workspace-google-calendar-sync.service'; interface GoogleCalendarSyncOptions { workspaceId: string; @@ -25,25 +13,11 @@ interface GoogleCalendarSyncOptions { }) export class GoogleCalendarSyncCommand extends CommandRunner { constructor( - @Inject(MessageQueue.messagingQueue) - private readonly messageQueueService: MessageQueueService, - @InjectObjectMetadataRepository(ConnectedAccountObjectMetadata) - private readonly connectedAccountRepository: ConnectedAccountRepository, - @InjectObjectMetadataRepository(CalendarChannelObjectMetadata) - private readonly calendarChannelRepository: CalendarChannelRepository, + private readonly workspaceGoogleCalendarSyncService: WorkspaceGoogleCalendarSyncService, ) { super(); } - async run( - _passedParam: string[], - options: GoogleCalendarSyncOptions, - ): Promise { - await this.fetchWorkspaceCalendars(options.workspaceId); - - return; - } - @Option({ flags: '-w, --workspace-id [workspace_id]', description: 'workspace id', @@ -53,31 +27,14 @@ export class GoogleCalendarSyncCommand extends CommandRunner { return value; } - private async fetchWorkspaceCalendars(workspaceId: string): Promise { - const connectedAccounts = - await this.connectedAccountRepository.getAll(workspaceId); + async run( + _passedParam: string[], + options: GoogleCalendarSyncOptions, + ): Promise { + await this.workspaceGoogleCalendarSyncService.startWorkspaceGoogleCalendarSync( + options.workspaceId, + ); - for (const connectedAccount of connectedAccounts) { - const calendarChannel = - await this.calendarChannelRepository.getFirstByConnectedAccountId( - connectedAccount.id, - workspaceId, - ); - - if (!calendarChannel?.isSyncEnabled) { - continue; - } - - await this.messageQueueService.add( - GoogleCalendarSyncJob.name, - { - workspaceId, - connectedAccountId: connectedAccount.id, - }, - { - retryLimit: 2, - }, - ); - } + return; } } diff --git a/packages/twenty-server/src/modules/calendar/crons/jobs/google-calendar-sync.cron.job.ts b/packages/twenty-server/src/modules/calendar/crons/jobs/google-calendar-sync.cron.job.ts index 3db394f82..10930e85a 100644 --- a/packages/twenty-server/src/modules/calendar/crons/jobs/google-calendar-sync.cron.job.ts +++ b/packages/twenty-server/src/modules/calendar/crons/jobs/google-calendar-sync.cron.job.ts @@ -11,10 +11,7 @@ import { } from 'src/engine/core-modules/feature-flag/feature-flag.entity'; import { Workspace } from 'src/engine/core-modules/workspace/workspace.entity'; import { DataSourceEntity } from 'src/engine/metadata-modules/data-source/data-source.entity'; -import { InjectObjectMetadataRepository } from 'src/engine/object-metadata-repository/object-metadata-repository.decorator'; -import { CalendarChannelRepository } from 'src/modules/calendar/repositories/calendar-channel.repository'; -import { CalendarChannelObjectMetadata } from 'src/modules/calendar/standard-objects/calendar-channel.object-metadata'; -import { GoogleCalendarSyncService } from 'src/modules/calendar/services/google-calendar-sync.service'; +import { WorkspaceGoogleCalendarSyncService } from 'src/modules/calendar/services/workspace-google-calendar-sync/workspace-google-calendar-sync.service'; @Injectable() export class GoogleCalendarSyncCronJob implements MessageQueueJob { @@ -23,11 +20,9 @@ export class GoogleCalendarSyncCronJob implements MessageQueueJob { private readonly workspaceRepository: Repository, @InjectRepository(DataSourceEntity, 'metadata') private readonly dataSourceRepository: Repository, - @InjectObjectMetadataRepository(CalendarChannelObjectMetadata) - private readonly calendarChannelRepository: CalendarChannelRepository, @InjectRepository(FeatureFlagEntity, 'core') private readonly featureFlagRepository: Repository, - private readonly googleCalendarSyncService: GoogleCalendarSyncService, + private readonly workspaceGoogleCalendarSyncService: WorkspaceGoogleCalendarSyncService, ) {} async handle(): Promise { @@ -62,20 +57,8 @@ export class GoogleCalendarSyncCronJob implements MessageQueueJob { ); for (const workspaceId of workspaceIdsWithDataSources) { - await this.startWorkspaceGoogleCalendarSync(workspaceId); - } - } - - private async startWorkspaceGoogleCalendarSync( - workspaceId: string, - ): Promise { - const calendarChannels = - await this.calendarChannelRepository.getAll(workspaceId); - - for (const calendarChannel of calendarChannels) { - await this.googleCalendarSyncService.startGoogleCalendarSync( + await this.workspaceGoogleCalendarSyncService.startWorkspaceGoogleCalendarSync( workspaceId, - calendarChannel.connectedAccountId, ); } } diff --git a/packages/twenty-server/src/modules/calendar/jobs/google-calendar-sync.job.ts b/packages/twenty-server/src/modules/calendar/jobs/google-calendar-sync.job.ts index 08019f420..dd7a3362d 100644 --- a/packages/twenty-server/src/modules/calendar/jobs/google-calendar-sync.job.ts +++ b/packages/twenty-server/src/modules/calendar/jobs/google-calendar-sync.job.ts @@ -3,7 +3,7 @@ import { Injectable, Logger } from '@nestjs/common'; import { MessageQueueJob } from 'src/engine/integrations/message-queue/interfaces/message-queue-job.interface'; import { GoogleAPIRefreshAccessTokenService } from 'src/modules/connected-account/services/google-api-refresh-access-token/google-api-refresh-access-token.service'; -import { GoogleCalendarSyncService } from 'src/modules/calendar/services/google-calendar-sync.service'; +import { GoogleCalendarSyncService } from 'src/modules/calendar/services/google-calendar-sync/google-calendar-sync.service'; export type GoogleCalendarSyncJobData = { workspaceId: string; diff --git a/packages/twenty-server/src/modules/calendar/services/google-calendar-sync.module.ts b/packages/twenty-server/src/modules/calendar/services/google-calendar-sync/google-calendar-sync.module.ts similarity index 97% rename from packages/twenty-server/src/modules/calendar/services/google-calendar-sync.module.ts rename to packages/twenty-server/src/modules/calendar/services/google-calendar-sync/google-calendar-sync.module.ts index 476950ec4..0b21dc0b4 100644 --- a/packages/twenty-server/src/modules/calendar/services/google-calendar-sync.module.ts +++ b/packages/twenty-server/src/modules/calendar/services/google-calendar-sync/google-calendar-sync.module.ts @@ -6,7 +6,7 @@ import { ObjectMetadataRepositoryModule } from 'src/engine/object-metadata-repos import { WorkspaceDataSourceModule } from 'src/engine/workspace-datasource/workspace-datasource.module'; import { CalendarEventCleanerModule } from 'src/modules/calendar/services/calendar-event-cleaner/calendar-event-cleaner.module'; import { CalendarEventParticipantModule } from 'src/modules/calendar/services/calendar-event-participant/calendar-event-participant.module'; -import { GoogleCalendarSyncService } from 'src/modules/calendar/services/google-calendar-sync.service'; +import { GoogleCalendarSyncService } from 'src/modules/calendar/services/google-calendar-sync/google-calendar-sync.service'; import { CalendarProvidersModule } from 'src/modules/calendar/services/providers/calendar-providers.module'; import { CalendarChannelEventAssociationObjectMetadata } from 'src/modules/calendar/standard-objects/calendar-channel-event-association.object-metadata'; import { CalendarChannelObjectMetadata } from 'src/modules/calendar/standard-objects/calendar-channel.object-metadata'; diff --git a/packages/twenty-server/src/modules/calendar/services/google-calendar-sync.service.ts b/packages/twenty-server/src/modules/calendar/services/google-calendar-sync/google-calendar-sync.service.ts similarity index 100% rename from packages/twenty-server/src/modules/calendar/services/google-calendar-sync.service.ts rename to packages/twenty-server/src/modules/calendar/services/google-calendar-sync/google-calendar-sync.service.ts diff --git a/packages/twenty-server/src/modules/calendar/services/workspace-google-calendar-sync/workspace-google-calendar-sync.module.ts b/packages/twenty-server/src/modules/calendar/services/workspace-google-calendar-sync/workspace-google-calendar-sync.module.ts new file mode 100644 index 000000000..d7fc7c145 --- /dev/null +++ b/packages/twenty-server/src/modules/calendar/services/workspace-google-calendar-sync/workspace-google-calendar-sync.module.ts @@ -0,0 +1,14 @@ +import { Module } from '@nestjs/common'; + +import { ObjectMetadataRepositoryModule } from 'src/engine/object-metadata-repository/object-metadata-repository.module'; +import { WorkspaceGoogleCalendarSyncService } from 'src/modules/calendar/services/workspace-google-calendar-sync/workspace-google-calendar-sync.service'; +import { CalendarChannelObjectMetadata } from 'src/modules/calendar/standard-objects/calendar-channel.object-metadata'; + +@Module({ + imports: [ + ObjectMetadataRepositoryModule.forFeature([CalendarChannelObjectMetadata]), + ], + providers: [WorkspaceGoogleCalendarSyncService], + exports: [WorkspaceGoogleCalendarSyncService], +}) +export class WorkspaceGoogleCalendarSyncModule {} diff --git a/packages/twenty-server/src/modules/calendar/services/workspace-google-calendar-sync/workspace-google-calendar-sync.service.ts b/packages/twenty-server/src/modules/calendar/services/workspace-google-calendar-sync/workspace-google-calendar-sync.service.ts new file mode 100644 index 000000000..641eff9f9 --- /dev/null +++ b/packages/twenty-server/src/modules/calendar/services/workspace-google-calendar-sync/workspace-google-calendar-sync.service.ts @@ -0,0 +1,46 @@ +import { Injectable } from '@nestjs/common'; + +import { InjectMessageQueue } from 'src/engine/integrations/message-queue/decorators/message-queue.decorator'; +import { MessageQueue } from 'src/engine/integrations/message-queue/message-queue.constants'; +import { MessageQueueService } from 'src/engine/integrations/message-queue/services/message-queue.service'; +import { InjectObjectMetadataRepository } from 'src/engine/object-metadata-repository/object-metadata-repository.decorator'; +import { + GoogleCalendarSyncJobData, + GoogleCalendarSyncJob, +} from 'src/modules/calendar/jobs/google-calendar-sync.job'; +import { CalendarChannelRepository } from 'src/modules/calendar/repositories/calendar-channel.repository'; +import { CalendarChannelObjectMetadata } from 'src/modules/calendar/standard-objects/calendar-channel.object-metadata'; + +@Injectable() +export class WorkspaceGoogleCalendarSyncService { + constructor( + @InjectObjectMetadataRepository(CalendarChannelObjectMetadata) + private readonly calendarChannelRepository: CalendarChannelRepository, + @InjectMessageQueue(MessageQueue.calendarQueue) + private readonly messageQueueService: MessageQueueService, + ) {} + + public async startWorkspaceGoogleCalendarSync( + workspaceId: string, + ): Promise { + const calendarChannels = + await this.calendarChannelRepository.getAll(workspaceId); + + for (const calendarChannel of calendarChannels) { + if (!calendarChannel?.isSyncEnabled) { + continue; + } + + await this.messageQueueService.add( + GoogleCalendarSyncJob.name, + { + workspaceId, + connectedAccountId: calendarChannel.connectedAccountId, + }, + { + retryLimit: 2, + }, + ); + } + } +} diff --git a/packages/twenty-server/src/modules/messaging/crons/jobs/gmail-partial-sync.cron.job.ts b/packages/twenty-server/src/modules/messaging/crons/jobs/gmail-partial-sync.cron.job.ts index 03b09c3ec..2d6434d40 100644 --- a/packages/twenty-server/src/modules/messaging/crons/jobs/gmail-partial-sync.cron.job.ts +++ b/packages/twenty-server/src/modules/messaging/crons/jobs/gmail-partial-sync.cron.job.ts @@ -5,17 +5,17 @@ import { Repository, In } from 'typeorm'; import { MessageQueueJob } from 'src/engine/integrations/message-queue/interfaces/message-queue-job.interface'; -import { MessageQueue } from 'src/engine/integrations/message-queue/message-queue.constants'; -import { MessageQueueService } from 'src/engine/integrations/message-queue/services/message-queue.service'; -import { ConnectedAccountRepository } from 'src/modules/connected-account/repositories/connected-account.repository'; import { Workspace } from 'src/engine/core-modules/workspace/workspace.entity'; import { DataSourceEntity } from 'src/engine/metadata-modules/data-source/data-source.entity'; -import { InjectObjectMetadataRepository } from 'src/engine/object-metadata-repository/object-metadata-repository.decorator'; -import { ConnectedAccountObjectMetadata } from 'src/modules/connected-account/standard-objects/connected-account.object-metadata'; import { - GmailPartialSyncJob as GmailPartialSyncJob, - GmailPartialSyncJobData as GmailPartialSyncJobData, + GmailPartialSyncJobData, + GmailPartialSyncJob, } from 'src/modules/messaging/jobs/gmail-partial-sync.job'; +import { MessageQueue } from 'src/engine/integrations/message-queue/message-queue.constants'; +import { MessageQueueService } from 'src/engine/integrations/message-queue/services/message-queue.service'; +import { InjectObjectMetadataRepository } from 'src/engine/object-metadata-repository/object-metadata-repository.decorator'; +import { MessageChannelRepository } from 'src/modules/messaging/repositories/message-channel.repository'; +import { MessageChannelObjectMetadata } from 'src/modules/messaging/standard-objects/message-channel.object-metadata'; @Injectable() export class GmailPartialSyncCronJob implements MessageQueueJob { @@ -28,8 +28,8 @@ export class GmailPartialSyncCronJob implements MessageQueueJob { private readonly dataSourceRepository: Repository, @Inject(MessageQueue.messagingQueue) private readonly messageQueueService: MessageQueueService, - @InjectObjectMetadataRepository(ConnectedAccountObjectMetadata) - private readonly connectedAccountRepository: ConnectedAccountRepository, + @InjectObjectMetadataRepository(MessageChannelObjectMetadata) + private readonly messageChannelRepository: MessageChannelRepository, ) {} async handle(): Promise { @@ -59,15 +59,22 @@ export class GmailPartialSyncCronJob implements MessageQueueJob { private async enqueuePartialSyncs(workspaceId: string): Promise { try { - const connectedAccounts = - await this.connectedAccountRepository.getAll(workspaceId); + const messageChannels = + await this.messageChannelRepository.getAll(workspaceId); + + for (const messageChannel of messageChannels) { + if (!messageChannel?.isSyncEnabled) { + continue; + } - for (const connectedAccount of connectedAccounts) { await this.messageQueueService.add( GmailPartialSyncJob.name, { workspaceId, - connectedAccountId: connectedAccount.id, + connectedAccountId: messageChannel.connectedAccountId, + }, + { + retryLimit: 2, }, ); } diff --git a/packages/twenty-server/src/modules/messaging/services/gmail-fetch-message-content-from-cache/gmail-fetch-message-content-from-cache.service.ts b/packages/twenty-server/src/modules/messaging/services/gmail-fetch-message-content-from-cache/gmail-fetch-message-content-from-cache.service.ts index 21614a8a9..8a3f06555 100644 --- a/packages/twenty-server/src/modules/messaging/services/gmail-fetch-message-content-from-cache/gmail-fetch-message-content-from-cache.service.ts +++ b/packages/twenty-server/src/modules/messaging/services/gmail-fetch-message-content-from-cache/gmail-fetch-message-content-from-cache.service.ts @@ -63,7 +63,9 @@ export class GmailFetchMessageContentFromCacheService { return; } - if (connectedAccount.authFailedAt) { + const { accessToken, refreshToken, authFailedAt } = connectedAccount; + + if (authFailedAt) { this.logger.error( `Connected account ${connectedAccountId} in workspace ${workspaceId} is in a failed state. Skipping...`, ); @@ -71,9 +73,6 @@ export class GmailFetchMessageContentFromCacheService { return; } - const accessToken = connectedAccount.accessToken; - const refreshToken = connectedAccount.refreshToken; - if (!refreshToken) { throw new Error( `No refresh token found for connected account ${connectedAccountId} in workspace ${workspaceId}`, diff --git a/packages/twenty-server/src/modules/messaging/standard-objects/message-channel.object-metadata.ts b/packages/twenty-server/src/modules/messaging/standard-objects/message-channel.object-metadata.ts index 855ff0802..dffc9c086 100644 --- a/packages/twenty-server/src/modules/messaging/standard-objects/message-channel.object-metadata.ts +++ b/packages/twenty-server/src/modules/messaging/standard-objects/message-channel.object-metadata.ts @@ -127,6 +127,16 @@ export class MessageChannelObjectMetadata extends BaseObjectMetadata { }) isContactAutoCreationEnabled: boolean; + @FieldMetadata({ + standardId: messageChannelStandardFieldIds.isSyncEnabled, + type: FieldMetadataType.BOOLEAN, + label: 'Is Sync Enabled', + description: 'Is Sync Enabled', + icon: 'IconRefresh', + defaultValue: true, + }) + isSyncEnabled: boolean; + @FieldMetadata({ standardId: messageChannelStandardFieldIds.messageChannelMessageAssociations,