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,